При синхронизации через Object вижу синий экран

Тема в разделе "WASM.WIN32", создана пользователем hawk, 2 янв 2009.

  1. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Здравствуйте.
    Вот прочитал на www.wasm.ru интересный способ получения информации от драйвера используя объект.
    Вот код драйвера:
    Код (Text):
    1. #include <ntddk.h>
    2. //#include <winnt.h>      
    3. #include "Driver.h"
    4.  
    5.  
    6.  
    7. VOID UnloadRoutine(IN PDRIVER_OBJECT pDriverObject);
    8. NTSTATUS Create_File_IRProcessing(IN PDEVICE_OBJECT fdo,IN PIRP Irp);
    9. NTSTATUS Close_HandleIRProcessing(IN PDEVICE_OBJECT fdo,IN PIRP Irp);
    10. NTSTATUS ReadWrite_IRPhandler(IN PDEVICE_OBJECT fdo,IN PIRP Irp);
    11. NTSTATUS DeviceControlRutine(IN PDEVICE_OBJECT fdo,IN PIRP Irp);
    12.  
    13. KSPIN_LOCK MySpinLock;  
    14.  
    15.  
    16.  
    17. typedef PVOID* PNTPROC;
    18. typedef DWORD (ULONG);
    19. typedef DWORD*  PDWORD;
    20. typedef unsigned char (BYTE);
    21. typedef BYTE* PBYTE;
    22.  
    23. typedef struct _SYSTEM_SERVICE_TABLE
    24. {
    25.     PNTPROC ServiceTable;
    26.     PDWORD  CounterTable;
    27.     ULONG   ServiceLimit;
    28.     PBYTE   ArgumentTable;
    29. }
    30. SYSTEM_SERVICE_TABLE ,
    31. * PSYSTEM_SERVICE_TABLE ,
    32. * * PPSYSTEM_SERVICE_TABLE ;
    33.  
    34.  
    35. typedef struct _SERVICE_DESCRIPTOR_TABLE {
    36.    SYSTEM_SERVICE_TABLE ntoskrnl;  //SST для ntoskrnl.exe
    37.    SYSTEM_SERVICE_TABLE win32k;    //SST для win32k.sys
    38.    SYSTEM_SERVICE_TABLE unused1;   //не используется
    39.    SYSTEM_SERVICE_TABLE unused2;   //не используется
    40. }
    41. SERVICE_DESCRIPTOR_TABLE ,
    42. * PSERVICE_DESCRIPTOR_TABLE,
    43. * * PPSERVICE_DESCRIPTOR_TABLE ;
    44.  
    45. //макрос для простого доступа к SST ядра
    46. #define NTCALL(_function) KeServiceDescriptorTable->ntoskrnl.ServiceTable[_function]
    47.  
    48. //импортируем указатель на SDT
    49. extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;
    50.  
    51. //импортируем версию ядра NT
    52. extern PUSHORT NtBuildNumber;
    53.  
    54. //обьявляем прототип True функции для перехватываемой функции
    55. typedef NTSTATUS (*NtOpenPrcPointer) (
    56.     OUT PHANDLE ProcessHandle,
    57.     IN ACCESS_MASK DesiredAccess,
    58.     IN POBJECT_ATTRIBUTES ObjectAttributes,
    59.     IN PCLIENT_ID ClientId OPTIONAL);
    60.  
    61. //обьявляем True функцию
    62. NtOpenPrcPointer TrueNtOpenProcess;
    63.  
    64. //номер системного вызова NtOpenProcess
    65. ///////////////////////////////////////////////////
    66. ULONG OpenProcId;
    67. ULONG PID=1556;
    68. HANDLE EVEN;
    69. PVOID EVEN2;
    70. ULONG PID2=0;
    71. ULONG POINT;
    72. NTSTATUS TREST;
    73. //////////////////////////////////////////////////////
    74.  
    75. //функция - обработчик перехвата
    76. NTSTATUS NewNtOpenProcess (
    77.     OUT PHANDLE ProcessHandle,
    78.     IN ACCESS_MASK DesiredAccess,
    79.     IN POBJECT_ATTRIBUTES ObjectAttributes,
    80.     IN PCLIENT_ID ClientId OPTIONAL)
    81. {
    82.     HANDLE ProcessId;
    83.  
    84.     //безопасным образом извлекаем ProcessId
    85.     __try
    86.     {
    87.         ProcessId = ClientId->UniqueProcess;
    88.     }
    89.     __except(EXCEPTION_EXECUTE_HANDLER)
    90.     {
    91.         return STATUS_INVALID_PARAMETER;
    92.     }
    93.  
    94.     if (ProcessId == (HANDLE)PID)
    95.     {
    96.         if(PID2!=0){
    97.         KeSetEvent(EVEN2,0,FALSE);
    98.  
    99.         return STATUS_ACCESS_DENIED;
    100.     }return TrueNtOpenProcess(ProcessHandle, DesiredAccess,
    101.                              ObjectAttributes, ClientId);
    102.        
    103.  
    104.     } else
    105.    
    106.     return TrueNtOpenProcess(ProcessHandle, DesiredAccess,
    107.                              ObjectAttributes, ClientId);
    108. }
    109.  
    110.  
    111.  
    112.  
    113. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
    114. {
    115.     ULONG CR0Reg;
    116.     NTSTATUS status;
    117.     UNICODE_STRING  fullFileName;
    118.     HANDLE fileHandle;
    119.     IO_STATUS_BLOCK iostatus;
    120.     OBJECT_ATTRIBUTES   oa;
    121.     UNICODE_STRING devName;    
    122.     PDEVICE_OBJECT fdo;
    123.     PEXAMPLE_DEVICE_EXTENSION dx;
    124.     UNICODE_STRING symLinkName;
    125.  
    126.     DriverObject->DriverUnload=UnloadRoutine;
    127.     DriverObject->MajorFunction[IRP_MJ_CREATE]=Create_File_IRProcessing;
    128.     DriverObject->MajorFunction[IRP_MJ_CLOSE]=Close_HandleIRProcessing;
    129.     DriverObject->MajorFunction[IRP_MJ_READ]=ReadWrite_IRPhandler;
    130.     DriverObject->MajorFunction[IRP_MJ_WRITE]=ReadWrite_IRPhandler;
    131.     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=DeviceControlRutine;
    132.  
    133.  
    134.     RtlInitUnicodeString(&devName,L"\\Device\\MYSEC");
    135.     status=IoCreateDevice(DriverObject,sizeof(EXAMPLE_DEVICE_EXTENSION), &devName,FILE_DEVICE_UNKNOWN,
    136.                       0,
    137.                       FALSE,
    138.                       &fdo);
    139.     dx=(PEXAMPLE_DEVICE_EXTENSION) fdo->DeviceExtension;
    140.     dx->fdo=fdo;
    141. #define SYM_LINK_NAME L"\\DosDevices\\MYSEC"
    142.     RtlInitUnicodeString(&symLinkName,SYM_LINK_NAME);
    143.     dx->ustrSymLinkName=symLinkName;
    144.     status=IoCreateSymbolicLink(&symLinkName,&devName);
    145.     KeInitializeSpinLock(&MySpinLock);
    146.  
    147.     //определяем версию ядра системы
    148.     switch (*NtBuildNumber)
    149.     {
    150.         case 2195 :  //win 2k
    151.          OpenProcId = 0x06A;
    152.          break;
    153.        
    154.         case 2600 : //win xp
    155.          OpenProcId = 0x07A;
    156.          break;
    157.        
    158.         default :
    159.          return STATUS_NOT_IMPLEMENTED;
    160.          break;
    161.     }
    162.    
    163.     //устанавливаем перехват  
    164.         TrueNtOpenProcess  = NTCALL(OpenProcId);
    165.  
    166.     __asm
    167.     {
    168.         cli                     // запрещаем прерывания
    169.         mov eax, cr0
    170.         mov CR0Reg,eax
    171.         and eax,0xFFFEFFFF      // сбросить WP bit
    172.         mov cr0, eax
    173.     }
    174.  
    175.     NTCALL(OpenProcId) = NewNtOpenProcess;
    176.  
    177.     __asm
    178.     {
    179.         mov eax, CR0Reg    
    180.         mov cr0, eax            // востановить содержимое CR0
    181.         sti                     // разрешаем прерывания
    182.     }
    183.    
    184.     RtlInitUnicodeString(&fullFileName,L"\\??\\C:\\make my driver.txt");
    185.     InitializeObjectAttributes(&oa,
    186.                 &fullFileName,
    187.                 OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
    188.                 NULL,
    189.                 NULL);
    190.  
    191.     status=ZwCreateFile(&fileHandle,
    192.             GENERIC_WRITE | SYNCHRONIZE,
    193.             &oa,
    194.             &iostatus,
    195.             0,
    196.             FILE_ATTRIBUTE_NORMAL,
    197.             FILE_SHARE_WRITE,
    198.             FILE_OPEN_IF,
    199.             FILE_SYNCHRONOUS_IO_NONALERT,
    200.             NULL,
    201.             0);
    202.     ZwClose(fileHandle);
    203.     return status;
    204. }
    205.  
    206.  
    207.  
    208. NTSTATUS CompleteIrp(PIRP Irp,NTSTATUS status,ULONG info)
    209. {
    210.     Irp->IoStatus.Status=status;
    211.     Irp->IoStatus.Information=info;
    212.     IoCompleteRequest(Irp,IO_NO_INCREMENT);
    213.     return status;
    214. }
    215.  
    216. NTSTATUS ReadWrite_IRPhandler(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
    217. {
    218.     ULONG BytesTdx=0;
    219.     NTSTATUS status=STATUS_SUCCESS;
    220.     return CompleteIrp(Irp,status,BytesTdx);
    221. }
    222.  
    223. NTSTATUS Create_File_IRProcessing(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
    224. {
    225.     PIO_STACK_LOCATION IrpStack=IoGetCurrentIrpStackLocation(Irp);
    226.     return CompleteIrp(Irp,STATUS_SUCCESS,0);
    227. }
    228.  
    229. NTSTATUS Close_HandleIRProcessing(IN PDEVICE_OBJECT fdo,IN PIRP Irp){
    230.  
    231.     return CompleteIrp(Irp,STATUS_SUCCESS,0);
    232. }
    233.  
    234. NTSTATUS DeviceControlRutine(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
    235. {
    236.     NTSTATUS status=STATUS_SUCCESS;
    237.     PEXAMPLE_DEVICE_EXTENSION dx;
    238.     PIO_STACK_LOCATION IrpStack;
    239.     KIRQL irql;
    240.     KIRQL currentIrql;
    241.     ULONG BytesTdx=0;
    242.     ULONG ControlCode;
    243.     ULONG method;
    244.     IrpStack=IoGetCurrentIrpStackLocation(Irp);
    245.     IrpStack=IoGetCurrentIrpStackLocation(Irp);
    246.     dx=(PEXAMPLE_DEVICE_EXTENSION) fdo->DeviceExtension;
    247.     ControlCode=(ULONG)(IrpStack->Parameters.DeviceIoControl.IoControlCode);
    248.     method=ControlCode & 0x03;
    249.     irql=KeGetCurrentIrql();
    250.     currentIrql=KeGetCurrentIrql();
    251.     KeAcquireSpinLock(&MySpinLock,&irql);
    252.  
    253. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    254. if(ControlCode!=0){
    255.     PID2=ControlCode;
    256.     EVEN=(HANDLE *)PID2;
    257.  
    258. __asm{
    259.          mov ecx, ExEventObjectType
    260.                  mov ecx, [ecx]
    261.                  mov ecx, [ecx]
    262.       }
    263.     TREST=ObReferenceObjectByHandle(EVEN,EVENT_MODIFY_STATE,*ExEventObjectType,UserMode,EVEN2,NULL);
    264.     if(TREST!=STATUS_SUCCESS){PID2=0;};
    265.  
    266.  
    267.     }
    268. else {
    269.     PID2=0;
    270.      }
    271. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    272.  
    273.     KeReleaseSpinLock(&MySpinLock,irql);
    274.     return CompleteIrp(Irp,status,BytesTdx);
    275.  
    276. }
    277.  
    278. VOID UnloadRoutine(IN PDRIVER_OBJECT pDriverObject)
    279. {
    280.  
    281.  
    282. ULONG CR0Reg;
    283.  
    284.  
    285.     //снимаем перехват
    286.     __asm
    287.     {
    288.         cli                     // запрещаем прерывания
    289.         mov eax, cr0
    290.         mov CR0Reg,eax
    291.         and eax,0xFFFEFFFF     // сбросить WP bit
    292.         mov cr0, eax
    293.     }
    294.  
    295.     NTCALL(OpenProcId) = TrueNtOpenProcess;
    296.  
    297.     __asm
    298.     {
    299.         mov eax, CR0Reg    
    300.         mov cr0, eax            // востановить содержимое CR0
    301.         sti                     // разрешаем прерывания
    302.     }
    303.  
    304.     return;
    305.  
    306. }
    Драйвер должен не дать завершить процесс с PID =1556.
    Вот код программы которая должна получить данные о попытке завершить процесс с PID=1556.

    Код (Text):
    1. #include <windows.h>
    2. #include <shellapi.h>
    3. #include <iostream.h>
    4. #include <conio.h>
    5.  
    6. HANDLE g_hEvent;
    7.  
    8.  
    9. DWORD WINAPI P(PVOID pvParam)
    10. {
    11. DWORD dwResult = 0;
    12. DWORD FILE_O;
    13.   int KP=0;
    14.   while(KP!=1)
    15.   {
    16.      FILE_O=WaitForSingleObject(g_hEvent,INFINITE);
    17.      if(FILE_O!=WAIT_FAILED){break;}
    18.   }
    19.  
    20.  
    21.  
    22. MessageBox(0,0,0,0);
    23. getch();
    24. return(dwResult);
    25. }
    26. void main()
    27. {
    28.     g_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
    29.     int x=0;
    30.     DWORD dwThreadId;
    31.     CreateThread(NULL,0,P,(PVOID) &x, 0, &dwThreadId);
    32.  
    33.  
    34.  
    35. HANDLE hHandle=CreateFile("\\\\.\\MYSEC",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,
    36. OPEN_EXISTING,NULL,NULL);
    37. if(hHandle==INVALID_HANDLE_VALUE){cout<<"???????????";getch();}
    38. unsigned long ioctlCode=(unsigned long)&g_hEvent;
    39. DWORD BBB=0;
    40. unsigned char xdata=0x0;
    41. unsigned char xdata2=0x0;
    42. DeviceIoControl(hHandle,ioctlCode,&xdata2,sizeof(xdata2),&xdata,sizeof(xdata),&BBB,NULL);
    43. cout<<"RT  ";
    44.  
    45.  
    46.    HANDLE h;
    47.     h=CreateEvent(NULL,TRUE,FALSE,"1");//??????? ?????
    48.     WaitForSingleObject(h,50000);//?????? ?????
    49.     exit(1);
    50. }
    Как видно при попытке завершения процесса с PID=1556 программа выдаст MessageBox.
    Только при запуске программы после соответствующей загрузке драйвера я наблюдаю синий экран.
    Подскажите пожалуйста, в чем причина. Вроде все как в статье сделал.
    Заранее благодарен.
    С уважением HAWK.
     
  2. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    hawk
    Крашдамп давай
     
  3. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    hawk
    !analyze -v
     
  4. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    да сам синий экран я разгледеть не успеваю-компьютер перезагружается.
    Если убрать KeSetEvent,то всё работает без проблем.Выходит,что проблема с обработкой хэндэла передоваемому драйверу.Но где ошибка я не вижу.
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    hawk
    настройка сброса крешдампа в ХР2
    выбираеш тип - дамп памяти ядра.
    после бсода - открываеш этот дамп в отладчике WinDbg
    и отдаёш комманду
    Код (Text):
    1. !analyze -v
    и шлёш вывод сюда :)
     
  6. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    сейчас попробую.Подскажите,а данная ситуация может быть обусловленна тем,что драйвер я запускаю из drivermonitor,а не из программы?Ведь в таком случае мой одноуровневый драйвер,не находиться в контексте программы в которой я создаю объект.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    IRQL_NOT_LESS_OR_EQUAL.
    В KeSetEvent нужен указатель на обьект.
     
  8. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Clerk,не совсем понял смысл вашего сообщения.Поясните пожалуйста.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Юзой ObReferenceObjectByHandle().
     
  10. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Clerk,так и так юзаю,и ничего не выходит.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    hawk
    Ну тогда не знаю. Поправь вызов, а то он у тебя гдето хз где.
     
  12. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Clerk Вы имели ввиду под -
    IRQL_NOT_LESS_OR_EQUAL.
    В KeSetEvent нужен указатель на обьект.
    ,следующие изменения:
    TREST=ObReferenceObjectByHandle(EVEN,EVENT_MODIFY_STATE,*ExEventObjectType,UserMode,&EVEN2,NULL);
    ?
     
  13. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Но при таком изменении TREST!=STATUS_SUCCESS
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Что возвращает ?
     
  15. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Даже при таком изменение толку нет:
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    if(ControlCode!=0){
    PID2=ControlCode;
    EVEN=(HANDLE )PID2;

    //__asm{
    /// mov ecx, ExEventObjectType
    // mov ecx, [ecx]
    // mov ecx, [ecx]
    // }
    TREST=ObReferenceObjectByHandle(EVEN,EVENT_MODIFY_STATE,*ExEventObjectType,UserMode,&EVEN2,NULL);
    if(TREST!=STATUS_SUCCESS){PID2=6;} else {KeSetEvent(EVEN2,0,FALSE);}


    }
    else {
    PID2=0;
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////

    Выходит TREST!=STATUS_SUCCESS;
    Кто нибудь помогите пожалуйста. Из-за чего это может быть.
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    hawk
    Ёпт, да запипихни ты вызов сразу до вызова установки эвента, у тебя в DeviceControlRutine() сам то хоть понимаешь что слепил и как оно работать должно. Дебаггер бери и смори что и как.)
     
  17. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Уважаемый Clerk, простите меня за стиль и безграматность написания. Вот исправил, но все равно не пашет.
    Пишет
    Код (Text):
    1. NTSTATUS DeviceControlRutine(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
    2. {
    3.     NTSTATUS status=STATUS_SUCCESS;
    4.     PIO_STACK_LOCATION IrpStack;
    5.     KIRQL irql;
    6.     KIRQL currentIrql;
    7.     ULONG BytesTdx=0;
    8.     ULONG ControlCode;
    9.     IrpStack=IoGetCurrentIrpStackLocation(Irp);
    10.     ControlCode=(ULONG)(IrpStack->Parameters.DeviceIoControl.IoControlCode);
    11.  
    12.  
    13. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    14. if(ControlCode!=0){
    15.     PID2=ControlCode;
    16.     EVEN=(HANDLE *)PID2;
    17.     TREST=ObReferenceObjectByHandle(EVEN,EVENT_MODIFY_STATE,*ExEventObjectType,UserMode,&EVEN2,NULL);
    18.     KeSetEvent(EVEN2,0,FALSE);
    19.            if(TREST!=STATUS_SUCCESS){PID2=6;};
    20.     }
    21. else {
    22.     PID2=0;
    23.      }
    24. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    25.  
    26.     return CompleteIrp(Irp,status,BytesTdx);
    27.  
    28. }
    Выдает IRQL_NOT_LESS_OR_EQUAL.:-(
     
  18. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Вот сделал как в примере:
    Код (Text):
    1. NTSTATUS DeviceControlRutine(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
    2. {
    3. HANDLE buff;
    4.     NTSTATUS status=STATUS_SUCCESS;
    5.     PEXAMPLE_DEVICE_EXTENSION dx;
    6.     PIO_STACK_LOCATION IrpStack;
    7.     KIRQL irql;
    8.         PKEVENT EVEN2;
    9.     KIRQL currentIrql;
    10.     ULONG BytesTdx=0;
    11.     ULONG ControlCode;
    12.     IrpStack=IoGetCurrentIrpStackLocation(Irp);
    13.     ControlCode=(ULONG)(IrpStack->Parameters.DeviceIoControl.IoControlCode);
    14. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    15. if(ControlCode!=0){
    16.     IrpStack->Parameters.DeviceIoControl.InputBufferLength=sizeof(HANDLE);
    17.     buff=(PHANDLE)Irp->AssociatedIrp.SystemBuffer;
    18.     PID2=ControlCode;
    19.     TREST=ObReferenceObjectByHandle(buff,EVENT_MODIFY_STATE,*ExEventObjectType,UserMode,&EVEN2,NULL);
    20.    
    21.     //if(TREST!=STATUS_OBJECT_TYPE_MISMATCH){PID2=0;PID=212;};
    22.     //if(TREST!=STATUS_ACCESS_DENIED){PID2=0;PID=232;};
    23.     //if(TREST!=STATUS_INVALID_HANDLE){PID2=0;PID=380;};
    24.     if(TREST!=STATUS_SUCCESS){PID2=0;PID=1704;};
    25. // else {KeSetEvent(EVEN2,0,FALSE);}
    26.     }
    27. else {
    28.     PID2=0;
    29.      }
    30. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    31.  
    32.     return CompleteIrp(Irp,status,BytesTdx);
    33.  
    34. }
    И получаю STATUS_SUCCESS:
    Подскажите пожалуйста в чем может быть причина.
     
  19. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Все получилось..!!!!!!Clerck тебе отдельное огромное спосибо!+500