- #include <ntddk.h>
-
-
- #define CONST_CALLBACK_NAME L"//Callback//TcpConnectionCallBack"
-
-
- PVOID CallbackRegisterationHandle = NULL;
-
-
- NTSTATUS DriverEntry(
- IN PDRIVER_OBJECT DriverObject,
- IN PUNICODE_STRING RegistryPath
- );
-
-
- VOID DriverUnload(
- IN PDRIVER_OBJECT DriverObject
- );
-
-
- NTSTATUS RegisterCallbackNotify(
- IN PUNICODE_STRING CallbackName
- );
-
-
- VOID UnRegisterCallbackNotify(
- IN VOID
- );
-
-
- VOID CallbackFunc(
- IN PVOID CallbackContext,
- IN PVOID Argument1,
- IN PVOID Argument2
- );
-
- #ifdef ALLOC_PARGMA
- #pragma alloc_text(INIT, DriverEntry)
- #pragma alloc_text(PAGE, DriverUnload)
- #pragma alloc_text(PAGE, RegisterCallbackNotify)
- #pragma alloc_text(PAGE, UnRegisterCallbackNotify)
- #endif // ALLOC_PRAGMA
-
-
-
-
- NTSTATUS DriverEntry(
- IN PDRIVER_OBJECT DriverObject,
- IN PUNICODE_STRING RegistryPath
- )
- {
- NTSTATUS status = STATUS_SUCCESS;
-
-
- UNICODE_STRING callbackName;
- RtlInitUnicodeString(&callbackName, CONST_CALLBACK_NAME);
- KdPrint(("DriverEntry invoke."));
-
- DriverObject->DriverUnload = DriverUnload;
- if (!NT_SUCCESS(RegisterCallbackNotify(&callbackName))) {
-
- KdPrint(("RegisterCallbackNotify failed. CallbackName=%wZ/n", &callbackName));
- } else {
-
- KdPrint(("RegisterCallbackNotify ok. CallbackName=%wZ/n", &callbackName));
- }
- return status;
- }
-
-
-
-
- VOID DriverUnload(
- IN PDRIVER_OBJECT DriverObject
- )
- {
- KdPrint(("DriverUnload invoke./n"));
- UnRegisterCallbackNotify();
- }
-
-
-
-
- NTSTATUS RegisterCallbackNotify(
- IN PUNICODE_STRING CallbackName
- )
- {
- PCALLBACK_OBJECT callbackObject;
- OBJECT_ATTRIBUTES objectAttributes;
- NTSTATUS status;
-
- PAGED_CODE();
-
- KdPrint(("RegisterCallbackNotify invoke./n"));
-
- InitializeObjectAttributes(
- &objectAttributes,
- CallbackName,
- OBJ_CASE_INSENSITIVE | OBJ_PERMANENT,
- NULL,
- NULL
- );
-
- status = ExCreateCallback(
- &callbackObject,
- &objectAttributes,
- TRUE,
- TRUE
- );
- if (!NT_SUCCESS(status)) {
- KdPrint(("ExCreateCallback failed./n"));
- return status;
- }
-
- CallbackRegisterationHandle = ExRegisterCallback(
- callbackObject,
- CallbackFunc,
- (PVOID)NULL
- );
- if (!CallbackRegisterationHandle) {
- return STATUS_UNSUCCESSFUL;
- }
-
- ObDereferenceObject(callbackObject);
- return STATUS_SUCCESS;
- }
-
-
-
-
- VOID UnRegisterCallbackNotify(
- IN VOID
- )
- {
- KdPrint(("UnRegisterCallbackNotify invoke./n"));
- if (!CallbackRegisterationHandle) {
- KdPrint(("ExUnregisterCallback invoke.CallbackRegisterationHandle != NULL/n"));
- ExUnregisterCallback(CallbackRegisterationHandle);
- }
- }
-
-
-
-
- VOID CallbackFunc(
- IN PVOID CallbackContext,
- IN PVOID Argument1,
- IN PVOID Argument2
- )
- {
- PEPROCESS curProcess;
- KdPrint(("CallbackFunc invoke./n"));
- curProcess = PsGetCurrentProcess();
- KdPrint(("ProcessId=%ld./n", PsGetProcessId(curProcess)));
- }