EXE和SYS通信MiniFilter基于事件方式

[cpp]  view plain  copy
  1. #ifndef _HEADER_HEAD_FILE  
  2. #define _HEADER_HEAD_FILE  
  3. #pragma once  
  4. #include <ntifs.h>  
  5. #include <ntddk.h>  
  6. #include <fltKernel.h>    
  7. #include <Ntstrsafe.h>    
  8.   
  9. #ifndef MAX_PATH  
  10. #define MAX_PATH    260  
  11. #endif  
  12.   
  13.   
  14.   
  15. NTKERNELAPI UCHAR * PsGetProcessImageFileName(__in PEPROCESS Process);  
  16.   
  17.   
  18.   
  19. //驱动控制代码  
  20. #define IOCTL_START CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810,METHOD_BUFFERED, FILE_ANY_ACCESS)  
  21. #define IOCTL_STOP CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811,METHOD_BUFFERED, FILE_ANY_ACCESS)  
  22.   
  23.   
  24.   
  25.   
  26. NTSTATUS PtUnload(__in FLT_FILTER_UNLOAD_FLAGS Flags);  
  27.   
  28. NTSTATUS PtInstanceQueryTeardown(__in PCFLT_RELATED_OBJECTS FltObjects, __in FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags);  
  29.   
  30. CONST FLT_REGISTRATION FilterRegistration = {  
  31.     sizeof(FLT_REGISTRATION),         //  Size    
  32.     FLT_REGISTRATION_VERSION,           //  Version    
  33.     0,                                  //  Flags    
  34.     NULL,                               //  Context    
  35.     NULL,                               //  Operation callbacks    
  36.     PtUnload,                           //  MiniFilterUnload    
  37.     NULL,                               //  InstanceSetup    
  38.     PtInstanceQueryTeardown,            //  InstanceQueryTeardown    
  39.     NULL,                               //  InstanceTeardownStart    
  40.     NULL,                               //  InstanceTeardownComplete    
  41.     NULL,                               //  GenerateFileName    
  42.     NULL,                               //  GenerateDestinationFileName    
  43.     NULL                                //  NormalizeNameComponent    
  44. };  
  45.   
  46.   
  47. #endif  


