столкнулся с случайными "бсод" под Vista, в XP все на ура, причем бсод не всегда а может быть 1 на 10 без ошибок Код (Text): DWORD InstallUserModeApc(PKTHREAD pTargetThread, PEPROCESS pTargetProcess){ PRKAPC pApc; PMDL pMdl; PVOID pMappedAddress; //This is where the UserMode routine's code will be placed at KAPC_STATE ApcState; //Needed for KeStackAttachProcess //Allocate memory for our APC if((pApc=ExAllocatePool(NonPagedPool, sizeof(KAPC)))){ //Allocate an MDL describing our ApcCreateProcess memory if((pMdl=IoAllocateMdl(ApcCreateProcess, PROC_LEN, FALSE, FALSE, NULL))){ __try{ MmProbeAndLockPages(pMdl, KernelMode, IoWriteAccess); } __except(EXCEPTION_EXECUTE_HANDLER){ DPRINT("kexec -> Exception during MmProbeAndLockPages"); IoFreeMdl(pMdl); ExFreePool(pApc); return -1; } //Attach to the process's address space, map the physical pages (our code) described by 'pMdl', detach //KeStackAttachProcess(&pTargetProcess->Pcb, &ApcState); KeStackAttachProcess((PKPROCESS)pTargetProcess, &ApcState); __try{ pMappedAddress = MmMapLockedPagesSpecifyCache(pMdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority); } __except(EXCEPTION_EXECUTE_HANDLER){ pMappedAddress = NULL; } #ifdef DEBUG memcpy((unsigned char*)pMappedAddress+PROC_LEN-0x10, "calc.exe", 9); #endif KeUnstackDetachProcess(&ApcState); if(pMappedAddress){ DPRINT("kexec -> UserMode memory at address: 0x%p", pMappedAddress); //initialize the APC and queue it KeInitializeApc(pApc, pTargetThread, OriginalApcEnvironment, &ApcKernelRoutine, NULL, pMappedAddress, UserMode, NULL); if(KeInsertQueueApc(pApc, pMdl, NULL, 0)){ DPRINT("kexec -> APC delivered"); return 0; }else{ DPRINT("kexec -> Failed to insert APC"); } }else{ DPRINT("kexec -> Cannot map address"); } MmUnlockPages(pMdl); IoFreeMdl(pMdl); }else{ DPRINT("kexec -> Failed to allocate MDL"); } ExFreePool(pApc); }else{ DPRINT("kexec -> Failed to allocate memory for the APC structure"); } return -1; } иногда Arg3: 00000000, чтение делаю: DriverEntry, IoGetCurrentProcess, explorer.exe, alertable thread, InstallUserModeApc может для висты надо добовить дополнительный код проверки? пробовал try{KeInsertQueueApc} - тогда синий екран на процессе cssrs.exe drv.sys собирал ddk 3790.1830 и wdk 6001.18001 ЗЫ: проверяю на реальном железе перегружая ос, пробывал на вмваре - перегружалось пол дня без единого синего екрана :-/
Код (Text): 8575dad4 9cfcc509 93bad670 93bad750 9cfccea4 drv+0x67d (вызов KeInsertQueueApc из InstallUserModeApc) - коде сверху: if(KeInsertQueueApc(pApc, pMdl, NULL, 0)){ 8575db00 9cfccbd4 95429db0 90573000 00000000 drv+0x509 (вызов InstallUserModeApc из MyFirstFunct :))))))) когда нашол процес и поток) - ее код верху 8575db18 82379376 95429db0 90573000 00000000 drv+0xbd4 (вызов MyFirstFunct :))))))) перед выходом из DriverEntry)