阅读:1317回复:0
同样的zwreadfile调用,一成一败,返回码STATUS_INVALID_HANDLE
用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); } |
|