[cpp]  view plain  copy
  1. #include "Header.h"  
  2.   
  3.   
  4. PFLT_FILTER gFilterHandle;  
  5. PFLT_PORT g_ServerPort;  
  6. PFLT_PORT g_ClientPort;  
  7.   
  8.   
  9. //同步事件对象  
  10. PRKEVENT g_pEventObject = NULL;  
  11. //句柄信息  
  12. OBJECT_HANDLE_INFORMATION g_ObjectHandleInfo;  
  13.   
  14. char g_szOutBuf[MAX_PATH] = { 0 };  
  15.   
  16. /* 
  17. 这里要注意:1.数据地址的对齐. 
  18. 2.文档建议使用:try/except处理. 
  19. 3.如果是64位的驱动要考虑32位的EXE发来的请求. 
  20. */  
  21. NTSTATUS MessageNotifyCallback(IN PVOID PortCookie, IN PVOID InputBuffer OPTIONAL, IN ULONG InputBufferLength, OUT PVOID OutputBuffer OPTIONAL, IN ULONG OutputBufferLength, OUT PULONG ReturnOutputBufferLength)  
  22. {  
  23.     NTSTATUS status = 0;  
  24.   
  25.     PAGED_CODE();  
  26.     UNREFERENCED_PARAMETER(PortCookie);  
  27.   
  28.     //返回用户一些信息.    
  29.     RtlCopyMemory(OutputBuffer, g_szOutBuf, strlen(g_szOutBuf) + 1);  
  30.     return status;  
  31. }  
  32.   
  33. VOID DisconnectNotifyCallback(_In_opt_ PVOID ConnectionCookie)  
  34. {  
  35.     PAGED_CODE();  
  36.   
  37.     UNREFERENCED_PARAMETER(ConnectionCookie);  
  38.   
  39.     FltCloseClientPort(gFilterHandle, &g_ClientPort);  
  40. }  
  41.   
  42. NTSTATUS ConnectNotifyCallback(IN PFLT_PORT ClientPort, IN PVOID ServerPortCookie, IN PVOID ConnectionContext, IN ULONG SizeOfContext, OUT PVOID * ConnectionPortCookie)  
  43. {  
  44.     PAGED_CODE();  
  45.   
  46.     UNREFERENCED_PARAMETER(ServerPortCookie);  
  47.     UNREFERENCED_PARAMETER(ConnectionContext);  
  48.     UNREFERENCED_PARAMETER(SizeOfContext);  
  49.     UNREFERENCED_PARAMETER(ConnectionPortCookie);  
  50.   
  51.     g_ClientPort = ClientPort;  
  52.     return STATUS_SUCCESS;  
  53. }  
  54.   
  55.   
  56. NTSTATUS PtInstanceQueryTeardown(__in PCFLT_RELATED_OBJECTS FltObjects, __in FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags)  
  57. {  
  58.     return STATUS_SUCCESS;  
  59. }  
  60.   
  61.   
  62. NTSTATUS PtUnload(__in FLT_FILTER_UNLOAD_FLAGS Flags)  
  63. {  
  64.   
  65.     FltCloseCommunicationPort(g_ServerPort);  
  66.     FltUnregisterFilter(gFilterHandle);  
  67.     return STATUS_SUCCESS;  
  68. }  
  69.   
  70.   
  71. //设置注册表键值      
  72. NTSTATUS SetValueKey(PUNICODE_STRING pRegPath, PUNICODE_STRING pValueName, ULONG Type, wchar_t ValueData[MAX_PATH])  
  73. {  
  74.   
  75.   
  76.     //定义变量      
  77.     size_t pcch = 0;  
  78.     OBJECT_ATTRIBUTES objectAttribues;  
  79.     HANDLE hRegister = NULL;  
  80.     NTSTATUS ntstatus;  
  81.     USHORT cbszSize = 0;  
  82.   
  83.     //参数效验      
  84.     if (pRegPath == NULL || pValueName == 0 || ValueData == NULL)return FALSE;  
  85.   
  86.   
  87.     switch (Type)  
  88.     {  
  89.     case REG_SZ:  
  90.     {  
  91.         //获取长度      
  92.         RtlStringCchLengthW(ValueData, MAX_PATH, &pcch);  
  93.         if (pcch <= 0)return FALSE;  
  94.         cbszSize = (USHORT)(pcch * sizeof(wchar_t)) + sizeof(wchar_t);  
  95.     }  
  96.     break;  
  97.     case REG_DWORD:  
  98.     {  
  99.         cbszSize = sizeof(ULONG);  
  100.     }  
  101.     break;  
  102.     default:  
  103.         return STATUS_UNSUCCESSFUL;  
  104.     }  
  105.   
  106.   
  107.     //设置变量      
  108.     InitializeObjectAttributes(&objectAttribues, pRegPath, OBJ_CASE_INSENSITIVE, NULL, NULL);  
  109.   
  110.     //打开注册表      
  111.     ntstatus = ZwOpenKey(&hRegister, KEY_ALL_ACCESS, &objectAttribues);  
  112.     if (!NT_SUCCESS(ntstatus) || hRegister == NULL)return FALSE;  
  113.   
  114.   
  115.     //设置REG_SZ子健      
  116.     ntstatus = ZwSetValueKey(hRegister, pValueName, 0, Type, ValueData, cbszSize);  
  117.     ZwClose(hRegister);  
  118.     return ntstatus;  
  119. }  
  120.   
  121. //注册MiniFilter    
  122. NTSTATUS RegisterMiniFilter(PDRIVER_OBJECT DriverObject, PUNICODE_STRING pRegistryPath)  
  123. {  
  124.   
  125.   
  126.     UNICODE_STRING UnicodeDriverServerName;  
  127.     UNICODE_STRING UnicodeValue;  
  128.     UNICODE_STRING UnicodeSzText;  
  129.     UNICODE_STRING UnicodeSzServerNameInstances;  
  130.     ULONG ulValue;  
  131.     HANDLE hRegister;  
  132.     ULONG ulResult;  
  133.     NTSTATUS ntStatus;  
  134.     static wchar_t szInstances[MAX_PATH] = { 0 };  
  135.     static wchar_t szServerNameInstances[MAX_PATH] = { 0 };  
  136.     //初始化objectAttributes        
  137.     OBJECT_ATTRIBUTES objectAttributes;  
  138.     wchar_t* pFind = NULL;  
  139.     ULONG  nAltitude = 399998;  
  140.     int i = 0;  
  141.   
  142.     //参数效验      
  143.     if (DriverObject == NULL)return STATUS_UNSUCCESSFUL;  
  144.   
  145.   
  146.     if (pRegistryPath == NULL || pRegistryPath->Length <= 0)return STATUS_UNSUCCESSFUL;  
  147.     InitializeObjectAttributes(&objectAttributes, pRegistryPath, OBJ_CASE_INSENSITIVE, NULL, NULL);  
  148.     //创建或打开注册表项目        
  149.     ntStatus = ZwCreateKey(&hRegister, KEY_ALL_ACCESS, &objectAttributes, 0, NULL, (ULONG)REG_OPTION_NON_VOLATILE, &ulResult);  
  150.     if (hRegister == NULL || ntStatus != STATUS_SUCCESS) return STATUS_UNSUCCESSFUL;  
  151.     ZwClose(hRegister);  
  152.   
  153.     //DependOnService      
  154.     RtlInitUnicodeString(&UnicodeValue, L"DependOnService");  
  155.     SetValueKey(pRegistryPath, &UnicodeValue, REG_SZ, L"FltMgr");  
  156.   
  157.     //Instances      
  158.     RtlStringCbPrintfExW(szServerNameInstances, sizeof(szServerNameInstances), NULL, NULL, STRSAFE_FILL_BEHIND_NULL, L"%wZ\\Instances", pRegistryPath);  
  159.     RtlInitUnicodeString(&UnicodeSzServerNameInstances, szServerNameInstances);  
  160.     InitializeObjectAttributes(&objectAttributes, &UnicodeSzServerNameInstances, OBJ_CASE_INSENSITIVE, NULL, NULL);  
  161.     ntStatus = ZwCreateKey(&hRegister, KEY_ALL_ACCESS, &objectAttributes, 0, NULL, REG_OPTION_NON_VOLATILE, &ulResult);  
  162.     if (hRegister == NULL || ntStatus != STATUS_SUCCESS) return STATUS_UNSUCCESSFUL;  
  163.     ZwClose(hRegister);  
  164.   
  165.   
  166.   
  167.     //获取服务名      
  168.     pFind = wcsrchr(pRegistryPath->Buffer, '\\');  
  169.     if (pFind)  
  170.         RtlInitUnicodeString(&UnicodeDriverServerName, pFind + sizeof(char));  
  171.     else  
  172.         return STATUS_UNSUCCESSFUL;  
  173.   
  174.     //DefaultInstance      
  175.     RtlInitUnicodeString(&UnicodeValue, L"DefaultInstance");  
  176.     RtlStringCbPrintfExW(szInstances, sizeof(szInstances), NULL, NULL, STRSAFE_FILL_BEHIND_NULL, L"%wZ Instance", &UnicodeDriverServerName);  
  177.     SetValueKey(&UnicodeSzServerNameInstances, &UnicodeValue, REG_SZ, szInstances);  
  178.   
  179.   
  180.     //ProtectFile Instance      
  181.     RtlStringCbPrintfExW(szInstances, sizeof(szInstances), NULL, NULL, STRSAFE_FILL_BEHIND_NULL, L"%wZ\\%wZ Instance", &UnicodeSzServerNameInstances, &UnicodeDriverServerName);  
  182.     RtlInitUnicodeString(&UnicodeSzText, szInstances);  
  183.     InitializeObjectAttributes(&objectAttributes, &UnicodeSzText, OBJ_CASE_INSENSITIVE, NULL, NULL);  
  184.     ntStatus = ZwCreateKey(&hRegister, KEY_ALL_ACCESS, &objectAttributes, 0, NULL, REG_OPTION_NON_VOLATILE, &ulResult);  
  185.     if (hRegister == NULL || ntStatus != STATUS_SUCCESS) return STATUS_UNSUCCESSFUL;  
  186.     ZwClose(hRegister);  
  187.   
  188.     //Altitude      
  189.     RtlInitUnicodeString(&UnicodeValue, L"Altitude");  
  190.     SetValueKey(&UnicodeSzText, &UnicodeValue, REG_SZ, L"399999");  
  191.   
  192.   
  193.     //Flags      
  194.     RtlInitUnicodeString(&UnicodeValue, L"Flags");  
  195.     ulValue = 0;  
  196.     SetValueKey(&UnicodeSzText, &UnicodeValue, REG_DWORD, (wchar_t*)&ulValue);  
  197.   
  198.   
  199.     return ntStatus;  
  200. }  
  201.   
  202. //获取进程名  
  203. PCHAR GetProcessName16ByProcessId(HANDLE ProcessId)  
  204. {  
  205.     //定义变量  
  206.     NTSTATUS status = STATUS_UNSUCCESSFUL;  
  207.     PEPROCESS ProcessObj = NULL;  
  208.     PUCHAR ProcessName = NULL;  
  209.   
  210.     //进程ID和返回一个引用指针的过程EPROCESS结构  
  211.     status = PsLookupProcessByProcessId(ProcessId, &ProcessObj);  
  212.     if (NT_SUCCESS(status))  
  213.     {  
  214.         // ImageFileName    : [16]  "SogouExplorer.e"  
  215.         //使用这个函数,只能获取进程名称是16的长度,后面的被截取了。。。  
  216.         ProcessName = PsGetProcessImageFileName(ProcessObj);  
  217.         ObfDereferenceObject(ProcessObj);  
  218.     }  
  219.   
  220.     return ProcessName;  
  221. }  
  222.   
  223.   
  224.   
  225. VOID CreateProcessNotifyFunction(IN HANDLE  ParentId, IN HANDLE  ProcessId, IN BOOLEAN  Create)  
  226. {  
  227.     if (Create)  
  228.     {  
  229.         char* pName=GetProcessName16ByProcessId(ProcessId);  
  230.         if (pName)  
  231.         {  
  232.             RtlZeroMemory(g_szOutBuf, sizeof(g_szOutBuf));  
  233.             RtlCopyMemory(g_szOutBuf, pName, strlen(pName)+1);  
  234.   
  235.             //设置事件为有信号,通知应用层  
  236.             KeSetEvent(g_pEventObject, 0, FALSE);  
  237.         }  
  238.   
  239.     }  
  240.   
  241.     return;  
  242. }  
  243.   
  244.   
  245. VOID DriverUnload(DRIVER_OBJECT *DriverObject)  
  246. {  
  247.     PsSetCreateProcessNotifyRoutine(CreateProcessNotifyFunction, TRUE);  
  248.     UNICODE_STRING Win32Device;  
  249.     RtlInitUnicodeString(&Win32Device, L"\\DosDevices\\KernelHandle");  
  250.     IoDeleteSymbolicLink(&Win32Device);  
  251.     IoDeleteDevice(DriverObject->DeviceObject);  
  252.     return;  
  253. }  
  254.   
  255. NTSTATUS KernelHandleCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)  
  256. {  
  257.     Irp->IoStatus.Status = STATUS_SUCCESS;  
  258.     Irp->IoStatus.Information = 0;  
  259.     IoCompleteRequest(Irp, IO_NO_INCREMENT);  
  260.     return STATUS_SUCCESS;  
  261. }  
  262.   
  263. NTSTATUS KernelHandleClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)  
  264. {  
  265.     Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;  
  266.     Irp->IoStatus.Information = 0;  
  267.     IoCompleteRequest(Irp, IO_NO_INCREMENT);  
  268.     return Irp->IoStatus.Status;  
  269. }  
  270.   
  271. NTSTATUS KernelHandleDefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)  
  272. {  
  273.     NTSTATUS status = STATUS_SUCCESS;  
  274.     ULONG ulReturn = 0;  
  275.     PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);  
  276.     ULONG ulCtrlCode = stack->Parameters.DeviceIoControl.IoControlCode;  
  277.     PVOID InputBuffer = (PVOID)Irp->AssociatedIrp.SystemBuffer;  
  278.     PVOID OutputBuffer = (PVOID)Irp->AssociatedIrp.SystemBuffer;  
  279.     ULONG ulInputBufferSize = stack->Parameters.DeviceIoControl.InputBufferLength;  
  280.     ULONG ulOutputBufferSize = stack->Parameters.DeviceIoControl.OutputBufferLength;  
  281.   
  282.     switch (ulCtrlCode)  
  283.     {  
  284.     case IOCTL_START:  
  285.     {  
  286.         //设置同步事件  
  287.         if (InputBuffer == NULL || ulInputBufferSize < sizeof(HANDLE))  
  288.         {  
  289.             KdPrint(("Set Event Error~!\n"));  
  290.             break;  
  291.         }  
  292.   
  293.         //取得句柄对象  
  294.         HANDLE hEvent = *(HANDLE*)InputBuffer;  
  295.         status = ObReferenceObjectByHandle(hEvent, GENERIC_ALL, NULL, KernelMode, (PVOID*)&g_pEventObject, &g_ObjectHandleInfo);  
  296.         PsSetCreateProcessNotifyRoutine(CreateProcessNotifyFunction, FALSE);  
  297.         break;  
  298.     }  
  299.     case IOCTL_STOP:  
  300.     {  
  301.       
  302.         //移除进程创建通知函数  
  303.         PsSetCreateProcessNotifyRoutine(CreateProcessNotifyFunction, TRUE);  
  304.         //释放对象引用  
  305.         if (g_pEventObject != NULL)  
  306.         {  
  307.             ObDereferenceObject(g_pEventObject);  
  308.             g_pEventObject = NULL;  
  309.         }  
  310.   
  311.         break;  
  312.     }  
  313.     default:  
  314.         break;  
  315.     }  
  316.   
  317.   
  318.     Irp->IoStatus.Status = STATUS_SUCCESS;  
  319.     Irp->IoStatus.Information = ulOutputBufferSize;  
  320.     IoCompleteRequest(Irp, IO_NO_INCREMENT);  
  321.     return Irp->IoStatus.Status;  
  322. }  
  323.   
  324. NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath)  
  325. {  
  326.     NTSTATUS status;  
  327.     PDEVICE_OBJECT DeviceObject = NULL;  
  328.     UNICODE_STRING DeviceName;  
  329.     UNICODE_STRING Win32Device;  
  330.   
  331.     KdBreakPoint();  
  332.     DriverObject->DriverUnload = DriverUnload;  
  333.     RtlInitUnicodeString(&DeviceName, L"\\Device\\KernelHandle");  
  334.     RtlInitUnicodeString(&Win32Device, L"\\DosDevices\\KernelHandle");  
  335.   
  336.     DriverObject->MajorFunction[IRP_MJ_CREATE] = KernelHandleCreate;  
  337.     DriverObject->MajorFunction[IRP_MJ_CLOSE] = KernelHandleClose;  
  338.     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = KernelHandleDefaultHandler;  
  339.   
  340.   
  341.   
  342.     status = IoCreateDevice(DriverObject,0,&DeviceName,FILE_DEVICE_UNKNOWN,0,FALSE,&DeviceObject);  
  343.     if (!NT_SUCCESS(status))  
  344.         return status;  
  345.     if (!DeviceObject)  
  346.         return STATUS_UNEXPECTED_IO_ERROR;  
  347.     DeviceObject->Flags |= DO_DIRECT_IO;  
  348.     DeviceObject->AlignmentRequirement = FILE_WORD_ALIGNMENT;  
  349.     status = IoCreateSymbolicLink(&Win32Device, &DeviceName);  
  350.     DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;  
  351.   
  352.   
  353.     do  
  354.     {  
  355.         PSECURITY_DESCRIPTOR sd;  
  356.         OBJECT_ATTRIBUTES oa;  
  357.         UNICODE_STRING uniString;  
  358.         status = RegisterMiniFilter(DriverObject, RegistryPath);  
  359.         if (!NT_SUCCESS(status))break;  
  360.   
  361.         status = FltRegisterFilter(DriverObject, &FilterRegistration, &gFilterHandle);  
  362.         if (!NT_SUCCESS(status))break;  
  363.   
  364.         status = FltBuildDefaultSecurityDescriptor(&sd, FLT_PORT_ALL_ACCESS);  
  365.         if (!NT_SUCCESS(status))break;  
  366.   
  367.         RtlInitUnicodeString(&uniString, L"\\CommunicationPort");  
  368.         InitializeObjectAttributes(&oa, &uniString, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, sd);  
  369.         status = FltCreateCommunicationPort(gFilterHandle, &g_ServerPort, &oa, NULL, ConnectNotifyCallback, DisconnectNotifyCallback, MessageNotifyCallback, 1);  
  370.         FltFreeSecurityDescriptor(sd);  
  371.         if (!NT_SUCCESS(status))break;  
  372.   
  373.         status = FltStartFiltering(gFilterHandle);  
  374.         if (!NT_SUCCESS(status))break;  
  375.   
  376.     } while (FALSE);  
  377.   
  378.   
  379.     if (!NT_SUCCESS(status))  
  380.     {  
  381.         if (NULL != g_ServerPort) {  
  382.             FltCloseCommunicationPort(g_ServerPort);  
  383.         }  
  384.   
  385.         if (NULL != gFilterHandle) {  
  386.             FltUnregisterFilter(gFilterHandle);  
  387.         }  
  388.     }  
  389.   
  390.     return STATUS_SUCCESS;  
  391. }  




