логирование ip пакетов ....

Тема в разделе "WASM.NT.KERNEL", создана пользователем alekseyWasen, 3 окт 2009.

  1. alekseyWasen

    alekseyWasen New Member

    Публикаций:
    0
    Регистрация:
    2 окт 2009
    Сообщения:
    6
    прошу помочь мне в этом ... дело в том что я устанавливаю обычный драйвер хук .... хук как известно работает с при IRQL >PASSIVE_LEVEL .... но суть в том что нужно вызывать функи zwcreatefile , etc ... но они работают только на пассиве .... поэтому создаю поток в driverentry, но как только запускается функция хука ... то поток как будто замораживается .......

    вобщем даю примерный код который поможет вам понять суть .....
    функция потока LogpThreadProcedure но я никогда не вижу сообщения ThREAD2 (((((

    и еще вопрос .... какой существует аналог для Sleep(int) только в кернеле

    Код (Text):
    1. #include <string.h>
    2. #include <stdio.h>
    3. #include <ntddk.h>
    4. #include <ntddndis.h>
    5. #include <pfhook.h>
    6. #include "DrvFltIp.h"
    7.  
    8.  
    9. #define dprintf DbgPrint
    10.  
    11. NTSTATUS DrvDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
    12. VOID DrvUnload(IN PDRIVER_OBJECT DriverObject);
    13.  
    14. NTSTATUS SetFilterFunction(PacketFilterExtensionPtr filterFunction);
    15.  
    16. NTSTATUS AddFilterToList(IPFilter *pf);
    17. void ClearFilterList(void);
    18. PF_FORWARD_ACTION cbFilterFunction(IN unsigned char *PacketHeader,IN unsigned char *Packet, IN unsigned int PacketLength, IN unsigned int RecvInterfaceIndex, IN unsigned int SendInterfaceIndex, IN unsigned long RecvLinkNextHop, IN unsigned long SendLinkNextHop);
    19.  
    20. #define NT_DEVICE_NAME L"\\Device\\DrvFltIp"
    21. #define DOS_DEVICE_NAME L"\\DosDevices\\DrvFltIp"
    22.  
    23.  
    24. struct filterList *first = NULL;
    25. struct filterList *last = NULL;
    26.  
    27. typedef struct _PACKET {
    28.     LIST_ENTRY li;
    29.     char Packet[64*1024];
    30.     int iLenPacket;
    31.  
    32. }PACKET ;
    33. LIST_ENTRY li;
    34.  
    35. PACKET * pp;
    36. int gflag ;
    37.  
    38.  
    39. VOID LogpThreadProcedure( IN PVOID StartContext )
    40. {  
    41.  
    42.     while(gflag==1){
    43.         k++;
    44.     }
    45.         dprintf("id= %d",k);
    46.  
    47.    
    48.    
    49.    
    50.     DbgPrint("ThREAD2");
    51. }
    52.  
    53.  
    54.  
    55.  
    56.  
    57. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
    58. {
    59.    
    60.     PDEVICE_OBJECT         deviceObject = NULL;
    61.     NTSTATUS               ntStatus;
    62.     UNICODE_STRING         deviceNameUnicodeString;
    63.     UNICODE_STRING         deviceLinkUnicodeString;
    64.    
    65.     NTSTATUS          status;
    66. UNICODE_STRING    fullFileName;
    67. HANDLE            fileHandle;
    68. IO_STATUS_BLOCK   iostatus;
    69. OBJECT_ATTRIBUTES oa;
    70. ULONG len;
    71.  HANDLE   handle;
    72.     NTSTATUS ntstatus;
    73.     IO_STATUS_BLOCK    ioStatusBlock;
    74.     HANDLE hLogThread;
    75.    
    76.     pp=(PACKET*)ExAllocatePool(NonPagedPool,sizeof(PACKET));   
    77.     gflag =1;
    78.     pp->iLenPacket=0;
    79.     DbgPrint("DrvFltIp.SYS: entering DriverEntry\n");
    80.  
    81.  
    82.     //we have to create the device
    83.     RtlInitUnicodeString(&deviceNameUnicodeString, NT_DEVICE_NAME);
    84.  
    85.     ntStatus = IoCreateDevice(DriverObject,
    86.                                 0,
    87.                                 &deviceNameUnicodeString,
    88.                                 FILE_DEVICE_DRVFLTIP,
    89.                                 0,
    90.                                 FALSE,
    91.                                 &deviceObject);
    92.  
    93.  
    94.     if ( NT_SUCCESS(ntStatus) )
    95.     {
    96.    
    97.         // Create a symbolic link that Win32 apps can specify to gain access
    98.         // to this driver/device
    99.         RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);
    100.  
    101.         ntStatus = IoCreateSymbolicLink(&deviceLinkUnicodeString, &deviceNameUnicodeString);
    102.  
    103.         if ( !NT_SUCCESS(ntStatus) )
    104.         {
    105.             dprintf("DrvFltIp.SYS: IoCreateSymbolicLink failed\n");
    106.         }
    107.  
    108.         //
    109.         // Create dispatch points for device control, create, close.
    110.         //
    111.  
    112.        
    113.         DriverObject->MajorFunction[IRP_MJ_CREATE]         =
    114.         DriverObject->MajorFunction[IRP_MJ_CLOSE]          =
    115.         DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DrvDispatch;
    116.         DriverObject->DriverUnload                         = DrvUnload;
    117.         DbgPrint("NEEEEEEEEWWWWWW");
    118.         PsCreateSystemThread(&hLogThread, THREAD_ALL_ACCESS, NULL, NULL, NULL, (PKSTART_ROUTINE)LogpThreadProcedure, NULL);
    119. /
    120.  
    121.     if ( !NT_SUCCESS(ntStatus) )
    122.     {
    123.         dprintf("Error in initialization. Unloading...");
    124.  
    125.         DrvUnload(DriverObject);
    126.     }
    127.  
    128.     return ntStatus;
    129. }
    130.  
    131.  
    132. NTSTATUS DrvDispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    133. {
    134.  
    135.     PIO_STACK_LOCATION  irpStack;
    136.     PVOID               ioBuffer;
    137.     ULONG               inputBufferLength;
    138.     ULONG               outputBufferLength;
    139.     ULONG               ioControlCode;
    140.     NTSTATUS            ntStatus;
    141.  
    142.     Irp->IoStatus.Status      = STATUS_SUCCESS;
    143.     Irp->IoStatus.Information = 0;
    144.  
    145.  
    146.  
    147.     irpStack = IoGetCurrentIrpStackLocation(Irp);
    148.  
    149.  
    150.     ioBuffer           = Irp->AssociatedIrp.SystemBuffer;
    151.     inputBufferLength  = irpStack->Parameters.DeviceIoControl.InputBufferLength;
    152.     outputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
    153.  
    154.     switch (irpStack->MajorFunction)
    155.     {
    156.     case IRP_MJ_CREATE:
    157.        
    158.         dprintf("DrvFltIp.SYS: IRP_MJ_CREATE\n");
    159.  
    160.         break;
    161.  
    162.     case IRP_MJ_CLOSE:
    163.  
    164.         dprintf("DrvFltIp.SYS: IRP_MJ_CLOSE\n");
    165.  
    166.         break;
    167.  
    168.     case IRP_MJ_DEVICE_CONTROL:
    169.  
    170.         dprintf("DrvFltIp.SYS: IRP_MJ_DEVICE_CONTROL\n");
    171.  
    172.         ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
    173.  
    174.         switch (ioControlCode)
    175.         {
    176.             // ioctl code to start filtering
    177.             case START_IP_HOOK:
    178.             {
    179.                 SetFilterFunction(cbFilterFunction);
    180.  
    181.                 break;
    182.             }
    183.  
    184.             // ioctl to stop filtering
    185.             case STOP_IP_HOOK:
    186.             {
    187.                 SetFilterFunction(NULL);
    188.                
    189.                 break;
    190.             }
    191.  
    192.             // ioctl to add a filter rule
    193.             case ADD_FILTER:
    194.             {
    195.                 if(inputBufferLength == sizeof(IPFilter))
    196.                 {
    197.                     IPFilter *nf;
    198.  
    199.                     nf = (IPFilter *)ioBuffer;
    200.                    
    201.                     AddFilterToList(nf);
    202.                 }
    203.  
    204.                 break;
    205.             }
    206.  
    207.             // ioctl to free filter rule list
    208.             case CLEAR_FILTER:
    209.             {
    210.                 ClearFilterList();
    211.  
    212.                 break;
    213.             }
    214.  
    215.             default:
    216.                 Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
    217.  
    218.                 dprintf("DrvFltIp.SYS: unknown IRP_MJ_DEVICE_CONTROL\n");
    219.  
    220.                 break;
    221.         }
    222.  
    223.         break;
    224.     }
    225.  
    226.  
    227.     //
    228.     // DON'T get cute and try to use the status field of
    229.     // the irp in the return status.  That IRP IS GONE as
    230.     // soon as you call IoCompleteRequest.
    231.     //
    232.  
    233.     ntStatus = Irp->IoStatus.Status;
    234.  
    235.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
    236.  
    237.  
    238.     //
    239.     // We never have pending operation so always return the status code.
    240.     //
    241.  
    242.     return ntStatus;
    243. }
    244.  
    245. /*++
    246.  
    247. Routine Description:
    248.  
    249.     Free all the allocated resources, etc.
    250.  
    251. Arguments:
    252.  
    253.     DriverObject - pointer to a driver object
    254.  
    255. Return Value:
    256.  
    257.  
    258. --*/
    259. VOID DrvUnload(IN PDRIVER_OBJECT DriverObject)
    260. {
    261.     UNICODE_STRING         deviceLinkUnicodeString;
    262.  
    263.     dprintf("DrvFltIp.SYS: Unloading\n");
    264.     ExFreePool(pp);
    265.     SetFilterFunction(NULL);
    266.  
    267.     // Free any resources
    268.     ClearFilterList();
    269.    
    270.     // Delete the symbolic link
    271.     RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);
    272.     IoDeleteSymbolicLink(&deviceLinkUnicodeString);
    273.  
    274.    
    275.     // Delete the device object
    276.     IoDeleteDevice(DriverObject->DeviceObject);
    277. }
    278.  
    279.  
    280.  
    281. /*++
    282.  
    283. Routine Description:
    284.  
    285.     Get a reference to IpFilterDriver so we will be able to install the filter
    286.  
    287. Arguments:
    288.  
    289.     pDeviceObject - pointer to a pointer of device object
    290.  
    291.     pFileObject   - pointer to a pointer of file object
    292.  
    293. Return Value:
    294.  
    295.     STATUS_SUCCESS if successful,
    296.     STATUS_UNSUCCESSFUL otherwise
    297.  
    298. --*/
    299. NTSTATUS SetFilterFunction(PacketFilterExtensionPtr filterFunction)
    300. {
    301.     NTSTATUS status = STATUS_SUCCESS, waitStatus=STATUS_SUCCESS;
    302.     UNICODE_STRING filterName;
    303.     PDEVICE_OBJECT ipDeviceObject=NULL;
    304.     PFILE_OBJECT ipFileObject=NULL;
    305.  
    306.     PF_SET_EXTENSION_HOOK_INFO filterData;
    307.  
    308.     KEVENT event;
    309.     IO_STATUS_BLOCK ioStatus;
    310.     PIRP irp;
    311.  
    312.     dprintf("Getting pointer to IpFilterDriver\n");
    313.    
    314.     //first of all, we have to get a pointer to IpFilterDriver Device
    315.     RtlInitUnicodeString(&filterName, DD_IPFLTRDRVR_DEVICE_NAME);
    316.     status = IoGetDeviceObjectPointer(&filterName,STANDARD_RIGHTS_ALL, &ipFileObject, &ipDeviceObject);
    317.    
    318.     if(NT_SUCCESS(status))
    319.     {
    320.         //initialize the struct with functions parameters
    321.         filterData.ExtensionPointer = filterFunction;
    322.  
    323.         //we need initialize the event used later by the IpFilterDriver to signal us
    324.         //when it finished its work
    325.         KeInitializeEvent(&event, NotificationEvent, FALSE);
    326.  
    327.         //we build the irp needed to establish fitler function
    328.         irp = IoBuildDeviceIoControlRequest(IOCTL_PF_SET_EXTENSION_POINTER,
    329.                                             ipDeviceObject,
    330.                                             (PVOID) &filterData,
    331.                                             sizeof(PF_SET_EXTENSION_HOOK_INFO),
    332.                                             NULL,
    333.                                             0,
    334.                                             FALSE,
    335.                                             &event,
    336.                                             &ioStatus);
    337.  
    338.  
    339.         if(irp != NULL)
    340.         {
    341.             // we send the IRP
    342.             status = IoCallDriver(ipDeviceObject, irp);
    343.  
    344.             //and finally, we wait for "acknowledge" of IpDriverFilter
    345.             if (status == STATUS_PENDING)
    346.             {
    347.                 waitStatus = KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
    348.  
    349.                 if (waitStatus  != STATUS_SUCCESS )
    350.                     dprintf("Error waiting for IpFilterDriver response.");
    351.             }
    352.  
    353.             status = ioStatus.Status;
    354.  
    355.             if(!NT_SUCCESS(status))
    356.                 dprintf("Error, IO error with ipFilterDriver\n");
    357.         }
    358.        
    359.         else
    360.         {
    361.             //if we cant allocate the space, we return the corresponding code error
    362.             status = STATUS_INSUFFICIENT_RESOURCES;
    363.  
    364.             dprintf("Error building IpFilterDriver IRP\n");
    365.         }
    366.  
    367.         if(ipFileObject != NULL)
    368.             ObDereferenceObject(ipFileObject);
    369.        
    370.         ipFileObject = NULL;
    371.         ipDeviceObject = NULL;
    372.     }
    373.    
    374.     else
    375.         dprintf("Error while getting the pointer\n");
    376.    
    377.     return status;
    378. }
    379.  
    380.  
    381.  
    382.  
    383. /*++
    384.  
    385. Routine Description:
    386.  
    387.     Add a rule to the filter list
    388.  
    389. Arguments:
    390.  
    391.       pf - pointer to filter rule
    392.  
    393.  
    394. Return Value:
    395.  
    396.     STATUS_SUCCESS if successful,
    397.     STATUS_INSUFFICIENT_RESOURCES otherwise
    398.  
    399. --*/
    400. NTSTATUS AddFilterToList(IPFilter *pf)
    401. {
    402.     struct filterList *aux=NULL;
    403.  
    404.     // first, we reserve memory (non paged) to the new filter
    405.     aux=(struct filterList *) ExAllocatePool(NonPagedPool, sizeof(struct filterList));
    406.    
    407.     if(aux == NULL)
    408.     {
    409.         dprintf("Problem reserving memory\n");
    410.    
    411.         return STATUS_INSUFFICIENT_RESOURCES;
    412.     }
    413.  
    414.     //fill the new structure
    415.     aux->ipf.destinationIp = pf->destinationIp;
    416.     aux->ipf.sourceIp = pf->sourceIp;
    417.  
    418.     aux->ipf.destinationMask = pf->destinationMask;
    419.     aux->ipf.sourceMask = pf->sourceMask;
    420.  
    421.     aux->ipf.destinationPort = pf->destinationPort;
    422.     aux->ipf.sourcePort = pf->sourcePort;
    423.  
    424.     aux->ipf.protocol = pf->protocol;
    425.  
    426.     aux->ipf.drop=pf->drop;
    427.  
    428.     //Add the new filter to the filter list
    429.     if(first == NULL)
    430.     {
    431.         first = last = aux;
    432.        
    433.         first->next = NULL;
    434.     }
    435.    
    436.     else
    437.     {
    438.         last->next = aux;
    439.         last = aux;
    440.         last->next = NULL;
    441.     }
    442.  
    443.     dprintf("Rule Added\n\t%x %x\n\t%x %x\n\t%x\n\t%x", aux->ipf.sourceIp
    444.                                                       , aux->ipf.sourceMask
    445.                                                       , aux->ipf.destinationIp
    446.                                                       , aux->ipf.destinationMask
    447.                                                       , aux->ipf.sourcePort
    448.                                                       , aux->ipf.destinationPort);
    449.  
    450.     return STATUS_SUCCESS;
    451. }
    452.  
    453.  
    454.  
    455.  
    456. /*++
    457.  
    458. Routine Description:
    459.  
    460.     Remove the linked list where the rules were saved.
    461.  
    462. Arguments:
    463.  
    464.  
    465. Return Value:
    466.  
    467.  
    468. --*/
    469. void ClearFilterList(void)
    470. {
    471.     struct filterList *aux = NULL;
    472.  
    473.     //free the linked list
    474.     dprintf("Removing the filter List...");
    475.    
    476.     while(first != NULL)
    477.     {
    478.         aux = first;
    479.         first = first->next;
    480.         ExFreePool(aux);
    481.  
    482.         dprintf("One Rule removed");
    483.     }
    484.  
    485.     first = last = NULL;
    486.  
    487.     dprintf("Removed is complete.");
    488. }
    489.  
    490.  
    491. /*++
    492.  
    493. Routine Description:
    494.  
    495.     Filter each packet is received or sended
    496.  
    497.     To see parameters and return you can read it in MSDN
    498. --*/
    499.  
    500. PF_FORWARD_ACTION cbFilterFunction(IN unsigned char *PacketHeader,IN unsigned char *Packet, IN unsigned int PacketLength, IN unsigned int RecvInterfaceIndex, IN unsigned int SendInterfaceIndex, IN unsigned long RecvLinkNextHop, IN unsigned long SendLinkNextHop)
    501. {
    502.     IPPacket *ipp;
    503.     TCPHeader *tcph;
    504.     UDPHeader *udph;
    505.  
    506.     int countRule=0;
    507.  
    508.     struct filterList *aux = first;
    509.  
    510.     //we "extract" the ip Header
    511.     ipp=(IPPacket *)PacketHeader;
    512.  
    513.     dprintf("Tamaсo: %x, %d", PacketLength, RecvInterfaceIndex);
    514.     dprintf("Source: %x\nDestination: %x\nProtocol: %d", ipp->ipSource, ipp->ipDestination, ipp->ipProtocol);
    515.    
    516.     //TCP -> protocol = 6
    517.     //we accept all packets of established connections
    518.     if(ipp->ipProtocol == 6)
    519.     {
    520.                
    521.                 ULONG len;
    522.                 HANDLE   handle;
    523.                 NTSTATUS ntstatus;
    524.                 IO_STATUS_BLOCK    ioStatusBlock;
    525.    
    526.                 KIRQL oldrql,irql;
    527.                 NTSTATUS          status;
    528.                 UNICODE_STRING    fullFileName;
    529.                 HANDLE hf;
    530.                 IO_STATUS_BLOCK   iostatus;
    531.                 OBJECT_ATTRIBUTES oa;  
    532.                 PACKET *new_pack;
    533.                
    534.                
    535.                 oldrql=KeGetCurrentIrql();
    536.                 if(gflag==1){
    537.                     pp->iLenPacket=PacketLength;
    538.                     //InsertTailList(&li,&new_pack->li);
    539.                     DbgPrint("ADD LIST");
    540.                     gflag=0;
    541.                 }
    542.                 ;
    543.                
    544.                 dprintf("SNIFFFFFFFFFF = %d",pp->iLenPacket);
    545.                
    546.                 //KeLowerIrql(PASSIVE_LEVEL);
    547.             /* 
    548.                 RtlInitUnicodeString( &fullFileName,
    549.                       L"\\??\\C:\\testfile.txt");
    550.  
    551.                 InitializeObjectAttributes( &oa,
    552.                             &fullFileName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
    553.                             NULL,
    554.                             NULL );
    555.  
    556.                 ntstatus = ZwCreateFile(&handle,
    557.                             GENERIC_WRITE,
    558.                             &oa, &ioStatusBlock, NULL,
    559.                             FILE_ATTRIBUTE_NORMAL,
    560.                             0,
    561.                             FILE_OVERWRITE_IF,
    562.                             FILE_SYNCHRONOUS_IO_NONALERT,
    563.                             NULL, 0);
    564.  
    565.                 if( NT_SUCCESS(ntstatus)){
    566.        
    567.                     ntstatus = ZwWriteFile(handle, NULL, NULL, NULL, &ioStatusBlock,&fullFileName, 10, NULL, NULL);
    568.                     ZwClose(handle);
    569.                 }
    570.             */ 
    571.                 //KeRaiseIrql(oldrql,&irql);
    572.                                            
    573.         tcph=(TCPHeader *)Packet;
    574.  
    575.         dprintf("FLAGS: %x\n", tcph->flags);
    576.        
    577.         //if we havent the bit SYN activate, we pass the packets
    578.         if(!(tcph->flags & 0x02))
    579.             return PF_FORWARD;
    580.     }
    581.  
    582.     //otherwise, we compare the packet with our rules
    583.     while(aux != NULL)
    584.     {
    585.         dprintf("Comparing with Rule %d", countRule);
    586.  
    587.         //if protocol is the same....
    588.         if(aux->ipf.protocol == 0 || ipp->ipProtocol == aux->ipf.protocol)
    589.         {
    590.             //we look in source Address
    591.             if(aux->ipf.sourceIp != 0 && (ipp->ipSource & aux->ipf.sourceMask) != aux->ipf.sourceIp)
    592.             {
    593.                 aux=aux->next;
    594.            
    595.                 countRule++;
    596.                 continue;
    597.             }
    598.                                    
    599.             // we look in destination address
    600.             if(aux->ipf.destinationIp != 0 && (ipp->ipDestination & aux->ipf.destinationMask) != aux->ipf.destinationIp)
    601.             {
    602.                 aux=aux->next;
    603.  
    604.                 countRule++;
    605.                 continue;
    606.             }
    607.            
    608.             //if we have a tcp packet, we look in ports
    609.             //tcp, protocol = 6
    610.             if(ipp->ipProtocol == 6)
    611.             {
    612.                 if(aux->ipf.sourcePort == 0 || tcph->sourcePort == aux->ipf.sourcePort)
    613.                 {
    614.                     if(aux->ipf.destinationPort == 0 || tcph->destinationPort == aux->ipf.destinationPort) //puerto tcp destino
    615.                     {
    616.                         //now we decided what to do with the packet
    617.                         if(aux->ipf.drop)
    618.                                  return  PF_DROP;
    619.                             else
    620.                                 return PF_FORWARD;
    621.                     }
    622.                 }
    623.             }
    624.                
    625.             //udp, protocol = 17
    626.             else if(ipp->ipProtocol == 17)
    627.             {
    628.                 udph=(UDPHeader *)Packet;
    629.  
    630.                 if(aux->ipf.sourcePort == 0 || udph->sourcePort == aux->ipf.sourcePort)
    631.                 {
    632.                     if(aux->ipf.destinationPort == 0 || udph->destinationPort == aux->ipf.destinationPort)
    633.                     {
    634.                         //now we decided what to do with the packet
    635.                         if(aux->ipf.drop)
    636.                             return  PF_DROP;
    637.                        
    638.                         else
    639.                             return PF_FORWARD;
    640.                     }
    641.                 }
    642.             }  
    643.            
    644.             else
    645.             {
    646.                 //for other packet we dont look more and ....
    647.                 //now we decided what to do with the packet
    648.                 if(aux->ipf.drop)
    649.                     return  PF_DROP;
    650.                 else
    651.                     return PF_FORWARD;
    652.             }  
    653.         }
    654.        
    655.         //compare with the next rule
    656.         countRule++;
    657.         aux=aux->next;
    658.     }
    659.  
    660.     //we accept all not registered
    661.     return PF_FORWARD;
    662. }
     
  2. retmas

    retmas New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2005
    Сообщения:
    100
    KeDelayExecutionThread
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    А что будет, когда другой драйвер установит собственный хук также через IOCTL_PF_SET_EXTENSION_POINTER?