В общем случае - нет, а теоретически, конечно, возможно, т.к. сама по себе виртуальная память пользовательского процесса не сильно отличается от виртуальной памяти процесса ядра. Чтобы получить доступ к виртуальной памяти определённого процесса и не словить при этом ошибку страницы или что-нибудь типа того, должны быть выполнены определённые условия. Во-первых, целевой процесс должен быть текущим, т.к. на irql>=2 приаттачится к произвольному процессу по документации нельзя. Во-вторых, целевые страницы должны быть заблокированы, но здесь следует помнить, что гарантировано заблокировать (зафиксировать в физической памяти) страницы можно только с помощью сервиса NtLockVirtualMemory() с флагом MAP_SYSTEM (функция VirtualLock() для этого не подходит), при чём если вызов сервиса происходит не в ядре, то у вызывающего процесса должна быть включена привилегия SeLockMemoryPrivilege.
Проблему с irql всеже решил, теперь irql 0. Проблема в другом когда выделяю память через ZwAllocateVirtualMemory то к ней все равно не возможно обратиться, почему ? вот код: Код (Text): VOID WorkHandlerSendData(PDEVICE_OBJECT DeviceObject, PWORK_ROUTINE_DATA wData) { __asm int 3; KeGetCurrentIrql(); LockCallBackList(); do{ PLIST_ENTRY pList = g_CallbackList.Flink; while (pList != &g_CallbackList) { PREGISTER_CALLBACK ptmp = CONTAINING_RECORD(pList,REGISTER_CALLBACK,CallbackList); if ( CheckProcessAndThread(ptmp->hProcess,ptmp->hThread) ) { PKPROCESS pk; if ( NT_SUCCESS(GetProcess(ptmp->hProcess,&pk)) ) { RKAPC_STATE kApc = {0}; KeStackAttachProcess(pk,&kApc); { PCHAR p = NULL; SIZE_T Size = sizeof(ULONG) + wData->InSize; NTSTATUS ntStatus; CLIENT_ID cid; OBJECT_ATTRIBUTES ob; HANDLE hProcess; cid.UniqueProcess = ptmp->hProcess; cid.UniqueThread = 0; InitializeObjectAttributes(&ob,NULL,OBJ_KERNEL_HANDLE,NULL,NULL); ntStatus = ZwOpenProcess(&hProcess,PROCESS_ALL_ACCESS,&ob,&cid); if ( NT_SUCCESS ( ntStatus ) ) { ntStatus = ZwAllocateVirtualMemory(hProcess,&p,0,&Size,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE); if ( NT_SUCCESS(ntStatus)) { *((PULONG)p) = wData->InSize; RtlCopyMemory(p + sizeof(ULONG),wData->InBuf,wData->InSize); LoaderQueueApcEx(ptmp->hThread,ptmp->ApcRoutine,ptmp->ApcContext,p + sizeof(ULONG),p,FALSE); }; ZwClose(hProcess); }; }; KeUnstackDetachProcess(&kApc); ObDereferenceObject(pk); }; } else { PLIST_ENTRY tmp = pList->Flink; RemoveEntryList(pList); ExFreePool(pList); pList = tmp; continue; }; pList = pList->Flink; }; }while(0); UnLockCallBackList(); ExFreePool(wData->InBuf); ExFreePool(wData); }; Все происходит примерно так одно приложение регистрирует у драйвера callback функцию, второе приложение обращается к драйверу и передает данные далее эти данные должны быть переданные в callback функцию первого приложения. Мда банальная ошибка, из-за LockCallBackList (повышает irql )
XshStasX Во первых у вас драйвер приаттачен к процессу (если не понятно как то смотрите в реализацию KeStackAttachProcess на манипуляцию cr регистра), а значит доступ к памяти есть, вот только я бы так память не выделял: ntStatus = ZwAllocateVirtualMemory(hProcess,&p,0,&Size,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE); Я бы заменил на ntStatus = ZwAllocateVirtualMemory(hProcess,&p,0,&Size,MEM_COMMIT,PAGE_READWRITE);