[cpp]  view plain  copy
  1. #include <windows.h>  
  2. #include <tchar.h>  
  3. #include <stdio.h>  
  4. //这两个文件在VS中没有,在WDK中有.    
  5. //如果要用VS编译要拷贝相应的文件到相应的目录或者改变目录的设置等.    
  6. #include <fltuser.h>    
  7. #pragma comment(lib, "fltLib.lib")    
  8.   
  9. HANDLE hDevice;  
  10. HANDLE g_hKernelEvent = NULL;  
  11. HANDLE g_hPort;  
  12.   
  13. #define     NPMINI_PORT_NAME       L"\\CommunicationPort"   
  14.   
  15. //驱动控制代码  
  16. #define IOCTL_START CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810,METHOD_BUFFERED, FILE_ANY_ACCESS)  
  17. #define IOCTL_STOP CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811,METHOD_BUFFERED, FILE_ANY_ACCESS)  
  18.   
  19.   
  20.   
  21. DWORD WINAPI ThreadProc(LPVOID lpParameter)  
  22. {  
  23.     printf("线程开始运行\n");  
  24.   
  25.     HRESULT hResult;  
  26.   
  27.   
  28.     while (WaitForSingleObject(g_hKernelEvent, INFINITE) == WAIT_OBJECT_0)  
  29.     {  
  30.         printf("收到状态\n");  
  31.   
  32.         wchar_t InBuffer[] = L"test";  
  33.         char OutBuffer[MAX_PATH] = { 0 };  
  34.         DWORD bytesReturned = 0;  
  35.         hResult = FilterSendMessage(g_hPort, InBuffer, lstrlen(InBuffer), OutBuffer, sizeof(OutBuffer), &bytesReturned);  
  36.         if (IS_ERROR(hResult))  
  37.         {  
  38.             printf("FilterSendMessage fail!\n");  
  39.         }  
  40.         else  
  41.         {  
  42.             printf("FilterSendMessage ok!\n");  
  43.         }  
  44.   
  45.         printf("从内核发来的信息是:%s\n", OutBuffer);  
  46.   
  47.         //设置同步事件为无信号,等待下一次通知  
  48.         ResetEvent(g_hKernelEvent);  
  49.     }  
  50.   
  51.     printf("线程结束\n");  
  52.     return 0;  
  53. }  
  54.   
  55.   
  56.   
  57.   
  58.   
  59. int main(void)  
  60. {  
  61.   
  62.     //创建手动重置的事件  
  63.     g_hKernelEvent = CreateEvent(NULL, TRUE, FALSE, NULL);  
  64.   
  65.   
  66.     //打开驱动的符号链接  
  67.     hDevice = CreateFile(L"\\\\.\\KernelHandle", GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  
  68.   
  69.     if (INVALID_HANDLE_VALUE == hDevice)  
  70.     {  
  71.         printf("CreateFile fail!\n");  
  72.         getchar();  
  73.         getchar();  
  74.         return FALSE;  
  75.     }  
  76.     DWORD dwRet;  
  77.     DeviceIoControl(hDevice, IOCTL_START, &g_hKernelEvent, sizeof(g_hKernelEvent), NULL, NULL, &dwRet, NULL);  
  78.   
  79.   
  80.     HRESULT hResult = S_OK;  
  81.     hResult = FilterConnectCommunicationPort(NPMINI_PORT_NAME, 0, NULL, 0, NULL, &g_hPort);  
  82.     if (IS_ERROR(hResult))  
  83.     {  
  84.         printf("FilterConnectCommunicationPort fail!\n");  
  85.         getchar();  
  86.         getchar();  
  87.         return hResult;  
  88.     }  
  89.     printf("FilterConnectCommunicationPort\n");  
  90.   
  91.     HANDLE hThread =CreateThread(NULL, NULL, ThreadProc, NULL, NULL, NULL);  
  92.     CloseHandle(hThread);  
  93.   
  94.   
  95.     getchar();  
  96.     getchar();  
  97.     CloseHandle(g_hPort);  
  98.     DeviceIoControl(hDevice, IOCTL_STOP, NULL, 0, NULL, NULL, &dwRet, NULL);  
  99.     CloseHandle(hDevice);  
  100.     return 0;  
  101. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值