yejun
驱动牛犊
驱动牛犊
  • 注册日期2005-03-10
  • 最后登录2005-04-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1317回复:0

同样的zwreadfile调用,一成一败,返回码STATUS_INVALID_HANDLE

楼主#
更多 发布于:2005-04-06 09:40
用drvierstudio生成得vscsi框架。在pdo.c里的createpdo函数里用zwcreatefile打开一个文件(vscsi.img),将其handle保存在pdoextension里。然后,在vscsi.c里的ScsiInternalDeviceIoControlDispatch里的SRB_FUNCTION_EXECUTE_SCSI分支中进行读写。当执行到if (SCSIOP_READ)时,可以看到文件handle仍是当初保存在pdoextension中的值,但调用zwreadfile会失败,返回错误是STATUS_INVALID_HANDLE。
我做了以下尝试:在pdo.c中zwcreatefile后紧接着就zwreadfile,这次成功执行,把这相同的zwreadfile移至vscsi.c中就会出现上述的错误。
有一点是我很奇怪的,每次用zwcreatefile打开文件时(即使是不同文件),返回的filehandle都是一样的3d8,而在vscsi.c里读写时的filehandle明明没有变仍然是3d8,却返回STATUS_INVALID_HANDLE。请各位不吝赐教。
以下是pdo.c里的相关代码:
   // initialize ZwCreateFile parameters
   InitializeObjectAttributes(
       &oa,
       &DeviceExtension->ufile_name,
       OBJ_CASE_INSENSITIVE,
       NULL,
       NULL
       );
   status = ZwCreateFile(
       &pdoExtension->FileHandle,
       GENERIC_READ | GENERIC_WRITE,
       &oa,
       &iostatus,
       NULL,
       FILE_ATTRIBUTE_NORMAL,
       0,
       FILE_OPEN,
       FILE_NON_DIRECTORY_FILE |
       FILE_RANDOM_ACCESS |
       FILE_NO_INTERMEDIATE_BUFFERING |
       FILE_SYNCHRONOUS_IO_NONALERT,
       NULL,
       0
       );
   if (!NT_SUCCESS(status))
   {
       vDiskOnTdiDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__\"---------open file failed. STATUS %x,%x\", status,pdoExtension->FileHandle);
               RtlFreeUnicodeString(&DeviceExtension->ufile_name);
return status;
   }
vDiskOnTdiDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__\"----------- open file succeed. STATUS %x,%x\", status,pdoExtension->FileHandle);
RtlFreeUnicodeString(&DeviceExtension->ufile_name);
   status = ZwQueryInformationFile(
       pdoExtension->FileHandle,
       &iostatus,
       &file_standard,
       sizeof(FILE_STANDARD_INFORMATION),
       FileStandardInformation
       );
   if (!NT_SUCCESS(status))
   {
       ZwClose(pdoExtension->FileHandle);
vDiskOnTdiDebugPrint(DBG_INIT, DBG_TRACE, __FUNCTION__\"----------------query information 1 failed--------------------\");
       return status;
   }
   pdoExtension->FileSize = file_standard.EndOfFile.LowPart;
vDiskOnTdiDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__\"------------------------------------pdoExtension->FileSize: %ud---\", pdoExtension->FileSize);



// -----------------------------------------
//zwreadfile中的数字是测试临时填的,此处可以成功执行返回


           RtlZeroMemory(&FileByteOffset, sizeof(LARGE_INTEGER));
   FileByteOffset.LowPart = 200;
FileByteOffset.HighPart = 0;
   
          status = ZwReadFile(
   pdoExtension->FileHandle,
   NULL,
   NULL,
   NULL,
   &iostatus,
   buffer,
   50,
                &FileByteOffset,
   NULL
   );
             if (NT_SUCCESS(status))
            {        
              
         vDiskOnTdiDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__\"-----------------------------------------read file succeed. STATUS %x\", status);
            }
    else
    {
     
        vDiskOnTdiDebugPrint(DBG_IO, DBG_TRACE, __FUNCTION__\"---------------------------------------read file failed. STATUS %x\", status);
    }
游客

返回顶部