память в user-mode для обращание из irql = 2

Тема в разделе "WASM.NT.KERNEL", создана пользователем XshStasX, 9 сен 2011.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Можно как то выделять память в юзермоде чтоб к ней можно было обратиться на irql = 2?
     
  2. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    XshStasX
    нет
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    В общем случае - нет, а теоретически, конечно, возможно, т.к. сама по себе виртуальная память пользовательского процесса не сильно отличается от виртуальной памяти процесса ядра. Чтобы получить доступ к виртуальной памяти определённого процесса и не словить при этом ошибку страницы или что-нибудь типа того, должны быть выполнены определённые условия. Во-первых, целевой процесс должен быть текущим, т.к. на irql>=2 приаттачится к произвольному процессу по документации нельзя. Во-вторых, целевые страницы должны быть заблокированы, но здесь следует помнить, что гарантировано заблокировать (зафиксировать в физической памяти) страницы можно только с помощью сервиса NtLockVirtualMemory() с флагом MAP_SYSTEM (функция VirtualLock() для этого не подходит), при чём если вызов сервиса происходит не в ядре, то у вызывающего процесса должна быть включена привилегия SeLockMemoryPrivilege.
     
  4. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Проблему с irql всеже решил, теперь irql 0. Проблема в другом когда выделяю память через ZwAllocateVirtualMemory то к ней все равно не возможно обратиться, почему ?
    вот код:
    Код (Text):
    1. VOID WorkHandlerSendData(PDEVICE_OBJECT  DeviceObject, PWORK_ROUTINE_DATA wData)
    2. {
    3.     __asm int 3;
    4.     KeGetCurrentIrql();
    5.  
    6.     LockCallBackList();
    7.     do{
    8.         PLIST_ENTRY pList = g_CallbackList.Flink;
    9.         while (pList != &g_CallbackList)
    10.         {
    11.             PREGISTER_CALLBACK ptmp = CONTAINING_RECORD(pList,REGISTER_CALLBACK,CallbackList);
    12.             if ( CheckProcessAndThread(ptmp->hProcess,ptmp->hThread) )
    13.             {
    14.                 PKPROCESS pk;
    15.                 if ( NT_SUCCESS(GetProcess(ptmp->hProcess,&pk)) )
    16.                 {
    17.                     RKAPC_STATE kApc = {0};
    18.                     KeStackAttachProcess(pk,&kApc);
    19.                     {
    20.                         PCHAR    p = NULL;
    21.                         SIZE_T   Size = sizeof(ULONG) + wData->InSize;
    22.                         NTSTATUS ntStatus;
    23.                         CLIENT_ID cid;
    24.                         OBJECT_ATTRIBUTES ob;
    25.                         HANDLE hProcess;
    26.  
    27.                         cid.UniqueProcess = ptmp->hProcess;
    28.                         cid.UniqueThread  = 0;
    29.  
    30.                         InitializeObjectAttributes(&ob,NULL,OBJ_KERNEL_HANDLE,NULL,NULL);
    31.                         ntStatus = ZwOpenProcess(&hProcess,PROCESS_ALL_ACCESS,&ob,&cid);
    32.                         if ( NT_SUCCESS ( ntStatus ) )
    33.                         {
    34.                             ntStatus = ZwAllocateVirtualMemory(hProcess,&p,0,&Size,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);
    35.                             if ( NT_SUCCESS(ntStatus))
    36.                             {
    37.                                 *((PULONG)p) = wData->InSize;
    38.                                 RtlCopyMemory(p + sizeof(ULONG),wData->InBuf,wData->InSize);
    39.                                 LoaderQueueApcEx(ptmp->hThread,ptmp->ApcRoutine,ptmp->ApcContext,p + sizeof(ULONG),p,FALSE);
    40.                             };
    41.                             ZwClose(hProcess);
    42.                         };
    43.                     };
    44.                     KeUnstackDetachProcess(&kApc);
    45.                     ObDereferenceObject(pk);
    46.                 };
    47.             }
    48.             else
    49.             {
    50.                 PLIST_ENTRY tmp = pList->Flink;
    51.                 RemoveEntryList(pList);
    52.                 ExFreePool(pList);
    53.                 pList = tmp;
    54.                 continue;
    55.             };
    56.             pList = pList->Flink;
    57.         };
    58.  
    59.     }while(0);
    60.     UnLockCallBackList();
    61.     ExFreePool(wData->InBuf);
    62.     ExFreePool(wData);
    63. };
    Все происходит примерно так одно приложение регистрирует у драйвера callback функцию, второе приложение обращается к драйверу и передает данные далее эти данные должны быть переданные в callback функцию первого приложения.


    Мда банальная ошибка, из-за LockCallBackList (повышает irql )
     
  5. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    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);
    :)
     
  6. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    Для этого всего-то нужно сделать память неподкачиваемой. И обращайтесь на любом левеле.