我有一个打开文件然后调用CreateFileMapping的用户应用程序。我有一个驱动程序,可以创建/打开我已跟踪并成功执行的文件。问题是CreateFileMapping总是返回错误193.我已成功映射到其他文件,所以我认为必须是驱动程序方面的问题。 Windows 8.1 x64(驱动程序显然是64位)和应用程序一样。我已经使用依赖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:
我更新了设备和文件路径。从用户空间\\.\qqdevice\test.txt
访问文件时仍然出现193错误,如果我使用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"