阅读:1379回复:9
帮主--Tom_lyd ,请进!
应用程序中...
HANDLE Device; HANDLE CommEvent; Device = CreateFile( VolumeName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (Device == INVALID_HANDLE_VALUE) { printf("设备不存在!"); return; } CommEvent = CreateEvent( NULL,false,false,NULL ); if( !DeviceIoControl( Device, IO_REFERENCE_EVENT, (LPVOID)CommEvent, 0, NULL, 0, &dwReturn, NULL) ) { CloseHandle( CommEvent ); printf("Error in IOCTL_REGISTER_EVENT call"); return; } 驱动程序中: case IO_REFERENCE_EVENT: { HANDLE hEvent; OBJECT_HANDLE_INFORMATION objHandleInfo; hEvent = (HANDLE)IrpStack- >Parameters.DeviceIoControl.Type3InputBuffer; ntStatus = ObReferenceObjectByHandle( hEvent, GENERIC_ALL, NULL, KernelMode, &pEventObject, &objHandleInfo ); if(ntStatus != STATUS_SUCCESS) { DbgPrint("ObReferenceObjectByHandle failed! status = %x\n", ntStatus); break; } DbgPrint("Referenct object sussfully!\n"); break; } ................. 为什么老是 Error in IOCTL_REGISTER_EVENT call ObReferenceObjectByHandle failed |
|
|
沙发#
发布于:2004-03-17 08:43
第一个问题:slwqw回答得非常正确。
第二个问题:你的uFileSize实际上取得是指针,而不是值,改成这样: ULONGLONG uFileSize = *(ULONGLONG*)pIrp->AssociatedIrp.SystemBuffer; |
|
|
板凳#
发布于:2004-03-15 14:17
我想在应用中传一个值给驱动,怎么值变了???
应用中: ULONGLONG uFileSize = 3242344; DeviceIoControl( Device, IOCTL_NETDISK_OPEN_FILE, &uFileSize, sizeof(ULONGLONG), NULL, 0, &bReturn, NULL ); 驱动中: case IOCTL_NETDISK_OPEN_FILE: { ULONGLONG uFileSize; uFileSize = (ULONGLONG)pIrp->AssociatedIrp.SystemBuffer; 这时候uFileSize 怎么变成428870431了???? } [编辑 - 3/15/04 by Zhujnt] |
|
|
地板#
发布于:2004-03-15 11:16
再问个问题! 不能正常退出,原因就比较多了。只能具体问题具体分析,靠你自己去DEBUG了。 |
|
地下室#
发布于:2004-03-15 09:08
再问个问题!
#define IOCTL_NETDISK_GETMEMORY CTL_CODE(0x8000,0x802,METHOD_BUFFERED,FILE_ANY_ACCESS) //To Allocate the share memory DriverVirtualAddress = ExAllocatePool(NonPagedPool, 500); Mdl = IoAllocateMdl(DriverVirtualAddress, 500, FALSE, FALSE, NULL); MmBuildMdlForNonPagedPool(Mdl); 但在upload()中. //release the share memory if( DriverVirtualAddress ) { ExFreePool( DriverVirtualAddress ); } MmUnmapLockedPages(ApplicationVirtualAddress, Mdl); DbgPrint("unloaded\n"); 我用的是win2000DDK ,但net stop ***后, 没到"unloaded" 无法退出?? |
|
|
5楼#
发布于:2004-03-15 08:37
哈哈!~~~~~~~~~~~
大哥,我对你的敬仰由如我给你的20分 ;) |
|
|
6楼#
发布于:2004-03-14 21:01
要象下面那样:
const ULONG FILE_DEVICE_TDIFITLER = 0x8000; #define IOCTL_SETEVENTHANDLE CTL_CODE(FILE_DEVICE_TDIFITLER,0x802,METHOD_NEITHER,FILE_ANY_ACCESS) |
|
7楼#
发布于:2004-03-14 16:06
我指定缓冲方式是:
DeviceObject->Flags |= DO_DIRECT_IO; 这样就不能用信号量通信吗????????? |
|
|
8楼#
发布于:2004-03-14 15:38
slwqw 您好!
CommEvent创建成功的. 但传到驱动中就变成0了??? 怎么使IO_REFERENCE_EVENT用METHOD_NEITHER???? |
|
|
9楼#
发布于:2004-03-14 14:59
光看你的代码看不出什么问题,检查一下两种情况:
1、CommEvent是否成功建立? 2、IO_REFERENCE_EVENT是否已经使用METHOD_NEITHER(必须使用这种类型)? 使用单手左手打字真费劲 :D |
|