| 2572 | */ |
| 2573 | |
| 2574 | bool FileStream_GetBitmap(TFileStream * pStream, void * pvBitmap, DWORD cbBitmap, DWORD * pcbLengthNeeded) |
| 2575 | { |
| 2576 | TStreamBitmap * pBitmap = (TStreamBitmap *)pvBitmap; |
| 2577 | TBlockStream * pBlockStream = (TBlockStream *)pStream; |
| 2578 | ULONGLONG BlockOffset; |
| 2579 | LPBYTE Bitmap = (LPBYTE)(pBitmap + 1); |
| 2580 | DWORD BitmapSize; |
| 2581 | DWORD BlockCount; |
| 2582 | DWORD BlockSize; |
| 2583 | bool bResult = false; |
| 2584 | |
| 2585 | // Retrieve the size of one block |
| 2586 | if(pStream->BlockCheck != NULL) |
| 2587 | { |
| 2588 | BlockCount = pBlockStream->BlockCount; |
| 2589 | BlockSize = pBlockStream->BlockSize; |
| 2590 | } |
| 2591 | else |
| 2592 | { |
| 2593 | BlockCount = (DWORD)((pStream->StreamSize + DEFAULT_BLOCK_SIZE - 1) / DEFAULT_BLOCK_SIZE); |
| 2594 | BlockSize = DEFAULT_BLOCK_SIZE; |
| 2595 | } |
| 2596 | |
| 2597 | // Fill-in the variables |
| 2598 | BitmapSize = (BlockCount + 7) / 8; |
| 2599 | |
| 2600 | // Give the number of blocks |
| 2601 | if(pcbLengthNeeded != NULL) |
| 2602 | pcbLengthNeeded[0] = sizeof(TStreamBitmap) + BitmapSize; |
| 2603 | |
| 2604 | // If the length of the buffer is not enough |
| 2605 | if(pvBitmap != NULL && cbBitmap != 0) |
| 2606 | { |
| 2607 | // Give the STREAM_BLOCK_MAP structure |
| 2608 | if(cbBitmap >= sizeof(TStreamBitmap)) |
| 2609 | { |
| 2610 | pBitmap->StreamSize = pStream->StreamSize; |
| 2611 | pBitmap->BitmapSize = BitmapSize; |
| 2612 | pBitmap->BlockCount = BlockCount; |
| 2613 | pBitmap->BlockSize = BlockSize; |
| 2614 | pBitmap->IsComplete = (pStream->BlockCheck != NULL) ? pBlockStream->IsComplete : 1; |
| 2615 | bResult = true; |
| 2616 | } |
| 2617 | |
| 2618 | // Give the block bitmap, if enough space |
| 2619 | if(cbBitmap >= sizeof(TStreamBitmap) + BitmapSize) |
| 2620 | { |
| 2621 | // Version with bitmap present |
| 2622 | if(pStream->BlockCheck != NULL) |
| 2623 | { |
| 2624 | DWORD ByteIndex = 0; |
| 2625 | BYTE BitMask = 0x01; |
| 2626 | |
| 2627 | // Initialize the map with zeros |
| 2628 | memset(Bitmap, 0, BitmapSize); |
| 2629 | |
| 2630 | // Fill the map |
| 2631 | for(BlockOffset = 0; BlockOffset < pStream->StreamSize; BlockOffset += BlockSize) |
no test coverage detected