ring3 из ring0, Vista, XP

Тема в разделе "WASM.NT.KERNEL", создана пользователем user, 8 окт 2008.

  1. user

    user New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2008
    Сообщения:
    2
    столкнулся с случайными "бсод" под Vista, в XP все на ура, причем бсод не всегда а может быть 1 на 10 без ошибок
    Код (Text):
    1. DWORD InstallUserModeApc(PKTHREAD pTargetThread, PEPROCESS pTargetProcess){
    2.     PRKAPC pApc;
    3.     PMDL pMdl;
    4.     PVOID pMappedAddress;   //This is where the UserMode routine's code will be placed at
    5.     KAPC_STATE ApcState;    //Needed for KeStackAttachProcess
    6.  
    7.     //Allocate memory for our APC
    8.     if((pApc=ExAllocatePool(NonPagedPool, sizeof(KAPC)))){
    9.  
    10.         //Allocate an MDL describing our ApcCreateProcess memory
    11.         if((pMdl=IoAllocateMdl(ApcCreateProcess, PROC_LEN, FALSE, FALSE, NULL))){
    12.  
    13.             __try{
    14.                 MmProbeAndLockPages(pMdl, KernelMode, IoWriteAccess);
    15.             }
    16.             __except(EXCEPTION_EXECUTE_HANDLER){
    17.                 DPRINT("kexec -> Exception during MmProbeAndLockPages");
    18.                 IoFreeMdl(pMdl);
    19.                 ExFreePool(pApc);
    20.                 return -1;
    21.             }
    22.  
    23.             //Attach to the process's address space, map the physical pages (our code) described by 'pMdl', detach
    24.             //KeStackAttachProcess(&pTargetProcess->Pcb, &ApcState);
    25.             KeStackAttachProcess((PKPROCESS)pTargetProcess, &ApcState);
    26.             __try{
    27.                 pMappedAddress = MmMapLockedPagesSpecifyCache(pMdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority);
    28.             }
    29.             __except(EXCEPTION_EXECUTE_HANDLER){
    30.                 pMappedAddress = NULL;
    31.             }
    32. #ifdef DEBUG
    33.             memcpy((unsigned char*)pMappedAddress+PROC_LEN-0x10, "calc.exe", 9);
    34. #endif
    35.  
    36.             KeUnstackDetachProcess(&ApcState);
    37.  
    38.             if(pMappedAddress){
    39.                 DPRINT("kexec -> UserMode memory at address: 0x%p", pMappedAddress);
    40.  
    41.                 //initialize the APC and queue it
    42.                 KeInitializeApc(pApc, pTargetThread, OriginalApcEnvironment, &ApcKernelRoutine, NULL, pMappedAddress, UserMode, NULL);
    43.                 if(KeInsertQueueApc(pApc, pMdl, NULL, 0)){
    44.                     DPRINT("kexec -> APC delivered");
    45.  
    46.                     return 0;
    47.                 }else{
    48.                     DPRINT("kexec -> Failed to insert APC");
    49.                 }
    50.  
    51.             }else{
    52.                 DPRINT("kexec -> Cannot map address");
    53.             }
    54.  
    55.             MmUnlockPages(pMdl);
    56.             IoFreeMdl(pMdl);
    57.         }else{
    58.             DPRINT("kexec -> Failed to allocate MDL");
    59.         }
    60.  
    61.         ExFreePool(pApc);
    62.     }else{
    63.         DPRINT("kexec -> Failed to allocate memory for the APC structure");
    64.     }
    65.  
    66.     return -1;
    67. }
    иногда Arg3: 00000000, чтение

    делаю: DriverEntry, IoGetCurrentProcess, explorer.exe, alertable thread, InstallUserModeApc

    может для висты надо добовить дополнительный код проверки?
    пробовал try{KeInsertQueueApc} - тогда синий екран на процессе cssrs.exe
    drv.sys собирал ddk 3790.1830 и wdk 6001.18001

    ЗЫ: проверяю на реальном железе перегружая ос, пробывал на вмваре - перегружалось пол дня без единого синего екрана :-/
     
  2. 0x56

    0x56 New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2008
    Сообщения:
    63
    а может сначала скомпилить дебаг версию драйвера?
     
  3. user

    user New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2008
    Сообщения:
    2
    Код (Text):
    1. 8575dad4 9cfcc509 93bad670 93bad750 9cfccea4 drv+0x67d (вызов KeInsertQueueApc из InstallUserModeApc) - коде сверху:  if(KeInsertQueueApc(pApc, pMdl, NULL, 0)){
    2. 8575db00 9cfccbd4 95429db0 90573000 00000000 drv+0x509 (вызов InstallUserModeApc из MyFirstFunct :))))))) когда нашол процес и поток) - ее код верху
    3. 8575db18 82379376 95429db0 90573000 00000000 drv+0xbd4 (вызов MyFirstFunct :))))))) перед выходом из DriverEntry)