猿问

CreateFile 函数打开设备失败?

//这是我驱动程序中的代码
RtlInitUnicodeString(&uniNtNameString, L"\\Device\\Jow"); 

status = IoCreateDevice( //这个函数没问题,成功的
IN DriverObject, 
IN FILE_DEVICE_FILE_SYSTEM,
IN &uniNtNameString, //Name
IN 0x15,//NULL
IN 0, 
IN FALSE, 
OUT &pFilterDeviceObject
);
if(STATUS_SUCCESS == status)
{
DbgPrint("创建设备成功"); }
else
{
DbgPrint("创建设备失败");
}

//这是我R3层的代码
hDevice = CreateFile("//./Jow", // drive to open //这个函一直失败
0, // no access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
NULL); // do not copy file attributes

if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
{
AfxMessageBox("打开设备失败"); //失败到这一行
return;
}

现在我试了好多的驱动名字 CreateFile 一直失败,我想知我用IoCreateDevice创建的设备,到底叫什么名字。
换一个问题吧,我想知道如果我用 
IoCreateSymbolicLink(&LinkString,&NameString);
这个函数创建的话,LinkString 这个参数是多少才正确?

侃侃尔雅
浏览 1272回答 2
2回答

RISEBY

那是因为你创建的是设备名称,这个只能在ring0层访问。要想在ring3层访问,需要创建ring3层可以访问的符号链接与设备关联。RtlInitUnicodeString(&ustrSymLink,L"\\??\\Jow_SymLink");IoCreateSymbolicLink(&ustrSymLink,&uniNtNameString);ring3层访问的时候CreateFile("\\\\.\\Jow_SymLink",........)

饮歌长啸

那是因你创建的是设备名称,这个只能在ring0层访问。要想在ring3层访问,需要创建ring3层可以访问的符号链接与设备关联。RtlInitUnicodeString(&ustrSymLink,L"\\??\\Jow_SymLink");IoCreateSymbolicLink(&ustrSymLink,&uniNtNameString);ring3层访问的时候CreateFile("\\\\.\\Jow_SymLink",........)微软预定义的标准设备中含有“COM1”-“COM9”。所以,“COM1”-“COM9”作为文件名传递给函数时操作系统会自动地将之解析为相应的设备。但对于COM10及以上的串口,“COM10”之类的文件名系统只视之为一般意义上的文件,而非串行设备。
随时随地看视频慕课网APP
我要回答