MBR的读取

来源:互联网 发布:淘宝中权重是什么意思 编辑:程序博客网 时间:2024/05/21 17:58
  1. void  CKillScriptDlg::ReadMBR(BYTE* pMBR, UINT nLen)     
  2. {     
  3.     HANDLE   hDevice;        
  4.     LPSTR   szBuff = NULL;     
  5.     DISK_GEOMETRY   Geometry = {0};     
  6.     BOOL   bRet;     
  7.     DWORD  bytes = 0,bread = 0,count = 0;     
  8.     int    i = 0;     
  9.        
  10.     hDevice   =   CreateFileA( "////.//PHYSICALDRIVE0",     
  11.         GENERIC_READ | GENERIC_WRITE,    
  12.         FILE_SHARE_READ | FILE_SHARE_WRITE,     
  13.         NULL, OPEN_EXISTING, 0, NULL );     
  14.     if (hDevice == INVALID_HANDLE_VALUE)     
  15.     {     
  16.         MessageBoxA(NULL,"打开设备出错",NULL,MB_OK);     
  17.         return;     
  18.     }
  19.     // Lock volume for read operation
  20.     bRet = DeviceIoControl(hDevice,
  21.                     FSCTL_LOCK_VOLUME,
  22.                     NULL, 0,
  23.                     NULL, 0,
  24.                     &count,    NULL); 
  25.     if(!bRet)
  26.     {
  27.         CloseHandle(hDevice);
  28.         return;
  29.     }
  30.     bRet = DeviceIoControl(hDevice, 
  31.                     IOCTL_DISK_GET_DRIVE_GEOMETRY, 
  32.                     NULL, 0, 
  33.                     &Geometry,
  34.                     sizeof(DISK_GEOMETRY),
  35.                     &count,NULL);
  36.     if(!bRet)
  37.     {
  38.         goto END;
  39.     }
  40.     szBuff = (LPSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Geometry.BytesPerSector);     
  41.     if( szBuff == NULL)     
  42.     {
  43.         MessageBoxA(NULL,"分配内存出错",NULL,MB_OK);     
  44.         goto END;
  45.     }
  46.     bytes = 512;     
  47.     bRet = ReadFile(hDevice, szBuff, bytes, &bread, NULL);     
  48.     if (bRet == FALSE || bread<512)     
  49.     {     
  50.         MessageBoxA(NULL,"读MBR出错",NULL,MB_OK);     
  51.         goto END;   
  52.     }     
  53.     for(int n=0; n<512; n++)
  54.     {
  55.         pMBR[n] = szBuff[n];   
  56.     }
  57. END:
  58.     //unlock volume
  59.     DeviceIoControl(hDevice, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, &count,NULL);
  60.     CloseHandle(hDevice);     
  61. }
 
原创粉丝点击