Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

268 lines
7.4 KiB

  1. /*
  2. DoUtil.c
  3. Contains "wrappers" for various work routines, which do TWO things:
  4. A. Make the semantics friendly the calling program.
  5. B. Make it easy to move from Win2k to some emulator to a real EFI box.
  6. */
  7. #include "diskpart.h"
  8. INTN AllocCount = 0;
  9. UINT32
  10. GetBlockSize(
  11. EFI_HANDLE Handle
  12. )
  13. /*
  14. Return the size, in bytes, of a block. Handle is presumed to
  15. point to a device supporting Block IO protocol.
  16. return's 0 if some error.
  17. */
  18. {
  19. EFI_BLOCK_IO *BlkIo;
  20. status = BS->HandleProtocol(Handle, &BlockIoProtocol, &BlkIo);
  21. if (EFI_ERROR(status)) {
  22. return 0;
  23. }
  24. return (BlkIo->Media->BlockSize);
  25. }
  26. UINT64
  27. GetDiskSize(
  28. EFI_HANDLE Handle
  29. )
  30. /*
  31. Return the size, in blocks, of a spindle. Note that if we return X,
  32. this means there are blocks with LBAs = 0...(X-1)
  33. return 0 if some error
  34. */
  35. {
  36. EFI_BLOCK_IO *BlkIo;
  37. status = BS->HandleProtocol(Handle, &BlockIoProtocol, &BlkIo);
  38. if (EFI_ERROR(status)) {
  39. return 0;
  40. }
  41. return (BlkIo->Media->LastBlock+1);
  42. }
  43. VOID
  44. DoFree(
  45. VOID *Buffer
  46. )
  47. /*
  48. If and only if Buffer != NULL, free it.
  49. If Buffer == NULL, do nothing and return
  50. */
  51. {
  52. if (Buffer) {
  53. FreePool(Buffer);
  54. AllocCount--;
  55. }
  56. return;
  57. }
  58. VOID *
  59. DoAllocate(
  60. UINTN Size
  61. )
  62. /*
  63. Just allocate at least Size bytes from some heap,
  64. return pointer. return NULL if failure
  65. */
  66. {
  67. VOID *v;
  68. v = AllocatePool(Size);
  69. if (v) {
  70. AllocCount++;
  71. }
  72. return v;
  73. }
  74. //
  75. // One source quotes this table as being from Dr Dobbs 1992.
  76. // Others say other things
  77. //
  78. UINT32 CRCHelpTable[256] = {
  79. 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
  80. 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
  81. 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,
  82. 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
  83. 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
  84. 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
  85. 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,
  86. 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
  87. 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
  88. 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
  89. 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,
  90. 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
  91. 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
  92. 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
  93. 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
  94. 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
  95. 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
  96. 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
  97. 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,
  98. 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
  99. 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
  100. 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
  101. 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,
  102. 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
  103. 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
  104. 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
  105. 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,
  106. 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
  107. 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
  108. 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
  109. 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
  110. 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
  111. 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
  112. 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
  113. 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
  114. 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
  115. 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
  116. 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
  117. 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,
  118. 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
  119. 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
  120. 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
  121. 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
  122. };
  123. UINT32
  124. GetCRC32(
  125. UINT8 *Buffer,
  126. UINT32 Length
  127. )
  128. /*
  129. Compute a CRC for the Buffer data for Length bytes.
  130. Remember to zero out any CRC fields included in the Buffer
  131. and to restore them afterwards.
  132. */
  133. {
  134. UINT32 Crc,i;
  135. Crc = 0xffffffffL;
  136. for (i = 0; i < Length; i++) {
  137. Crc = CRCHelpTable [(Crc ^ Buffer [ i ]) & 0xff] ^ (Crc >> 8);
  138. }
  139. return (Crc ^ 0xffffffffL);
  140. }
  141. EFI_GUID
  142. GetGUID()
  143. /*
  144. Return a GUID.
  145. */
  146. {
  147. EFI_GUID Guid;
  148. CHAR16 Buffer[10];
  149. if (DebugLevel >= DEBUG_OPPROMPT) {
  150. Input(L"\nCreate = Enter to Continue\n", Buffer, 10);
  151. }
  152. InitGuid();
  153. CreateGuid(&Guid);
  154. if (DebugLevel >= DEBUG_OPPROMPT) {
  155. Input(L"\nCreate = Enter to Continue\n", Buffer, 10);
  156. }
  157. return (Guid);
  158. // return NullGuid; // WORK WORK!!!
  159. }
  160. EFI_STATUS
  161. WriteBlock(
  162. EFI_HANDLE DiskHandle,
  163. VOID *Buffer,
  164. UINT64 BlockAddress,
  165. UINT32 Size
  166. )
  167. /*
  168. WriteBlock - wrapper routine
  169. Write Size bytes from Buffer to DiskHandle at Block BlockAddress
  170. */
  171. {
  172. EFI_BLOCK_IO *BlkIo = NULL;
  173. EFI_DISK_IO *DiskIo = NULL;
  174. BS->HandleProtocol(DiskHandle, &BlockIoProtocol, &BlkIo);
  175. BS->HandleProtocol(DiskHandle, &DiskIoProtocol, &DiskIo);
  176. status = DiskIo->WriteDisk(
  177. DiskIo,
  178. BlkIo->Media->MediaId,
  179. MultU64x32 (BlockAddress, BlkIo->Media->BlockSize),
  180. Size,
  181. Buffer
  182. );
  183. return status;
  184. }
  185. EFI_STATUS
  186. ReadBlock(
  187. EFI_HANDLE DiskHandle,
  188. VOID *Buffer,
  189. UINT64 BlockAddress,
  190. UINT32 Size
  191. )
  192. /*
  193. ReadBlock - wrapper routine.
  194. Caller is presumed to know the BlockSize and number of blocks
  195. on the device.
  196. Read Size bytes from BlockAddress of DiskHandle into buffer.
  197. Buffer had better be big enough.
  198. */
  199. {
  200. EFI_DISK_IO *DiskIo = NULL;
  201. EFI_BLOCK_IO *BlkIo = NULL;
  202. BS->HandleProtocol(DiskHandle, &BlockIoProtocol, &BlkIo);
  203. BS->HandleProtocol(DiskHandle, &DiskIoProtocol, &DiskIo);
  204. status = DiskIo->ReadDisk(
  205. DiskIo,
  206. BlkIo->Media->MediaId,
  207. MultU64x32 (BlockAddress, BlkIo->Media->BlockSize),
  208. Size,
  209. Buffer
  210. );
  211. return status;
  212. }
  213. EFI_STATUS
  214. FlushBlock(
  215. EFI_HANDLE DiskHandle
  216. )
  217. /*
  218. FlushBlock - force anything we've written to make it onto the platter
  219. */
  220. {
  221. EFI_BLOCK_IO *BlkIo = NULL;
  222. BS->HandleProtocol(DiskHandle, &BlockIoProtocol, &BlkIo);
  223. return BlkIo->FlushBlocks(BlkIo);
  224. }