WP-bit

Тема в разделе "WASM.WIN32", создана пользователем Maveric, 3 сен 2007.

  1. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    ECk
    Я так понял livekd для ХР не актуален. Это раньше нельз было локально дебажить.

    К тому же у меня проблемы при вызове DriverEntry. Т.е. надо чтобы отладчик уже был загружен и поймал этот багчек.
     
  2. netex

    netex New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2005
    Сообщения:
    114
    Адрес:
    Russia
    Запускаем ОДНОВРЕМЕННО две копии твоего драйвера на РАЗНЫХ процессорах. Ты делаешь cli из обоих драйверов и начинаешь править код в памяти. В таком случае драйвера будут работать ПАРАЛЛЕЛЬНО(одновременно если угодно).
    Замечу, что код драйвера на каждом процессоре НЕ БУДЕТ прерван другой задачей пока ты не сделаешь sti.

    ЗЫ
    Я тоже заморачивался с задачей блокировки ВСЕХ процессоров - выход один DPC на каждый процессор. И уже в коде DPC делай cli/sti.
    смотри: DDK KeSetTargetProcessorDpc()
    Экспортируемая переменная: KeNumberProcessors

    делашь цикл
    for(int i=0;i<KeNumberProcessors;i++)
    {
    KeSetTargetProcessorDpc(MyDPC,i);
    }

    Цитата с которой я полностью согласен:
     
  3. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    netex
    Спасибо, конечно, что принял участие в беседе. :)
    - мощно. А почему две, а не 15 ?
    Да и нет задачи блокировки всех процессоров.

    ... вообщем не надо так по-чёрному курить

    До меня только сейчас дошло... ты, наверное используешь какую-то альтернативную ОС-ку, которая запускает свои копии на каждом процессоре отдельно и соответственно одновременно грузит все драйвера на каждом процессоре ? :)
     
  4. netex

    netex New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2005
    Сообщения:
    114
    Адрес:
    Russia
    Значит я просто в тему не въехал. :)
    Но если нужно будет заблокировать все процы, пояснение см.выше :)

    ЗЫ
    Эта альтернативная ОС зовется виндой :)
    Она бывает еще и многозадачная, а если ее поставить на SMP машину, будет вообще трактор!
    А в тракторе том есть штуковина affinity...
    Остальное лирика...
     
  5. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    netex Спасибо.
    Я понял. Если нужно будет заглушить все процы, то можно смело обращаться к тебе :)

    это всё, конечно, хорошо...
    Но я, надеюсь, ты не думаешь, что DriverEntry начнёт одновременно выполнятся на нескольких процах.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Каким раком юзермодный отладчик поймает багчек? livekd и Windbg в режиме локальной отладки могут же только пассивно наблюдать за системой, но никак не вмешиваться в работу, расставлять брекпоинты и ловить багчеки. это под силу только всяким сайсерам и софтайсам, либо при отладке с другого компа. Или я что-то в этой жизни упустил?
    отладчик который запускается по ключу /debug встроен в ядро, но активно работать он может только при подключении с другого компа
     
  7. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    IPI через APIC
     
  8. netex

    netex New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2005
    Сообщения:
    114
    Адрес:
    Russia
    Если ты сделаешь копию своего драйвера (к примеру Drv1.sys и Drv2.sys) и запустишь обе, то есть шанс что они попадут на разные процы.
    Вот тебе пример который все пояснит:
    Ты написал крутой драйвер по модификации кода.
    Вася Пупкин украл твои секреты и сделал похожий драйвер, который делает тоже самое.

    Если юзер(который ничего не знает о внутренности дров) установит у себя обе ваши проги, то они будут конфликтовать.
    Блокировку тебе нужно использовать если только хочешь получить МОНОПОЛЬНЫЙ доступ к ресурсу.
    В твоем случае модифицировать память.
     
  9. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    Great
    livekd - вообще не отладчик. это пришлёпка к "Debugging Tools for Windows" которая делает возможным локальную отладку (т.е. без двух компов.). Штука нормальная, но мне не поможет.
    - это понятно, что никаким. надо где-то sice раздобыть.
    Кстати, кажется можно зарегить калбэк на багчек. А как что нибудь путное при этом на экран вывести ?
     
  10. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    netex ... ты писать не пробовал ? Я думаю, в жанре научной фантастики ты бы мог пару премий заработать :)
    С Васей Пупкиным много чего случается, но у меня всё проще. :)
     
  11. netex

    netex New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2005
    Сообщения:
    114
    Адрес:
    Russia
    Я думаю тебе стоит прислушиться к PS от Agent666
    Остальное флуд...
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    KeSetThreadAffinity проще, тогда никаких шансов не надо.
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    я в курсе что это) я его аналог уже написал.
    отладку еще раз говорю он не делает возможным) только наблюдение, но не активное участие
    и нафига тебе оно? ну напишешь ты драйвер который регистрирует колбек, вывести ты вряд ли чтото сможешь куда либо кроме как на синий экран, а вряд ли ты сможешь вывести что-то более умное, чем выведет автоанализатор винды
     
  14. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    что-то я вообще не догоняю...
    Написал функцию которая в файл пишет отладочную информацию. Попробовал несколько раз остановить/запустить устройство. Через некоторе кол-во попыток BSOD NO_MORE_IRP_STACK_LOCATIONS. Такого багчека ещё не было :) Даже crash-dump создал.
    Какая может быть логика в том что время от времени возникает NO_MORE_IRP_STACK_LOCATIONS ?
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    видимо ты неправильно обрабатываешь ирп. покажи !analyze -v и сбойную функцию-обработчик irp в твоем дрове
     
  16. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    вот analize -v:
    Код (Text):
    1. BUGCHECK_STR:  0x35
    2.  
    3. PROCESS_NAME:  System
    4.  
    5. LOCK_ADDRESS:  8055a560 -- (!locks 8055a560)
    6.  
    7. Resource @ nt!IopDeviceTreeLock (0x8055a560)    Shared 1 owning threads
    8.      Threads: 821c6b30-01<*>
    9. 1 total locks, 1 locks currently held
    10.  
    11. PNP_TRIAGE:
    12.     Lock address  : 0x8055a560
    13.     Thread Count  : 1
    14.     Thread address: 0x821c6b30
    15.     Thread wait   : 0xbcc
    16.  
    17. LAST_CONTROL_TRANSFER:  from 804eee98 to 804f9c37
    18.  
    19. STACK_TEXT:  
    20. f88c7150 804eee98 00000035 818c64b8 00000000 nt!KeBugCheckEx+0x1b
    21. f88c7168 a9b46bb4 a9b3dcc0 81899000 a9b39420 nt!IopfCallDriver+0x18
    22. f88c781c a9b44fc0 81eae248 e27bd1fe 00000000 serial!GetDiskInfo+0x1e2 [z:\protect.c @ 291]
    23. f88c7830 8058006a 81eae248 81899000 00000000 serial!DriverEntry+0x140 [z:\initunlo.c @ 244]
    24. f88c7900 8058e1df 80000860 00000000 f88c7900 nt!IopLoadDriver+0x66c
    25. f88c7944 805e5ad7 e26dd370 00000001 80000860 nt!PipCallDriverAddDeviceQueryRoutine+0x235
    26. f88c7990 805e5e0c f88c7a1c e26dd35c f88c79f0 nt!RtlpCallQueryRegistryRoutine+0x3b1
    27. f88c79f4 8058fa67 00000000 00000084 00000001 nt!RtlQueryRegistryValues+0x2a6
    28. f88c7ac8 80590f24 00000000 00000001 f88c7d5c nt!PipCallDriverAddDevice+0x261
    29. f88c7d24 805914ba 82144b88 00000001 00000000 nt!PipProcessDevNodeTree+0x1a4
    30. f88c7d54 804f66bc 00000003 8055a5c0 8056375c nt!PiRestartDevice+0x80
    31. f88c7d7c 80537757 00000000 00000000 821c6b30 nt!PipDeviceActionWorker+0x168
    32. f88c7dac 805ce794 00000000 00000000 00000000 nt!ExpWorkerThread+0xef
    33. f88c7ddc 805450ce 80537668 00000001 00000000 nt!PspSystemThreadStartup+0x34
    34. 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16
    35.  
    36.  
    37. STACK_COMMAND:  kb
    38.  
    39. FOLLOWUP_IP:
    40. serial!GetDiskInfo+1e2 [z:\protect.c @ 291]
    41. a9b46bb4 3d03010000      cmp     eax,103h
    42.  
    43. FAULTING_SOURCE_CODE:  
    44.    287:         #if DBG
    45.    288:         DbgPrint("serial.sys[GetDiskInfo]: IoCallDriver - success\n");
    46.    289:         #endif
    47.    290:                
    48. >  291:         if(status == STATUS_PENDING)
    49.    292:         {
    50.    293:             #if DBG
    51.    294:             DbgPrint("serial.sys[GetDiskInfo]: IoCallDriver return STATUS_PENDING\nWaiting...\n");
    52.    295:             #endif
    53.    296:             //timeout.QuadPart = -100000000; //timeout 10s
    54.  
    55.  
    56. SYMBOL_STACK_INDEX:  2
    а ирп я создаю для другого драйвера:

    Код (Text):
    1.            ...
    2.            NTSTATUS         status;
    3.     OBJECT_ATTRIBUTES   oa;
    4.     PIRP                pIRP = NULL;
    5.     PIO_STACK_LOCATION  pNextStack;
    6.     PDEVICE_OBJECT      pDeviceObject;
    7.     PFILE_OBJECT        pFileObject;
    8.     UNICODE_STRING      usPhysicalDriveName;
    9.     WCHAR               wcPhysicalDriveName[] = L"\\??\\PhysicalDrive0";
    10.     BOOL                bRes = FALSE;
    11.  
    12.     GETVERSIONINPARAMS  VersionParams;
    13.     IO_STATUS_BLOCK     iosb;
    14.     KEVENT              Event;
    15.     SENDCMDINPARAMS     scip;
    16.     BYTE                IdOutCmd [sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1];
    17.  
    18.     wcPhysicalDriveName[17] = drive + L'0';
    19.  
    20.     RtlInitUnicodeString(&usPhysicalDriveName, wcPhysicalDriveName);
    21.     InitializeObjectAttributes(&oa, &usPhysicalDriveName, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, NULL);
    22.  
    23.     status = IoGetDeviceObjectPointer(&usPhysicalDriveName,
    24.                               GENERIC_READ | GENERIC_WRITE,
    25.                        &pFileObject,
    26.                        &pDeviceObject );
    27.  
    28.     if(status != STATUS_SUCCESS)
    29.     {
    30.         #if DBG
    31.         DbgPrint("serial.sys[GetDiskInfo]: IoGetDeviceObjectPointer fail\n");
    32.         #endif
    33.         return bRes;
    34.     }
    35.    
    36.     KeInitializeEvent(&Event, NotificationEvent, FALSE);
    37.     pIRP = IoBuildDeviceIoControlRequest(SMART_GET_VERSION,
    38.                                          pDeviceObject,
    39.                                          NULL,
    40.                                          0,
    41.                                          &VersionParams,
    42.                                          sizeof(VersionParams),
    43.                                          FALSE,
    44.                                          &Event,
    45.                                          &iosb);
    46.     if(pIRP == NULL)
    47.     {
    48.         ObDereferenceObject(pFileObject);
    49.         return bRes;
    50.     }
    51.     pIRP->Tail.Overlay.OriginalFileObject = pFileObject;
    52.     pIRP->RequestorMode = KernelMode;
    53.     pNextStack = IoGetNextIrpStackLocation(pIRP);
    54.     pNextStack->FileObject = pFileObject;
    55.     pNextStack->MajorFunction = IRP_MJ_DEVICE_CONTROL;
    56.    
    57.     status = IoCallDriver(pDeviceObject, pIRP);
    58.    
    59.     if(status == STATUS_PENDING)
    60.     {
    61.         KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
    62.         status = iosb.Status;
    63.     }
    64.  
    65.     if(status != STATUS_SUCCESS)
    66.     {
    67.         ObDereferenceObject(pFileObject);
    68.         return bRes;
    69.     }
    70.  
    71.            ...
    72.            KeClearEvent(&Event);
    73.     pIRP = IoBuildDeviceIoControlRequest(SMART_RCV_DRIVE_DATA,
    74.                      pDeviceObject,
    75.                      &scip,
    76.                      sizeof(SENDCMDINPARAMS) - 1,
    77.                      &IdOutCmd,
    78.                      sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1,
    79.                      FALSE,
    80.                      &Event,
    81.                      &iosb);
    82.     if(pIRP == NULL)
    83.     {
    84.            ObDereferenceObject(pFileObject);
    85.            return bRes;
    86.     }
    87.     pIRP->Tail.Overlay.OriginalFileObject = pFileObject;
    88.     pIRP->RequestorMode = KernelMode;
    89.     pNextStack = IoGetNextIrpStackLocation(pIRP);
    90.     pNextStack->FileObject = pFileObject;
    91.     pNextStack->MajorFunction = IRP_MJ_DEVICE_CONTROL;
    92.  
    93.     status = IoCallDriver(pDeviceObject, pIRP);
    94.     if(status == STATUS_PENDING) // <- сюда указывает ip в краше
    95.     {
    96.       ...
    97.            }
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    этот бсод возникает, если Irp->CurrentLocation <= 1, то есть у pDeviceObject у тебя StackSize=0 во время вызова IoBuildDeviceIoControlRequest но так вроде не бывает)

    первый и единственный параметр багчека - указатель на IRP.
    покажи его дамп через !irp
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    да, еще dt nt!_IRP -r <адрес> тоже не помешает
     
  19. Maveric

    Maveric New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2004
    Сообщения:
    90
    Great
    Приду на работу и всё покажу :)
    Расскажи как ты узнал что
    ?
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    это единственное условие по которому он генерируется в единственном месте в IopfCallDriver:

    Код (Text):
    1.     Irp->CurrentLocation--;
    2.  
    3.     if (Irp->CurrentLocation <= 0) {
    4.         KiBugCheck3( NO_MORE_IRP_STACK_LOCATIONS, (ULONG_PTR) Irp, 0, 0 );
    5.     }
    (WRK sources)