驱动中关于Callback 例程用法

来源:互联网 发布:淘宝网卖美女尿qq号 编辑:程序博客网 时间:2024/06/06 10:57
  1. #include <ntddk.h>  
  2.   
  3. // 准备接收该对象的回调消息  
  4. #define CONST_CALLBACK_NAME L"//Callback//TcpConnectionCallBack"  
  5.   
  6. // 注册成功后,返回的句柄,卸载时候需要用  
  7. PVOID CallbackRegisterationHandle = NULL;  
  8.   
  9. // 驱动入口例程  
  10. NTSTATUS DriverEntry(  
  11.     IN PDRIVER_OBJECT DriverObject,  
  12.     IN PUNICODE_STRING RegistryPath  
  13.     );  
  14.   
  15. // 驱动卸载例程  
  16. VOID DriverUnload(  
  17.     IN PDRIVER_OBJECT DriverObject  
  18.     );  
  19.   
  20. // 注册例程  
  21. NTSTATUS RegisterCallbackNotify(  
  22.     IN PUNICODE_STRING CallbackName  
  23.     );  
  24.   
  25. // 反注册例程  
  26. VOID UnRegisterCallbackNotify(  
  27.     IN VOID  
  28.     );  
  29.   
  30. // 回调例程  
  31. VOID CallbackFunc(  
  32.     IN PVOID CallbackContext,  
  33.     IN PVOID Argument1,  
  34.     IN PVOID Argument2  
  35.     );  
  36.   
  37. #ifdef ALLOC_PARGMA  
  38. #pragma alloc_text(INIT, DriverEntry)  
  39. #pragma alloc_text(PAGE, DriverUnload)  
  40. #pragma alloc_text(PAGE, RegisterCallbackNotify)  
  41. #pragma alloc_text(PAGE, UnRegisterCallbackNotify)  
  42. #endif // ALLOC_PRAGMA  
  43.   
  44. /* 
  45.  描述:驱动入口例程 
  46.  */  
  47. NTSTATUS DriverEntry(  
  48.     IN PDRIVER_OBJECT DriverObject,  
  49.     IN PUNICODE_STRING RegistryPath  
  50.     )  
  51. {  
  52.     NTSTATUS status = STATUS_SUCCESS;  
  53.       
  54.     // 初始化要注册的回调对象的名称  
  55.     UNICODE_STRING callbackName;  
  56.     RtlInitUnicodeString(&callbackName, CONST_CALLBACK_NAME);  
  57.     KdPrint(("DriverEntry invoke."));  
  58.     // 动态卸载  
  59.     DriverObject->DriverUnload = DriverUnload;  
  60.     if (!NT_SUCCESS(RegisterCallbackNotify(&callbackName))) {  
  61.         // 注册失败  
  62.         KdPrint(("RegisterCallbackNotify failed. CallbackName=%wZ/n", &callbackName));  
  63.     } else {  
  64.         // 注册成功  
  65.         KdPrint(("RegisterCallbackNotify ok. CallbackName=%wZ/n", &callbackName));  
  66.     }  
  67.     return status;  
  68. }  
  69.   
  70. /* 
  71.  描述:驱动卸载例程 
  72.  */  
  73. VOID DriverUnload(  
  74.     IN PDRIVER_OBJECT DriverObject  
  75.     )  
  76. {  
  77.     KdPrint(("DriverUnload invoke./n"));  
  78.     UnRegisterCallbackNotify();  
  79. }  
  80.   
  81. /* 
  82.  描述:注册例程 
  83.  */  
  84. NTSTATUS RegisterCallbackNotify(  
  85.     IN PUNICODE_STRING CallbackName  
  86.     )  
  87. {  
  88.     PCALLBACK_OBJECT callbackObject;  
  89.     OBJECT_ATTRIBUTES objectAttributes;  
  90.     NTSTATUS status;  
  91.       
  92.     PAGED_CODE();  
  93.       
  94.     KdPrint(("RegisterCallbackNotify invoke./n"));  
  95.     // 初始化对象属性  
  96.     InitializeObjectAttributes(  
  97.         &objectAttributes,  
  98.         CallbackName,  
  99.         OBJ_CASE_INSENSITIVE | OBJ_PERMANENT,  
  100.         NULL,  
  101.         NULL  
  102.         );  
  103.     // 创建回调对象,可能含有打开的意思  
  104.     status = ExCreateCallback(  
  105.         &callbackObject,  
  106.         &objectAttributes,  
  107.         TRUE,  
  108.         TRUE  
  109.         );  
  110.     if (!NT_SUCCESS(status)) {  
  111.         KdPrint(("ExCreateCallback failed./n"));  
  112.         return status;  
  113.     }  
  114.     // 给回调对象注册我们自己的回调例程  
  115.     CallbackRegisterationHandle = ExRegisterCallback(  
  116.         callbackObject,  
  117.         CallbackFunc,  
  118.         (PVOID)NULL  
  119.         );  
  120.     if (!CallbackRegisterationHandle) {  
  121.         return STATUS_UNSUCCESSFUL;  
  122.     }  
  123.     // 注册成功时,回调对象要解引用一次  
  124.     ObDereferenceObject(callbackObject);  
  125.     return STATUS_SUCCESS;  
  126. }  
  127.   
  128. /* 
  129.  描述:反注册例程 
  130.  */  
  131. VOID UnRegisterCallbackNotify(  
  132.     IN VOID  
  133.     )  
  134. {  
  135.     KdPrint(("UnRegisterCallbackNotify invoke./n"));  
  136.     if (!CallbackRegisterationHandle) {  
  137.         KdPrint(("ExUnregisterCallback invoke.CallbackRegisterationHandle != NULL/n"));  
  138.         ExUnregisterCallback(CallbackRegisterationHandle);  
  139.     }  
  140. }  
  141.   
  142. /* 
  143.  描述:回调例程 
  144.  */  
  145. VOID CallbackFunc(  
  146.     IN PVOID CallbackContext,  
  147.     IN PVOID Argument1,  
  148.     IN PVOID Argument2  
  149.     )  
  150. {  
  151.     PEPROCESS curProcess;  
  152.     KdPrint(("CallbackFunc invoke./n"));  
  153.     curProcess = PsGetCurrentProcess();  
  154.     KdPrint(("ProcessId=%ld./n", PsGetProcessId(curProcess)));  


原创粉丝点击