Помогите BSOD разобарть...

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

  1. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Ситуация осложняется еще и там что опыта программирования в ядре не много.

    Драйвер ведет перехват NtClose вызова. Проверяет, является ли закрываемый объект файлом, если да, то получает имя файла, копирует его в буфер, сигнализирует юзермодному приложению, то в свою очередь забирает этот буфер. Драйвер+приложение довольно неплохо работали, отлавливая все закрываемые файлы. Однако нашлась бага. Если воткнуть флешку, то в скором времени получаем BSOD (IRQL_LESS_OR_NOT_EQUAL).
    Итак, подробнее код перехватчика, ключевой момент:

    Код (Text):
    1. NTSTATUS NewNtClose( IN HANDLE  Handle)
    2. {NTSTATUS D, status;
    3. PFILE_OBJECT pFileObject=NULL;
    4. UNICODE_STRING unic_str;
    5. POBJECT_NAME_INFORMATION Obj_name=NULL;
    6. ANSI_STRING ansiStr;
    7. LARGE_INTEGER    Wait;
    8. ULONG RES1, returned;
    9. KIRQL IRQLold, IRQLnew;
    10. RES1=0;
    11.  
    12.   if (ExTryToAcquireFastMutex(&g_fMutex))
    13.               {
    14.     if ((g_fbNotifyRoutineSet == TRUE )) {
    15. //глобальный флаг -ведется ли мониторинг
    16.  
    17.  status = ObReferenceObjectByHandle(Handle,
    18.                                                FILE_READ_ATTRIBUTES,
    19.                                                *IoFileObjectType,
    20.                                                KernelMode,
    21.                                                &pFileObject,
    22.                                                NULL
    23.                                                );
    24. //узнали, является ли файлом закрываемый хендл
    25. if (status ==0 ) {
    26.             if ( pFileObject->WriteAccess   ){//проверяем режим открытия
    27.             status = ObQueryNameString(pFileObject->DeviceObject, NULL , 0 ,  &RES1);
    28.             if ((RES1>0)&& (status ==0xc0000004 ))
    29.             {// получаем имя устройства (узнаем размер и выделяем память под него
    30.            
    31.  
    32.             Obj_name= (POBJECT_NAME_INFORMATION) ExAllocatePool(NonPagedPool, RES1);
    33.             status = ObQueryNameString(pFileObject->DeviceObject, Obj_name , RES1 ,  &returned);
    34.             IRQLold=KeGetCurrentIrql( );
    35.             DPRINT("%S %S, prior = %ld", Obj_name->Name.Buffer,pFileObject->FileName.Buffer, IRQLold);
    36.             //выводим тукущий IRQL и имена закрываемых файлов и устройств
    37.                         // если исправить на (1==2) то BSOD нет
    38.                         if ((status==0)/*&&(IRQLold<2)*/&&(1==1)    )
    39.                         {
    40.  
    41.             Wait.LowPart = SEMAPHORE_TIMEOUT;
    42.             Wait.HighPart = -1;
    43.             //ожидание пока юзермодное приложение не скажет что забрало предыдущую порцию данных
    44.             KeWaitForSingleObject(&g_pksemaphore,Executive, KernelMode, FALSE, &Wait);
    45.  
    46.             //копирует в глобальный буфер имя устройства  
    47.             RtlUnicodeStringToAnsiString( &ansiStr, &Obj_name->Name, TRUE );
    48.             RES1= (ansiStr.Length > 99? 99: ansiStr.Length);
    49.             memset(g_buffer, 0 ,MAX_PATH_2);
    50.             strncpy(g_buffer, ansiStr.Buffer, RES1);
    51.             RtlFreeAnsiString(&ansiStr);
    52.  
    53.             // добавляем к строке путь файла              
    54.             RtlUnicodeStringToAnsiString( &ansiStr, &pFileObject->FileName, TRUE );
    55.             strcat(g_buffer,ansiStr.Buffer);
    56.             RtlFreeAnsiString(&ansiStr);
    57.             DPRINT("%s, LEN = %ld", g_buffer, RES1);
    58.             // сигнализируем юзермоду что данные можно брать
    59.             KeSetEvent(g_pkEventObject, 0, FALSE);
    60.                         }
    61.                         ExFreePool(Obj_name);
    62.                         }
    63.                                                                     }
    64.                                     }
    65.                 if (pFileObject!=NULL) ObDereferenceObject(&pFileObject);  
    66.  
    67.              }
    68.      ExReleaseFastMutex (&g_fMutex);
    69.   }
    70. D = TrueNtClose(Handle);
    71. return D;
    72. }
    Глобальный буфер выделяю при загрузке дрова:
    Код (Text):
    1. g_buffer= ExAllocatePool(NonPagedPool, MAX_PATH_2);
    Данные забираются IOCTRL запросом

    Код (Text):
    1. NTSTATUS DriverDispatcher(
    2.     IN PDEVICE_OBJECT DeviceObject,
    3.     IN PIRP Irp)
    4. {
    5.     PIO_STACK_LOCATION irpStack;
    6.     ULONG ioControlCode;
    7.     NTSTATUS            status ;
    8.     HANDLE               h_Event;
    9.     LARGE_INTEGER               Wait;
    10.            
    11.     irpStack = IoGetCurrentIrpStackLocation (Irp);
    12.    
    13.         switch( irpStack->Parameters.DeviceIoControl.IoControlCode )
    14.     {
    15. ...
    16. case IOCTL_GET_PROCESS_DATA:
    17.             DPRINT("IOCTL_GET_PROCESS_DATA IRQL = %ld", KeGetCurrentIrql());
    18.  
    19.             if (irpStack->Parameters.DeviceIoControl.OutputBufferLength >=strlen(g_buffer) )
    20.             {
    21.             memcpy(Irp->AssociatedIrp.SystemBuffer, g_buffer,strlen(g_buffer));
    22.                         Irp->IoStatus.Status =STATUS_SUCCESS;
    23.             Irp->IoStatus.Information =  strlen(g_buffer);
    24.            
    25.        
    26.         if ( KeReadStateSemaphore(&g_pksemaphore) < SEMAPHORE_LIMIT)  
    27.         KeReleaseSemaphore(&g_pksemaphore,0 ,1, FALSE);
    28.            
    29.             }else {Irp->IoStatus.Status =STATUS_BUFFER_TOO_SMALL;
    30.                 DPRINT("STATUS_BUFFER_TOO_SMALL");
    31.                 }
    32.                
    33.                
    34.                 break;
    35. ...
    36.     Irp->IoStatus.Status = STATUS_SUCCESS;
    37.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
    38.     return STATUS_SUCCESS;
    Итак. Так работает хорошо. DebugView выводит строки с названием закрываемый файлов.
    (при создании или модификации).

    1. Если вставить флешку, то после того как она определиться и перед тем как должен начаться "автозапуск" или проще говоря перед тем как появится новый том в системе, выдается
    IRQL_LESS_OR_NOT_EQUAL
    STOP 0x0000000A (0x74fc4588, 0x00000002, 0x0,0x804f9c5b)
    ПРо него пишут:
    1.1. Если изменить условие на заведому ложь (1==2), то падения не происходит.
    Теперь самое забавное:
    Если условие ложно заведомо, то при втыкании флешки у меня никакой реакции в виде
    DPRINT("%S %S, prior = %ld", Obj_name->Name.Buffer,pFileObject->FileName.Buffer, IRQLold);
    не имеем, то есть до этого участка кода при выткании флешки не доходит, а хотя она определяется и начнается автозапуск. (а при копировании файлов их имена ловятся)
    Если же исправить условие на ПРАВДУ, то падения происходят.
    1.?. Спрашивается, ЧТО за НЕЧТО вызывает падения? Я думал может с каким файлом совладать не может, но никаких файлов не закрывается. И что вызвает падение, причем параметр при падении говорит что 0x00000002 это IRQL. Но у меня при условии (1==2) все IRQL =1.

    Было подозрение, что падение происходит после того как совершается KeSetEvent(g_pkEventObject, 0, FALSE); и следом данные забирает юзермодное приложение. Но оно вообще с 0 IRQL работает (проверял н обычных файлах)..
    Так что же такое происходит с этим дьявольским участком кода? Ведь до этого кода не доходит.. или...?

    2. Если раскомментировать проверку IRQL
    if ((status==0)&&(IRQLold<2)&&(1==2) )
    то падения не происходит, однако если
    if ((status==0)&&(IRQLold<2)&&(1==1) )
    то получаем падение
    STOP 0x3 (0xbf8089c0, 0x000000FF, 0x0, 0x805327ae)
    и там сигнаизируется win32k.sys
    Причем упало не сразу, успел появится автозапуск, но закрытие никакх файлов зафиксировано не было

    Мне просто интересно, как так?

    Если же закомментировать строки между
    KeWaitForSingleObject(&g_pksemaphore,Executive, KernelMode, FALSE, &Wait);
    и
    KeSetEvent(g_pkEventObject, 0, FALSE);

    То я на экране получаю
    БСОД
    PAGE_FAULT_IN_NONPAGED_AREA
    STOP 0x50 (0xED142A7c, 0x0, 0xF65EDB68, 0x02)
    и упоминание о моем драйвере.
    Ну там в любом случае БСОД вылазит. Даже если закомментировать в инверсии.


    Пробовал использовать verifier.exe майкрософт, но пока не разобрался что с ним делать.
    Поставил свой драйвер в автозагрузку и указал ее в утилите, дак я при загрузке каждый раз получал БСОД, хотя пока к драйверу не подключиться юзермодной прогой и не оптравить спец. запрос, который установил флаг g_fbNotifyRoutineSet, то тот код вообще выполняться не будет.

    Могу дампы сделать, но не знаю что с ними делать..
    Пока хотелось бы понять магию под пунктом 1 и как от нее избавиться.

    ПС: что значит строка:
    Код (Text):
    1. RES1= (ansiStr.Length > 99? 99: ansiStr.Length);
    Я ее влял в ниге Солдатова, они определяет длину строки. Но что значит > 99? 99: я так понять и не смог, моих знаний не хватает, просмотрел справочники, не попалось, и искать не знаю как эта вещь называется..
    ??
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Если ansiStr.Length > 99 то ansiStr.Length присваивается 99, в противном случае ничего не меняется.
     
  3. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Partner что то вы путаете.
    Если ansiStr.Length > 99, то RES1=99
    иначе RES1= ansiStr.Length


    test555 поставь Debugging Tools for windows. Открой там креш-дамп и посмотри хотя бы по какому смещению произошел креш, тогда узнаешь команду где крешнулось...
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    test555
    1. Отступы в коде магическим обраом пропали или же их и не было никогда?
    2. Ставите Debugging tools, открываете крешдамп и даете нам !analyze -v
    Или же предлагаете нам заняться гаданием на кофейной гуше и выкладыванием пасьянсов?
     
  5. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Код (Text):
    1. kd> !analyze -v
    2. *******************************************************************************
    3. *                                                                             *
    4. *                        Bugcheck Analysis                                    *
    5. *                                                                             *
    6. *******************************************************************************
    7.  
    8. IRQL_NOT_LESS_OR_EQUAL (a)
    9. An attempt was made to access a pageable (or completely invalid) address at an
    10. interrupt request level (IRQL) that is too high.  This is usually
    11. caused by drivers using improper addresses.
    12. If a kernel debugger is available get the stack backtrace.
    13. Arguments:
    14. Arg1: 74fc4588, memory referenced
    15. Arg2: 00000002, IRQL
    16. Arg3: 00000000, bitfield :
    17.     bit 0 : value 0 = read operation, 1 = write operation
    18.     bit 3 : value 0 = not an execute operation, 1 = execute operation (only on chips which support this level of status)
    19. Arg4: 804f9c5b, address which referenced memory
    20.  
    21. Debugging Details:
    22. ------------------
    23.  
    24.  
    25. READ_ADDRESS:  74fc4588
    26.  
    27. CURRENT_IRQL:  2
    28.  
    29. FAULTING_IP:
    30. nt!KeWaitForSingleObject+bb
    31. 804f9c5b 803b02          cmp     byte ptr [ebx],2
    32.  
    33. DEFAULT_BUCKET_ID:  DRIVER_FAULT
    34.  
    35. BUGCHECK_STR:  0xA
    36.  
    37. PROCESS_NAME:  System
    38.  
    39. LAST_CONTROL_TRANSFER:  from 00000000 to 80540683
    40.  
    41. STACK_TEXT:  
    42. f8acac64 00000000 00000000 00000000 00000000 nt!KiTrap0E+0x233
    43.  
    44.  
    45. STACK_COMMAND:  .bugcheck ; kb
    46.  
    47. FOLLOWUP_IP:
    48. nt!KeWaitForSingleObject+bb
    49. 804f9c5b 803b02          cmp     byte ptr [ebx],2
    50.  
    51. SYMBOL_NAME:  nt!KeWaitForSingleObject+bb
    52.  
    53. FOLLOWUP_NAME:  MachineOwner
    54.  
    55. MODULE_NAME: nt
    56.  
    57. IMAGE_NAME:  ntkrnlpa.exe
    58.  
    59. DEBUG_FLR_IMAGE_TIMESTAMP:  4802516a
    60.  
    61. FAILURE_BUCKET_ID:  0xA_nt!KeWaitForSingleObject+bb
    62.  
    63. BUCKET_ID:  0xA_nt!KeWaitForSingleObject+bb
    64.  
    65. Followup: MachineOwner
    66. ---------
    Вот. Что может быть не так с KeWaitForSingleObject? (если в нем дело)
     
  6. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    У меня на висте эта ф-ция видать отличается от твоей. Нашел такие строки
    mov ecx, [ebp+Object]
    cmp byte ptr [ecx], 2
    Наверно твой ebx указывает в никуда, т.е. ты передаешь не то в первый параметр ф-ции KeWaitForSingleObject.
    Но я могу ошибатся, посмотрим что скажут профи )
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    test555
    в студию еще, пожалуйста, вывод команд
    Код (Text):
    1. !pte 74fc4588
    2. !vad 74fc4588
    3. !thread
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. FOLLOWUP_IP:
    2. nt!KeWaitForSingleObject+bb
    3. 804f9c5b 803b02          cmp     byte ptr [ebx],2
    В Ebx загружается первый параметр функции, соответственно это указатель на обьект.
    В сурцах это строка:
    Код (Text):
    1. Objectx->Header.Type == MutantObject
    Так как указатель не валидный поэтому и падает.
    Не удивлюсь если переменную g_pksemaphore ты определил в секции .init :)
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Clerk
    Да ты глянь он вообще юзермодный.
    А точнее, неизвестно, который это вызов KeWaitForSingleObject. Который автор вставил или где-то в глубине. Так что нужен колл стек
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    +1 за колстек.
    нужен вывод kb
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    Что юзермодный, не понял ??
    Мне кажется у него переменные в выгружаемой памяти, либо вобще хз где.. В принципе да, нужен дамп стека.
    [Аа.. указатель, ну да вижу.]
     
  12. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Т.к. тот дамп удалился, делаю по новой..
    Есть небольшое отличие.

    Итого:
    Код (Text):
    1. kd> !analyze -v
    2.  
    3. IRQL_NOT_LESS_OR_EQUAL (a)
    4. An attempt was made to access a pageable (or completely invalid) address at an
    5. interrupt request level (IRQL) that is too high.  This is usually
    6. caused by drivers using improper addresses.
    7. If a kernel debugger is available get the stack backtrace.
    8. Arguments:
    9. Arg1: 74fc4588, memory referenced
    10. Arg2: 00000002, IRQL
    11. Arg3: 00000000, bitfield :
    12.     bit 0 : value 0 = read operation, 1 = write operation
    13.     bit 3 : value 0 = not an execute operation, 1 = execute operation (only on chips which support this level of status)
    14. Arg4: 804f9c5b, address which referenced memory
    15.  
    16. Debugging Details:
    17. ------------------
    18.  
    19.  
    20. READ_ADDRESS:  74fc4588
    21.  
    22. CURRENT_IRQL:  2
    23.  
    24. FAULTING_IP:
    25. nt!KeWaitForSingleObject+bb
    26. 804f9c5b 803b02          cmp     byte ptr [ebx],2
    27.  
    28. DEFAULT_BUCKET_ID:  DRIVER_FAULT
    29.  
    30. BUGCHECK_STR:  0xA
    31.  
    32. PROCESS_NAME:  System
    33.  
    34. TRAP_FRAME:  f8ad6c64 -- (.trap 0xfffffffff8ad6c64)
    35. ErrCode = 00000000
    36. eax=00000bb7 ebx=74fc4588 ecx=00000000 edx=f8ad6d1c esi=821c6640 edi=821c66b0
    37. eip=804f9c5b esp=f8ad6cd8 ebp=f8ad6cf8 iopl=0         nv up ei pl zr na pe nc
    38. cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010246
    39. nt!KeWaitForSingleObject+0xbb:
    40. 804f9c5b 803b02          cmp     byte ptr [ebx],2           ds:0023:74fc4588=??
    41. Resetting default scope
    42.  
    43. LAST_CONTROL_TRANSFER:  from 804f9c5b to 80540683
    44.  
    45. STACK_TEXT:  
    46. f8ad6c64 804f9c5b badb0d00 f8ad6d1c e1da4758 nt!KiTrap0E+0x233
    47. f8ad6cf8 805322e5 00000000 00000000 00000000 nt!KeWaitForSingleObject+0xbb
    48. f8ad6d30 805327e7 f67f7d28 f67f7d38 f8ad6d60 nt!ExpWaitForResource+0x2f
    49. f8ad6d40 805b09fd 8063bc78 00000001 00000000 nt!ExAcquireResourceExclusiveLite+0x6f
    50. f8ad6d60 805b0f44 f67f7d50 00000001 805597c0 nt!ObpRemoveObjectRoutine+0x53
    51. f8ad6d74 80534c02 00000000 00000000 821c6640 nt!ObpProcessRemoveObjectQueue+0x38
    52. f8ad6dac 805c6160 00000000 00000000 00000000 nt!ExpWorkerThread+0x100
    53. f8ad6ddc 80541dd2 80534b02 00000000 00000000 nt!PspSystemThreadStartup+0x34
    54. 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16
    55.  
    56.  
    57. STACK_COMMAND:  kb
    58.  
    59. FOLLOWUP_IP:
    60. nt!KeWaitForSingleObject+bb
    61. 804f9c5b 803b02          cmp     byte ptr [ebx],2
    62.  
    63. SYMBOL_STACK_INDEX:  1
    64.  
    65. SYMBOL_NAME:  nt!KeWaitForSingleObject+bb
    66.  
    67. FOLLOWUP_NAME:  MachineOwner
    68.  
    69. MODULE_NAME: nt
    70.  
    71. IMAGE_NAME:  ntkrnlpa.exe
    72.  
    73. DEBUG_FLR_IMAGE_TIMESTAMP:  4802516a
    74.  
    75. FAILURE_BUCKET_ID:  0xA_nt!KeWaitForSingleObject+bb
    76.  
    77. BUCKET_ID:  0xA_nt!KeWaitForSingleObject+bb
    78.  
    79. Followup: MachineOwner
    80. ---------
    !pte 74fc4588

    Код (Text):
    1. kd> !pte 74fc4588
    2.                VA 74fc4588
    3. PDE at 00000000C0601D38    PTE at 00000000C03A7E20
    4. contains 0000000000000000
    !vad 74fc4588

    Код (Text):
    1. kd> !vad 74fc4588
    2. VAD     level      start      end    commit
    3. No VAD describing VA FFFFFFFF821EC078 in the current process
    !thread

    Код (Text):
    1. kd> !thread
    2. THREAD 821c6640  Cid 0004.001c  Teb: 00000000 Win32Thread: 00000000 RUNNING on processor 0
    3. Not impersonating
    4. DeviceMap                 e1004460
    5. Owning Process            821c77c0       Image:         System
    6. Attached Process          N/A            Image:         N/A
    7. Wait Start TickCount      2999           Ticks: 0
    8. Context Switch Count      861            
    9. UserTime                  00:00:00.000
    10. KernelTime                00:00:00.109
    11. Start Address nt!ExpWorkerThread (0x80534b02)
    12. Stack Init f8ad7000 Current f8ad6d1c Base f8ad7000 Limit f8ad4000 Call 0
    13. Priority 13 BasePriority 13 PriorityDecrement 0 DecrementCount 16
    14. ChildEBP RetAddr  Args to Child              
    15. f8ad6c64 804f9c5b badb0d00 f8ad6d1c e1da4758 nt!KiTrap0E+0x233 (FPO: [0,0] TrapFrame @ f8ad6c64)
    16. f8ad6cf8 805322e5 00000000 00000000 00000000 nt!KeWaitForSingleObject+0xbb (FPO: [5,5,4])
    17. f8ad6d30 805327e7 f67f7d28 f67f7d38 f8ad6d60 nt!ExpWaitForResource+0x2f (FPO: [0,5,0])
    18. f8ad6d40 805b09fd 8063bc78 00000001 00000000 nt!ExAcquireResourceExclusiveLite+0x6f (FPO: [2,0,0])
    19. f8ad6d60 805b0f44 f67f7d50 00000001 805597c0 nt!ObpRemoveObjectRoutine+0x53 (FPO: [2,1,4])
    20. f8ad6d74 80534c02 00000000 00000000 821c6640 nt!ObpProcessRemoveObjectQueue+0x38 (FPO: [1,0,0])
    21. f8ad6dac 805c6160 00000000 00000000 00000000 nt!ExpWorkerThread+0x100 (FPO: [1,8,0])
    22. f8ad6ddc 80541dd2 80534b02 00000000 00000000 nt!PspSystemThreadStartup+0x34 (FPO: [Non-Fpo])
    23. 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16
    Семафор у меня описан так (не знаю где в С++ находится секция .init) :

    Код (Text):
    1. KSEMAPHORE g_pksemaphore;
    В драйверЭнтри
    Код (Text):
    1. KeInitializeSemaphore(&g_pksemaphore, SEMAPHORE_LIMIT, SEMAPHORE_LIMIT);
    ВОт еще, но вроде это уже было:
    Код (Text):
    1. kd> kb
    2. ChildEBP RetAddr  Args to Child              
    3. f8ad6c64 804f9c5b badb0d00 f8ad6d1c e1da4758 nt!KiTrap0E+0x233
    4. f8ad6cf8 805322e5 00000000 00000000 00000000 nt!KeWaitForSingleObject+0xbb
    5. f8ad6d30 805327e7 f67f7d28 f67f7d38 f8ad6d60 nt!ExpWaitForResource+0x2f
    6. f8ad6d40 805b09fd 8063bc78 00000001 00000000 nt!ExAcquireResourceExclusiveLite+0x6f
    7. f8ad6d60 805b0f44 f67f7d50 00000001 805597c0 nt!ObpRemoveObjectRoutine+0x53
    8. f8ad6d74 80534c02 00000000 00000000 821c6640 nt!ObpProcessRemoveObjectQueue+0x38
    9. f8ad6dac 805c6160 00000000 00000000 00000000 nt!ExpWorkerThread+0x100
    10. f8ad6ddc 80541dd2 80534b02 00000000 00000000 nt!PspSystemThreadStartup+0x34
    11. 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16
     
  13. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Мне интересно, почему именно при вставлении флешки падает, ведь при обычном копировании все работает и семафор выполняет свою функцию..
     
  14. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Может я неправильно понимаю, но разве там не должно произойти ошибки доступа к памяти(или как там это называется) , после которой диспетчер памяти подгрузит эту секцию из свопа ?
     
  15. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    onSide, не совсем понимаю вашу терминологию,
    Я уж не знаю как правильно было объявлять переменную семафора, решил сделать так:

    Код (Text):
    1. PKSEMAPHORE pg_pksemaphore
    Код (Text):
    1.         pg_pksemaphore= ExAllocatePool(NonPagedPool, sizeof(KSEMAPHORE));
    2.         KeInitializeSemaphore(pg_pksemaphore, SEMAPHORE_LIMIT, SEMAPHORE_LIMIT);
    ну и потом грохаю. но до того момента не доходило..

    Кстати, не знаю в чем фишка, но после выделения памяти для объекта семафора мне строка
    Код (Text):
    1. DPRINT("SEMAPHORE  = %x", pg_pksemaphore);
    Дает значение (запомнил на бумажке 81ee6c20)

    Потом этого адреса в креш-дампе не нашел, по идее он же в стеке должен быть?

    Собственно после такой манипуляции ничего не изменилось.
     
  16. Clerk

    Clerk Забанен

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

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    Итак, чем мне заняться в ближайшее время, чтобы найти решение проблемы?
     
  18. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Установить отладчик ядра :)
     
  19. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    поместить в нестраничную память всё что нужно.
    А в остальном чёт уж больно криво всё. адреса юзермодные при irql=2. а вы какой антивирус пишите?
     
  20. test555

    test555 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2007
    Сообщения:
    241
    asmfan, дак я в 15 сообщении поместил уже в неподкачиваемую память...

    Самое забавное, что если поставить невыполнимое условие, то при втыкании флешки до этого места не доходит (т.е. ничего не ловится) а если поставить корректрный IF то БСОД..
    Магия.