驱动程序通知应用程序,急急急急

ZXGHEHE 2009-05-05 08:40:46
我想驱动在特定的情况下 通知应用程序做一些操作,,看了一些牛人的文章,,有了个思路::::在应用中创建事件,然后通过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;


现在的问题是,,实现不了 我的功能 不出现什么错误 就是实现不了同步,,,还请高人指点 今天第一次用这个网站 现在没有分可以给不过以后一定补上 希望高手指点啊
...全文
167 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
flyhua1010 2009-05-06
  • 打赏
  • 举报
回复
帮顶
fairchild811 2009-05-05
  • 打赏
  • 举报
回复
VC?发到VC区吧
ZXGHEHE 2009-05-05
  • 打赏
  • 举报
回复
自己顶下

6,849

社区成员

发帖
与我相关
我的任务
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
  • Windows Server社区
  • qishine
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