nt4_dev.c
上传用户:hy_wanghao
上传日期:2007-01-08
资源大小:279k
文件大小:3k
源码类别:

Shell编程

开发平台:

Visual C++

  1. /* nt4_dev.c - routines for direct drive access in Windows NT 4.0
  2.  *
  3.  * Copyright 1999 by Dan Sutherland <dan@chromerhino.demon.co.uk>
  4.  *
  5.  * These routines only currently work with drives <2GB and 512 bytes per sector
  6.  */
  7. #include <windows.h>
  8. #include <winioctl.h>
  9. #include <stdio.h>
  10. #include "nt4_dev.h"
  11. HANDLE NT4OpenDrive(char *lpstrDrive)
  12. {
  13. char strDriveFile[40];
  14. HANDLE hDrv;
  15. DWORD dwRet;
  16. switch (lpstrDrive[0]) {
  17. case 'H':
  18. sprintf(strDriveFile, "\\.\PhysicalDrive%c", lpstrDrive[1]);
  19. break;
  20. /* add support for other device types here */
  21. default:
  22. return NULL;
  23. }
  24. hDrv = CreateFile(strDriveFile, GENERIC_READ | GENERIC_WRITE,
  25. FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
  26. 0, NULL);
  27. if (hDrv == INVALID_HANDLE_VALUE)
  28. return NULL;
  29. if (! DeviceIoControl(hDrv, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0,
  30. &dwRet, NULL))
  31. return NULL;
  32. return hDrv;
  33. }
  34. BOOL NT4CloseDrive(HANDLE hDrv)
  35. {
  36. DWORD dwRet;
  37. if (! DeviceIoControl(hDrv, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0,
  38. &dwRet, NULL))
  39. return FALSE;
  40. if (! CloseHandle(hDrv))
  41. return FALSE;
  42. return TRUE;
  43. }
  44. BOOL NT4ReadSector(HANDLE hDrv, long iSect, int iSize, void *lpvoidBuf)
  45. {
  46. void *lpvoidTempBuf;
  47. DWORD dwActual;
  48. lpvoidTempBuf = VirtualAlloc(NULL, 512, MEM_COMMIT, PAGE_READWRITE);
  49. if (SetFilePointer(hDrv, iSect * 512, NULL, FILE_BEGIN) == 0xFFFFFFFF) {
  50. VirtualFree(lpvoidTempBuf, 0, MEM_RELEASE);
  51. return FALSE;
  52. }
  53. if (! ReadFile(hDrv, lpvoidTempBuf, 512, &dwActual, NULL)) {
  54. VirtualFree(lpvoidTempBuf, 0, MEM_RELEASE);
  55. return FALSE;
  56. }
  57. memcpy(lpvoidBuf, lpvoidTempBuf, iSize);
  58. VirtualFree(lpvoidTempBuf, 0, MEM_RELEASE);
  59. return TRUE;
  60. }
  61. BOOL NT4WriteSector(HANDLE hDrv, long iSect, int iSize, void *lpvoidBuf)
  62. {
  63. void *lpvoidTempBuf;
  64. DWORD dwActual;
  65. if (iSize != 512)
  66. return FALSE;
  67. lpvoidTempBuf = VirtualAlloc(NULL, 512, MEM_COMMIT, PAGE_READWRITE);
  68. if (SetFilePointer(hDrv, iSect * 512, NULL, FILE_BEGIN) == 0xFFFFFFFF) {
  69. VirtualFree(lpvoidTempBuf, 0, MEM_RELEASE);
  70. return FALSE;
  71. }
  72. memcpy(lpvoidTempBuf, lpvoidBuf, iSize);
  73. if (! WriteFile(hDrv, lpvoidTempBuf, 512, &dwActual, NULL)) {
  74. VirtualFree(lpvoidTempBuf, 0, MEM_RELEASE);
  75. return FALSE;
  76. }
  77. VirtualFree(lpvoidTempBuf, 0, MEM_RELEASE);
  78. return TRUE;
  79. }
  80. ULONG NT4GetDriveSize(HANDLE hDrv)
  81. {
  82. DWORD dwActual;
  83. DISK_GEOMETRY dgGeom;
  84. long size;
  85. DeviceIoControl(hDrv, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0,
  86. &dgGeom, sizeof(DISK_GEOMETRY), &dwActual, NULL);
  87. size =  dgGeom.Cylinders.LowPart * dgGeom.TracksPerCylinder *
  88. dgGeom.SectorsPerTrack * dgGeom.BytesPerSector;
  89. printf("Total sectors: %in", dgGeom.Cylinders.LowPart * dgGeom.TracksPerCylinder * dgGeom.SectorsPerTrack);
  90. printf("Byte size: %in", size);
  91. return size;
  92. }