windows2008 c++ 怎么获取SCSI硬盘物理序列号

windows2008 c++ 如何获取SCSI硬盘物理序列号
使用网上下载的《共享软件加密算法库》里面的reg.dll是可以获取scsi硬盘序列号的。
查阅了很多资料好像推荐使用下面的代码的比较多,尝试了还是不行,读不到scsi硬盘的序列号(系统2008r2),DeviceIoControl返回结果都为0.
由于特殊原因必须使用vs2008 vc++,求帮助。
#include<ntddscsi.h>
bool CSN::ReadIdeDriveAsScsiDriveInNT (void)
{
   int done = FALSE;
   int controller = 0;

   for (controller = 0; controller < 16; controller++)
   {
      HANDLE hScsiDriveIOCTL = 0;
      char   driveName [256];

         //  Try to get a handle to PhysicalDrive IOCTL, report failure
         //  and exit if can't.
      sprintf_s (driveName, "\\\\.\\Scsi%d:", controller);

         //  Windows NT, Windows 2000, any rights should do
      hScsiDriveIOCTL = CreateFile (driveName,
                               GENERIC_READ | GENERIC_WRITE, 
                               FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
                               OPEN_EXISTING, 0, NULL);
      // if (hScsiDriveIOCTL == INVALID_HANDLE_VALUE)
      //    printf ("Unable to open SCSI controller %d, error code: 0x%lX/n",
      //            controller, GetLastError ());

      if (hScsiDriveIOCTL != INVALID_HANDLE_VALUE)
      {
         int drive = 0;

         for (drive = 0; drive < 2; drive++)
         {
            char buffer [sizeof (SRB_IO_CONTROL) + SENDIDLENGTH];
            SRB_IO_CONTROL *p = (SRB_IO_CONTROL *) buffer;
            SENDCMDINPARAMS *pin =
                   (SENDCMDINPARAMS *) (buffer + sizeof (SRB_IO_CONTROL));
            DWORD dummy;
   
            memset (buffer, 0, sizeof (buffer));
            p -> HeaderLength = sizeof (SRB_IO_CONTROL);
    p -> Timeout = 10000;
            p -> Length = SENDIDLENGTH;
            p -> ControlCode = IOCTL_SCSI_MINIPORT_IDENTIFY;
            strncpy_s ((char *) p -> Signature,9,"SCSIDISK", 8);
             
            pin -> irDriveRegs.bCommandReg = IDE_ATA_IDENTIFY;
            pin -> bDriveNumber = drive;

            if (DeviceIoControl (hScsiDriveIOCTL, IOCTL_SCSI_MINIPORT, 
                                 buffer,
                                 sizeof (SRB_IO_CONTROL) +
                                         sizeof (SENDCMDINPARAMS) - 1,
                                 buffer,
                                 sizeof (SRB_IO_CONTROL) + SENDIDLENGTH,
                                 &dummy, NULL))
            {
               SENDCMDOUTPARAMS *pOut =
                    (SENDCMDOUTPARAMS *) (buffer + sizeof (SRB_IO_CONTROL));
               IDSECTOR *pId = (IDSECTOR *) (pOut -> bBuffer);
               if (pId -> sModelNumber [0])
               {
                  DWORD diskdata [256];
                  int ijk = 0;
                  USHORT *pIdSector = (USHORT *) pId;
                  for (ijk = 0; ijk < 256; ijk++)
                     diskdata [ijk] = pIdSector [ijk];
                  //PrintIdeInfo (controller * 2 + drive, diskdata);
                  done = TRUE;
               }
            }
         }
         CloseHandle (hScsiDriveIOCTL);
      }
   }
   return done;
}
------解决思路----------------------
http://www.ccrun.com/article.asp?i=605&d=l3si2a
你看看这个里面的办法行吗?
------解决思路----------------------
帮顶吧! 这好像diskid的代码,我以前在03server上好像打过sp后就不太好用了,以前简单,太不了挂个驱动去读,现在驱动要签名搞得麻烦了。
------解决思路----------------------
已邮件发送给你,请查收。
------解决思路----------------------
lz用在什么操作系统上,
看代码里的注释 //  Windows NT, Windows 2000, any rights should do 感觉是很久以前写的了。
从 windows vista(还是windows server 2003)开始,很多东西都没法在用户态下得到了,比如映射物理内存\\Device\\PhysicalMemory