1

我有一个打开文件然后调用 CreateFileMapping 的用户应用程序。我有一个驱动程序可以创建/打开我跟踪并成功执行的文件。问题是 CreateFileMapping 总是返回错误 193。我已经成功映射到其他文件,所以我认为一定是驱动程序方面的问题。Windows 8.1 x64(驱动程序显然是 64 位)和应用程序也是如此。我已经使用dependency walker来检查任何dll问题,一切似乎都很好。

驱动程序片段:

InitializeObjectAttributes(&fileAttributes,
    &fileName,
    OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
    NULL, // RootDirectory
    NULL // SecurityDescriptor
    );

if (KeGetCurrentIrql() != PASSIVE_LEVEL)
    return STATUS_INVALID_DEVICE_STATE;

status = ZwCreateFile(
    &context->FileHandle,
    SYNCHRONIZE | FILE_GENERIC_WRITE | FILE_GENERIC_READ | DELETE, 
    &fileAttributes,
    &ioStatus,
    NULL, // alloc size = none
    FILE_ATTRIBUTE_NORMAL,
    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
    FILE_OPEN_IF,
    FILE_RANDOM_ACCESS | 
    FILE_NON_DIRECTORY_FILE | FILE_DELETE_ON_CLOSE | 
    FILE_SYNCHRONOUS_IO_NONALERT | FILE_DEVICE_SECURE_OPEN,
    NULL, // eabuffer
    0 // ealength
);

用户应用程序片段:

LPCWSTR dev_path = L"\\\\.\\testdisk.txt";
fd = CreateFile(dev_path, FILE_GENERIC_READ | FILE_GENERIC_WRITE,
    FILE_SHARE_READ | FILE_SHARE_WRITE, // FILE_SHARE_DELETE
    NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if (fd == INVALID_HANDLE_VALUE)
{
    error("open device %ls failed, %s (%u)\n", dev_path, strerror(errno), GetLastError());
    exit(EXIT_FAILURE);
}
mapFile = CreateFileMapping(
    fd,
    NULL,
    PAGE_READWRITE,
    0, // maximum object size (high-order DWORD)
    1,   // maximum object size (low-order DWORD)
    NULL); 

编辑1:驱动程序中的文件名是#define DEV_PATH L"\\DosDevices\\C:\\testdisk.txt" 符号链接正在#define DEV_SYMBOLIC_LINK L"\\DosDevices\\testdrive.txt"使用该功能WdfDeviceCreateSymbolicLink ,我将设备名称设置为#define DEV_NAME L"\\Device\\testdrive.txt"使用该功能WdfDeviceInitAssignName

编辑 2:我已经更新了设备和文件路径。从用户空间访问文件时,我仍然收到 193 错误\\.\qqdevice\test.txt,如果我使用C:\qqdevice\test.txt该文件,则会创建文件,但驱动程序永远不会收到通知。

#define DEV_NAME L"\\Device\\qqdevice"
#define DEV_SYMBOLIC_LINK L"\\DosDevices\\qqdevice"
#define DEV_FILE_PATH L"\\DosDevices\\C:\\qqdevice\\test.txt"
4

0 回答 0