windows-nt/Source/XPSP1/NT/base/efiutil/diskpart/doutil.c
2020-09-26 16:20:57 +08:00

269 lines
7.4 KiB
C

/*
DoUtil.c
Contains "wrappers" for various work routines, which do TWO things:
A. Make the semantics friendly the calling program.
B. Make it easy to move from Win2k to some emulator to a real EFI box.
*/
#include "diskpart.h"
INTN AllocCount = 0;
UINT32
GetBlockSize(
EFI_HANDLE Handle
)
/*
Return the size, in bytes, of a block. Handle is presumed to
point to a device supporting Block IO protocol.
return's 0 if some error.
*/
{
EFI_BLOCK_IO *BlkIo;
status = BS->HandleProtocol(Handle, &BlockIoProtocol, &BlkIo);
if (EFI_ERROR(status)) {
return 0;
}
return (BlkIo->Media->BlockSize);
}
UINT64
GetDiskSize(
EFI_HANDLE Handle
)
/*
Return the size, in blocks, of a spindle. Note that if we return X,
this means there are blocks with LBAs = 0...(X-1)
return 0 if some error
*/
{
EFI_BLOCK_IO *BlkIo;
status = BS->HandleProtocol(Handle, &BlockIoProtocol, &BlkIo);
if (EFI_ERROR(status)) {
return 0;
}
return (BlkIo->Media->LastBlock+1);
}
VOID
DoFree(
VOID *Buffer
)
/*
If and only if Buffer != NULL, free it.
If Buffer == NULL, do nothing and return
*/
{
if (Buffer) {
FreePool(Buffer);
AllocCount--;
}
return;
}
VOID *
DoAllocate(
UINTN Size
)
/*
Just allocate at least Size bytes from some heap,
return pointer. return NULL if failure
*/
{
VOID *v;
v = AllocatePool(Size);
if (v) {
AllocCount++;
}
return v;
}
//
// One source quotes this table as being from Dr Dobbs 1992.
// Others say other things
//
UINT32 CRCHelpTable[256] = {
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,
0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,
0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,
0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,
0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,
0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,
0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,
0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
};
UINT32
GetCRC32(
UINT8 *Buffer,
UINT32 Length
)
/*
Compute a CRC for the Buffer data for Length bytes.
Remember to zero out any CRC fields included in the Buffer
and to restore them afterwards.
*/
{
UINT32 Crc,i;
Crc = 0xffffffffL;
for (i = 0; i < Length; i++) {
Crc = CRCHelpTable [(Crc ^ Buffer [ i ]) & 0xff] ^ (Crc >> 8);
}
return (Crc ^ 0xffffffffL);
}
EFI_GUID
GetGUID()
/*
Return a GUID.
*/
{
EFI_GUID Guid;
CHAR16 Buffer[10];
if (DebugLevel >= DEBUG_OPPROMPT) {
Input(L"\nCreate = Enter to Continue\n", Buffer, 10);
}
InitGuid();
CreateGuid(&Guid);
if (DebugLevel >= DEBUG_OPPROMPT) {
Input(L"\nCreate = Enter to Continue\n", Buffer, 10);
}
return (Guid);
// return NullGuid; // WORK WORK!!!
}
EFI_STATUS
WriteBlock(
EFI_HANDLE DiskHandle,
VOID *Buffer,
UINT64 BlockAddress,
UINT32 Size
)
/*
WriteBlock - wrapper routine
Write Size bytes from Buffer to DiskHandle at Block BlockAddress
*/
{
EFI_BLOCK_IO *BlkIo = NULL;
EFI_DISK_IO *DiskIo = NULL;
BS->HandleProtocol(DiskHandle, &BlockIoProtocol, &BlkIo);
BS->HandleProtocol(DiskHandle, &DiskIoProtocol, &DiskIo);
status = DiskIo->WriteDisk(
DiskIo,
BlkIo->Media->MediaId,
MultU64x32 (BlockAddress, BlkIo->Media->BlockSize),
Size,
Buffer
);
return status;
}
EFI_STATUS
ReadBlock(
EFI_HANDLE DiskHandle,
VOID *Buffer,
UINT64 BlockAddress,
UINT32 Size
)
/*
ReadBlock - wrapper routine.
Caller is presumed to know the BlockSize and number of blocks
on the device.
Read Size bytes from BlockAddress of DiskHandle into buffer.
Buffer had better be big enough.
*/
{
EFI_DISK_IO *DiskIo = NULL;
EFI_BLOCK_IO *BlkIo = NULL;
BS->HandleProtocol(DiskHandle, &BlockIoProtocol, &BlkIo);
BS->HandleProtocol(DiskHandle, &DiskIoProtocol, &DiskIo);
status = DiskIo->ReadDisk(
DiskIo,
BlkIo->Media->MediaId,
MultU64x32 (BlockAddress, BlkIo->Media->BlockSize),
Size,
Buffer
);
return status;
}
EFI_STATUS
FlushBlock(
EFI_HANDLE DiskHandle
)
/*
FlushBlock - force anything we've written to make it onto the platter
*/
{
EFI_BLOCK_IO *BlkIo = NULL;
BS->HandleProtocol(DiskHandle, &BlockIoProtocol, &BlkIo);
return BlkIo->FlushBlocks(BlkIo);
}