请问怎样在VC下直接对硬盘的扇区读写,请详细说明一下!谢谢!

解决方案 »

  1.   

    这个问题太大了,还是看MSDN吧,DeviceIoControl
    我给你一个NT下读写分区表的吧。
    /* The code of interest is in the subroutine GetDriveGeometry. The 
       code in main shows how to interpret the results of the IOCTL call. */#include <windows.h>
    #include <winioctl.h>
    #include <stdio.h>BOOL
    ReadMBR()
    {
      HANDLE hDevice;               // handle to the drive to be examined 
      BOOL bResult;                 // results flag
      DWORD junk;                   // discard results
    //  DISK_GEOMETRY Geometry;
      char MBRBuf[512];
      
      hDevice = CreateFile("\\\\.\\PHYSICALDRIVE0", // drive to open
                           GENERIC_READ,       // for read 
                           FILE_SHARE_READ | FILE_SHARE_WRITE,  // share mode
                           NULL,    // default security attributes
                           OPEN_EXISTING,  // disposition
                           0,       // file attributes
                           NULL);   // don't copy any file's attributes  if (hDevice == INVALID_HANDLE_VALUE) // we can't open the drive
      {
        MessageBox(NULL,"Open Hard Disk ERROR.",NULL,MB_OK);
        return (FALSE);
      }
      
      bResult=ReadFile(hDevice,MBRBuf,512,&junk,NULL);
      if (bResult==FALSE || junk<512)
      {
         MessageBox(NULL,"Read MBR ERROR.",NULL,MB_OK);
         return FALSE;
      }
      CloseHandle(hDevice);
      for(int i=0;i<512;i++)
      {
        if(i%16==0)
        {
          printf("%04X: ",i);
        }
        printf("%02X ",(unsigned char)MBRBuf[i]);
        if(i%16==15)
        {
          printf("\n");
        }
        
      }
      
      return TRUE;
      
    }BOOL
    GetDriveGeometry(DISK_GEOMETRY *pdg)
    {
      HANDLE hDevice;               // handle to the drive to be examined 
      BOOL bResult;                 // results flag
      DWORD junk;                   // discard results  hDevice = CreateFile("\\\\.\\PHYSICALDRIVE0", // drive to open
                           0,       // don't need any access to the drive
                           FILE_SHARE_READ | FILE_SHARE_WRITE,  // share mode
                           NULL,    // default security attributes
                           OPEN_EXISTING,  // disposition
                           0,       // file attributes
                           NULL);   // don't copy any file's attributes  if (hDevice == INVALID_HANDLE_VALUE) // we can't open the drive
      {
        return (FALSE);
      }  bResult = DeviceIoControl(hDevice,  // device we are querying
          IOCTL_DISK_GET_DRIVE_GEOMETRY,  // operation to perform
                                 NULL, 0, // no input buffer, so pass zero
                                pdg, sizeof(*pdg),  // output buffer
                                &junk, // discard count of bytes returned
                                (LPOVERLAPPED) NULL);  // synchronous I/O  CloseHandle(hDevice);         // we're done with the handle  return (bResult);
    }int
    main(int argc, char *argv[])
    {
      DISK_GEOMETRY pdg;            // disk drive geometry structure
      BOOL bResult;                 // generic results flag
      ULONGLONG DiskSize;           // size of the drive, in bytes
      DWORD BytesRead;
    #if 0  
      bResult = GetDriveGeometry (&pdg);  if (bResult) 
      {
        printf("Cylinders = %I64d\n", pdg.Cylinders);
        printf("Tracks per cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);
        printf("Sectors per track = %ld\n", (ULONG) pdg.SectorsPerTrack);
        printf("Bytes per sector = %ld\n", (ULONG) pdg.BytesPerSector);    DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
          (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
        printf("Disk size = %I64d (Bytes) = %12.2f (Mb)\n", DiskSize,
               DiskSize / 1024. / 1024.);
      } else {
        printf ("Attempt to get drive geometry failed. Error %ld.\n",
                GetLastError ());
      }
    #endif
      printf("\n----------MBR----------\n\n");  ReadMBR();
      return ((int)bResult);
    }
      

  2.   

    http://www.pconline.com.cn/pcedu/empolder/gj/vc/10208/80809.html