none
執行DeviceIoControl時發生的問題 RRS feed

  • 問題

  • 因為我要下一些command給device,所以我用了DeviceIoControl來下我的command,但是我在compiler時發生了"未宣告"的錯誤,可是我有加入他的標頭檔,我也確認過標頭檔裡面有那個定義,可以請大大幫忙看一下嗎?

    我的程式如下:

    void Test()

    {

     HANDLE hDevice;
     CString msgStr;
     BOOL status = 0;
     ULONG length = 0, returned = 0;
     SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER sptdwb;
     char ucSenseBuf;

     hDevice = CreateFile("\\\\?\\E:",
          GENERIC_READ | GENERIC_WRITE,
          FILE_SHARE_READ | FILE_SHARE_WRITE,
          NULL,
          OPEN_EXISTING,
          FILE_ATTRIBUTE_NORMAL,
          NULL);

     if (hDevice == INVALID_HANDLE_VALUE)
     {
      msgStr.Format("Create file for E:\\ Fail (%d)", GetLastError());
      MessageBox(msgStr, NULL, MB_OK);
      return;
     }

     // Initialize the parameters
     ZeroMemory(&sptdwb, sizeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER));
     sptdwb.sptd.Length = sizeof(SCSI_PASS_THROUGH_DIRECT);
     sptdwb.sptd.PathId = 0;
     sptdwb.sptd.TargetId = 1;
     sptdwb.sptd.Lun = 0;
     sptdwb.sptd.CdbLength = 10;
     sptdwb.sptd.SenseInfoLength = 0x0;
     sptdwb.sptd.DataIn = SCSI_IOCTL_DATA_IN;
     sptdwb.sptd.DataTransferLength = 0;
     sptdwb.sptd.DataBuffer = NULL;
     sptdwb.sptd.TimeOutValue = 2;
     sptdwb.sptd.SenseInfoOffset = offsetof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER,ucSenseBuf);
     sptdwb.sptd.Cdb[0] = 0x1B;
     sptdwb.sptd.Cdb[1] = 0x00;
     sptdwb.sptd.Cdb[2] = 0x00;
     sptdwb.sptd.Cdb[3] = 0x00;
     // Eject
     sptdwb.sptd.Cdb[4] = 0x02; 

     length = sizeof(SCSI_PASS_THROUGH_DIRECT);

     status = DeviceIoControl(hDevice,
         IOCTL_SCSI_PASS_THROUGH_DIRECT,
         &sptdwb,
         length,
         &sptdwb,
         length,
         &returned,
         FALSE);
    }

     

    Thanks,

    Rabin

    2007年1月23日 上午 10:32

解答

  • HI,

    有可能是SCSI_PASS_THROUGH_DIRECT 被條件編譯擋掉了, 您可以檢查SCSI_PASS_THROUGH_DIRECT宣告之前有沒有條件編譯的語法.

    tihs

    2007年1月25日 上午 12:44

所有回覆

  • HI,

    您的意思是編譯器告訴你DeviceIoControl函數未宣告嗎?

    tihs

    2007年1月24日 上午 06:47
  • ㄚ!

    我現在才發現我沒有說明是什麼東西未宣告。

    他其實是出現:SCSI_PASS_THROUGH_DIRECT 未定義!

    但是我檢查過他的標頭檔(ntddscsi.h),裡面明明就有,可是為何不能用呢?

    Rabin

     

    2007年1月24日 上午 09:42
  • HI,

    有可能是SCSI_PASS_THROUGH_DIRECT 被條件編譯擋掉了, 您可以檢查SCSI_PASS_THROUGH_DIRECT宣告之前有沒有條件編譯的語法.

    tihs

    2007年1月25日 上午 12:44
  • 後來我解決了,是因為那個標頭檔有bug,必須自己宣告,不然會有我這個問題!

    還是謝謝大家了!

    2007年1月29日 上午 06:28
  • HI,

    您可以注意一下SCSI_PASS_THROUGH_DIRECT宣告的前面有沒有出現條件編譯語法, 檢查一下是否是因為受條件編譯的影響, 造成SCSI_PASS_THROUGH_DIRECT未定義

    tihs

    2007年1月30日 上午 02:38