CreateFileMapping返回错误193(%1不是有效的Win32应用程序)

时间:2016-04-17 13:47:50

标签: windows driver kmdf wdf

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

0 个答案:

没有答案