驱动程序通知应用程序,急急急急
我想驱动在特定的情况下 通知应用程序做一些操作,,看了一些牛人的文章,,有了个思路::::在应用中创建事件,然后通过ioctl传给驱动,驱动中ObReferenceObjectByHandle来引用该事件对象。 这样应用和驱动中都可以检查和修改事件状态。
应用程序代码
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HANDLE hMutex;
BOOL bResult;
HANDLE hThread1;
HANDLE hDevice;
DWORD dwBytesReturned;
HANDLE g_Event = NULL ;
MSG msg;
hMutex = CreateMutex(NULL, TRUE, (LPCTSTR)"InpelRButton");
if (ERROR_ALREADY_EXISTS == GetLastError())
{
return 1;
}
g_Event = CreateEvent(NULL, FALSE, FALSE,NULL);
hThread1=CreateThread(NULL,0,Fun1Proc, g_Event,0,NULL) ;
hDevice = CreateFile( m_pszDevice, GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
_ASSERTE( INVALID_HANDLE_VALUE != hDevice);
if (hDevice == INVALID_HANDLE_VALUE)
{
return FALSE;
}
bResult = DeviceIoControl(
hDevice,
IOCTL_SET_NOTIFICATION_EVENT,
(PVOID)&g_Event,//句柄
//(LPVOID)g_Event,
sizeof(g_Event),//
NULL,
0,
&dwBytesReturned,
NULL);
_ASSERT(bResult);
if (hDevice)
{
CloseHandle(hDevice);
}
while (GetMessage(&msg, (HWND) NULL, 0, 0) != 0 && GetMessage(&msg, (HWND) NULL, 0, 0) != -1)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
线呈函数
DWORD WINAPI Fun1Proc(HANDLE g_Event )
{
HANDLE g_Event2 = g_Event ;
while(1)
{
WaitForSingleObject(g_Event2, INFINITE);
mouse_event (MOUSEEVENTF_LEFTUP , 50, 0, 50, 0);
mouse_event (MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
mouse_event (MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
Sleep(5000);
// mouse_event (MOUSEEVENTF_LEFTDOWN , 0, 0, 0, 0);
// mouse_event (MOUSEEVENTF_LEFTUP , 0, 0, 0, 0);
mouse_event (MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
mouse_event (MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
Sleep(5000);
// mouse_event (MOUSEEVENTF_LEFTDOWN , 0, 0, 0, 0);
// mouse_event (MOUSEEVENTF_LEFTUP , 0, 0, 0, 0);
mouse_event (MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
mouse_event (MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);
// ResetEvent(g_Event);
}
return 0;
}
驱动函数
case IOCTL_SET_NOTIFICATION_EVENT:
hEvent = *(PHANDLE)Irp->AssociatedIrp.SystemBuffer;
if((nInputLength==0)||(nInputLength <sizeof(hEvent)))
{
status = STATUS_INVALID_BUFFER_SIZE;
break;
}
status = ObReferenceObjectByHandle(hEvent,
EVENT_MODIFY_STATE,
*ExEventObjectType,
Irp->RequestorMode,
//KernelMode,
(PVOID*) &Requestevent,
NULL);
if (!NT_SUCCESS(status))
{
Print(deviceExtension, DBG_ALWAYS, ("status222 = %d\n",
status));
}
else
{
Print(deviceExtension, DBG_ALWAYS, ("status333 = %d\n",
status));
}
KeSetEvent(&Requestevent,0, FALSE);
break;
Irp->IoStatus.Status = status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
现在的问题是,,实现不了 我的功能 不出现什么错误 就是实现不了同步,,,还请高人指点 今天第一次用这个网站 现在没有分可以给不过以后一定补上 希望高手指点啊