阅读:1247回复:10
CreateFile的超简单问题
写了一个驱动,然后在vc6的app中测试
void CMy111Dlg::OnOK() { hDriver1 = CreateFile("\\\\.\\ABCDE", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); } void CMy111Dlg::OnButton1() { hDriver2 = CreateFile("\\\\.\\ABCDE", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); } 第一个被点击的是正确的,第二个被点击的就是错误的,比如,第一次点击ok,hDriver1有值,再点击button1,hDriver2=INVALID_HANDLE_VALUE,GetLastError=5发现是权限不够;如果我第一次点击的是button1,则hDriver2有值,正确,再点击ok,发现hDriver1=INVALID_HANDLE_VALUE,GetLastError=5,这到底是怎么回事?搞了一天没搞定 ABCDE这个驱动是用于in和out的,和winio差不多,我已经注册成自动了 大侠帮帮忙 |
|
沙发#
发布于:2004-10-13 17:15
你使用了同一个符号名连接来打开设备当然不行了。
还有,要看你的驱动源码中是不是使用 "ABCDE%d",id+1 方式创建连接符号名的,如果是,那么你在家在驱动时也要使用这种方式,如果没有使用就只能同时打开一个了。 |
|
板凳#
发布于:2004-10-14 09:21
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath) { PDEVICE_OBJECT DeviceObject; NTSTATUS status; PLOCAL_DEVICE_INFO DeviceExtension; WCHAR NameBuffer[] = L"\\Device\\ABCDE"; WCHAR DOSNameBuffer[] = L"\\DosDevices\\ABCDE"; UNICODE_STRING uniNameString, uniDOSString; RtlInitUnicodeString( &uniNameString, NameBuffer ); RtlInitUnicodeString( &uniDOSString, DOSNameBuffer ); status = IoCreateDevice(DriverObject, sizeof(LOCAL_DEVICE_INFO), &uniNameString, FILE_DEVICE_UNKNOWN, 0, TRUE, &DeviceObject); if(!NT_SUCCESS(status)) return status; DeviceExtension = DeviceObject->DeviceExtension; status = IoCreateSymbolicLink( &uniDOSString, &uniNameString ); ............... return STATUS_SUCCESS; } 我如果把ABCDE改成了可以动态增加的,那我怎么注册为自动啊?我的注册过程是这样的 const char DRIVER_NAME[] = "ABCDE"; const char DISPLAY_NAME[] = "ABCDE Driver"; const char DRIVER_GROUP[] = "SST miniport drivers"; void CABCDEInstallDlg::OnBtnInstall() { DWORD dwStatus = 0; SC_HANDLE hSCMan; SC_HANDLE hService; CString DriverPath = ".......\\ABCDE.SYS"; hSCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCMan!=NULL) { hService=OpenService(hSCMan, DRIVER_NAME, SERVICE_QUERY_STATUS); if (hService!=NULL) { CloseServiceHandle(hService); CloseServiceHandle(hSCMan); return; } hService=CreateService( hSCMan, DRIVER_NAME, DISPLAY_NAME, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, DriverPath, DRIVER_GROUP, NULL, NULL, NULL, NULL); if (hService==NULL) dwStatus=GetLastError(); else CloseServiceHandle(hService); CloseServiceHandle(hSCMan); } else dwStatus=GetLastError(); } |
|
地板#
发布于:2004-10-14 12:14
仔细看看IoCreateDevice的参数
|
|
地下室#
发布于:2004-10-14 12:57
我看了 但没看出什么来 能再提示一下吗? 我是新手 对这个实在不熟 但马上就要做出来的 来不及啃书了 还望大侠们帮个忙 谢谢
|
|
5楼#
发布于:2004-10-14 13:25
倒数第二个
|
|
6楼#
发布于:2004-10-14 13:46
楼上的 谢谢 终于搞定了 :)
|
|
7楼#
发布于:2004-10-14 13:50
我给分了 可以系统说:"你不是此帖的起帖人或此帖已经给分!
" 这是怎么回事?? |
|
8楼#
发布于:2004-10-14 15:26
看你自己是否同意EXCLUSIVE吧.
|
|
|
9楼#
发布于:2004-10-14 16:12
不懂楼上的意思 是我没设置什么东西所以不能给分吗?
|
|
10楼#
发布于:2004-10-14 16:38
麻烦arthurtu和xx_focus到http://www.driverdevelop.com/forum/html_79442.html?1097743033领分
这个贴子我给不了分,不知道为什么 |
|