我有一个打开文件然后调用 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"