有没有朋友有关于
获取硬盘物理序列号的代码的,
在vista系统下也能正确获取的。
有的请发我邮箱,[email protected]
谢了。。

解决方案 »

  1.   

    获取的操作就在这个函数里
    int ReadPhysicalDriveInNTUsingSmart (void)
    {
       int done = FALSE;
       int drive = 0;   for (drive = 0; drive < MAX_IDE_DRIVES; drive++)
       {
          HANDLE hPhysicalDriveIOCTL = 0;
          char driveName [256];      sprintf (driveName, "\\\\.\\PhysicalDrive%d", drive);
          //  Windows NT, Windows 2000, Windows Server 2003, Vista
          hPhysicalDriveIOCTL = CreateFile (driveName,
                                   GENERIC_WRITE  | GENERIC_READ,
                                   FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, 
       NULL, OPEN_EXISTING, 0, NULL);      if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
          {
    DWORD err = GetLastError ();
    printf ("\n***ReadPhysicalDriveInNTUsingSmart*** error = %d\n", err);
          }
          else
          {
             GETVERSIONINPARAMS GetVersionParams;
             DWORD cbBytesReturned = 0;            // Get the version, etc of PhysicalDrive IOCTL
             memset ((void*) & GetVersionParams, 0, sizeof(GetVersionParams));
             if ( ! DeviceIoControl (hPhysicalDriveIOCTL, SMART_GET_VERSION,
                       NULL, 
                       0,
             &GetVersionParams, sizeof (GETVERSIONINPARAMS),
       &cbBytesReturned, NULL) )
             {         
     
             }
             else
             {
            // Print the SMART version
                // PrintVersion (& GetVersionParams);
               // Allocate the command buffer
    ULONG CommandSize = sizeof(SENDCMDINPARAMS) + IDENTIFY_BUFFER_SIZE;
             PSENDCMDINPARAMS Command = (PSENDCMDINPARAMS) malloc (CommandSize);
               // Retrieve the IDENTIFY data
               // Prepare the command
    #define ID_CMD          0xEC            // Returns ID sector for ATA
    Command -> irDriveRegs.bCommandReg = ID_CMD;
    DWORD BytesReturned = 0;
            if ( ! DeviceIoControl (hPhysicalDriveIOCTL, 
                        SMART_RCV_DRIVE_DATA, Command, sizeof(SENDCMDINPARAMS),
    Command, CommandSize,
    &BytesReturned, NULL) )
                {


        } 
        else
        {
                    DWORD diskdata [256];
                    USHORT *pIdSector = (USHORT *)
                                 (PIDENTIFY_DATA) ((PSENDCMDOUTPARAMS) Command) -> bBuffer;                for (int ijk = 0; ijk < 256; ijk++)
                       diskdata [ijk] = pIdSector [ijk];


                    PrintIdeInfo (drive, diskdata);
                    done = TRUE;
    }
               // Done
                CloseHandle (hPhysicalDriveIOCTL);
    free (Command);
     }
          }
       }
       return done;
    }
    vista系统下首先是因为权限问题
    返回的 hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE解决了权限问题后,
    调用 DeviceIoControl
    返回错误代码  GetLastError() = 2,功能错误 
      

  2.   

    获取的操作就在这个函数里 
    int ReadPhysicalDriveInNTUsingSmart (void) 

      int done = FALSE; 
      int drive = 0; 
      for (drive = 0; drive < MAX_IDE_DRIVES; drive++) 
      { 
          HANDLE hPhysicalDriveIOCTL = 0; 
          char driveName [256]; 
          sprintf (driveName, "\\\\.\\PhysicalDrive%d", drive); 
          hPhysicalDriveIOCTL = CreateFile (driveName, 
                                  GENERIC_WRITE  ¦ GENERIC_READ, 
                                  FILE_SHARE_DELETE ¦ FILE_SHARE_READ ¦ FILE_SHARE_WRITE, 
          NULL, OPEN_EXISTING, 0, NULL);       if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE) 
          { 
               DWORD err = GetLastError (); 
               printf ("\n***ReadPhysicalDriveInNTUsingSmart*** error = %d\n", err); 
          } 
          else 
          { 
            GETVERSIONINPARAMS GetVersionParams; 
            DWORD cbBytesReturned = 0;
            memset ((void*) & GetVersionParams, 0, sizeof(GetVersionParams)); 
            if ( ! DeviceIoControl (hPhysicalDriveIOCTL, SMART_GET_VERSION, 
                      NULL, 
                      0, 
                  &GetVersionParams, sizeof (GETVERSIONINPARAMS), 
                  &cbBytesReturned, NULL) ) 
            {                } 
            else 
            { 
                 ULONG CommandSize = sizeof(SENDCMDINPARAMS) + IDENTIFY_BUFFER_SIZE; 
                 PSENDCMDINPARAMS Command = (PSENDCMDINPARAMS) malloc (CommandSize); 
         
                 #define ID_CMD          0xEC            // Returns ID sector for ATA 
                 Command -> irDriveRegs.bCommandReg = ID_CMD; 
                 DWORD BytesReturned = 0; 
            if ( ! DeviceIoControl (hPhysicalDriveIOCTL, 
                        SMART_RCV_DRIVE_DATA, Command, sizeof(SENDCMDINPARAMS), 
                        Command, CommandSize, 
                        &BytesReturned, NULL) ) 
                {
                } 
            else 
            { 
                    DWORD diskdata [256]; 
                    USHORT *pIdSector = (USHORT *) 
                                (PIDENTIFY_DATA) ((PSENDCMDOUTPARAMS) Command) -> bBuffer;                 for (int ijk = 0; ijk < 256; ijk++) 
                      diskdata [ijk] = pIdSector [ijk]; 
                    PrintIdeInfo (drive, diskdata); 
                    done = TRUE; 
             } 
              // Done 
                CloseHandle (hPhysicalDriveIOCTL); 
                free (Command); 
             } 
          } 
      } 
      return done; 

    vista系统下首先是因为权限问题 
    返回的 hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE 解决了权限问题后, 
    调用 DeviceIoControl 
    返回错误代码  GetLastError() = 2,功能错误 
      

  3.   

    http://blog.csdn.net/bhw98/archive/2003/05/20/19663.aspx
    看看这个可以不
      

  4.   

    看了一下msdn,DeviceIo是支持vista的
    lz这样用也没有问题啊
    for (drive = 0; drive < MAX_IDE_DRIVES; drive++) 
      { 
    你这是一个循环,你先去掉循环,手动式一下"\\\\.\\PhysicalDrive0","\\\\.\\PhysicalDrive1" 等等,看看都不可以么