Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Отображение памяти  (Прочитано 6461 раз)
0 Пользователей и 1 Гость смотрят эту тему.
maaaaaad
Гость
« : 21-09-2003 23:34 » 

Интересно, можно ли на виртуальные адреса юзеровского процесса отобразить набор страниц (варианты: последовательные, разбросанные)? Собственно говоря интересует официальный механизм. кто-нибудь делал так?

Пример девайс не может прермещать свои буфера в адресном пространстве (или мы не можем управлять этим), а хочется сделать прямой доступ к такому буферу из юзер моде.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 22-09-2003 06:29 » 

Конечно можно. Вот так( код я спер отсюда http://www.osronline.com/article.cfm?id=39 ).

Код:
PVOID CreateAndMapMemory()
{
    PVOID buffer;   
    PMDL  mdl;
    PVOID userVAToReturn;

    //
    // Allocate a 4K buffer to share with the application
    //
    buffer = ExAllocatePoolWithTag(NonPagedPool,
                                   PAGE_SIZE,
                                   'MpaM');

    if(!buffer)  {
        return(NULL);
    }

    //
    // Allocate and initalize an MDL that describes the buffer
    //
    mdl = IoAllocateMdl(buffer,
                        PAGE_SIZE,
                        FALSE,
                        FALSE,
                        NULL);

    if(!mdl)  {
        ExFreePool(buffer);
        return(NULL);
    }

    //
    // Finish building the MDL -- Fill in the "page portion"
    //
    MmBuildMdlForNonPagedPool(mdl);
 

#if NT_40

    //
    // Map the buffer into user space
    //
    // NOTE: This function bug checks if out of PTEs
    //

    userVAToReturn = MmMapLockedPages(mdl,

                                      UserMode);
#else
    //
    // The preferred V5 way to map the buffer into user space
    //

    userVAToReturn =
         MmMapLockedPagesSpecifyCache(mdl,          // MDL
                                      UserMode,     // Mode
                                      MmCached,     // Caching
                                      NULL,         // Address
                                      FALSE,        // Bugcheck?
                                      NormalPagePriority); // Priority

    //
    // If we get NULL back, the request didn't work.
    // I'm thinkin' that's better than a bug check anyday.
    //
    if(!userVAToReturn)  {
        IoFreeMdl(mdl);       
        ExFreePool(buffer);
        return(NULL);
    }
#endif
    //
    // Store away both the mapped VA and the MDL address, so that
    // later we can call MmUnmapLockedPages(StoredPointer, StoredMdl)
    //
    StoredPointer = userVAToReturn;
    StoredMdl = mdl;
    DbgPrint("UserVA = 0x%0x\n", userVAToReturn);
    return(userVAToReturn);
}

То есть выделяешь память, создаешь для нее MDL, инициализируешь MDL и отображаешь его с помощью MmMapLockedPagesSpecifyCache в юзерское пространство ( параметр UserMode). Только тебе надо быть в пространстве того юзерского процесса, куда отображаешь или надо KeStackAttachProcess /  KeUnstackDetachProcess сделать.
Не забудь MmUnmapLockedPages.
« Последнее редактирование: 19-11-2007 20:34 от Алексей1153++ » Записан
maaaaaad
Гость
« Ответ #2 : 05-10-2003 12:21 » new

Сенькс, все работает......седня сел и сразу все заработало...=))

Нада еще глянуть как сильно изменились PT/PD.....

MmUnmapLockedPages тоже должна вызываться в контексте процесса, на который произошло отображение.....хех, интересно, а что делать если процесс "внезапно"=)) закрылся. Мертвецам уже все равно, наверно=)



         case IOCTL_XWDM_MAP: {
            PXWDM_DEVICE_EXT DevExt;
            PLONG pdw;

            DbgPrint(DRIVER_NAME "DeviceControl: IOCTL_XWDM_MAP\n");
            pdw = Irp->AssociatedIrp.SystemBuffer;
            DevExt = DeviceObject->DeviceExtension;
            __try {
               CreateAndMapMemory(DeviceObject->DeviceExtension);
               *pdw = DevExt->MapMemUs;
               Irp->IoStatus.Information = 4;
            }
            __except(EXCEPTION_EXECUTE_HANDLER) {
               DbgPrint(DRIVER_NAME "IOCTL_XWDM_MAP cause exception\n");
            }
            }
            break;

         case IOCTL_XWDM_UNMAP:
            DbgPrint(DRIVER_NAME "DeviceControl: IOCTL_XWDM_UNMAP\n");
            UnCreateAndMapMemory(DeviceObject->DeviceExtension);
            break;

         case IOCTL_XWDM_TESTMAP: {            
            PXWDM_DEVICE_EXT DevExt = DeviceObject->DeviceExtension;

            DbgPrint(DRIVER_NAME "DeviceControl: IOCTL_XWDM_TESTMAP\n");
            __try {
               DbgPrint(DevExt->MapMemKe);
               pb = DevExt->MapMemKe;
               pb[0] = 'B';
               pb[1] = 'y';
               pb[2] = 'e';
            }
            __except(EXCEPTION_EXECUTE_HANDLER) {
               DbgPrint(DRIVER_NAME "Cause exception!\n");
            }
            
            
            }
            break;







   DWORD MappedVa;

   printf("---------------------------------------------\n");
   printf("Testing IOCTL_XWDM_MAP (0x%x): ",IOCTL_XWDM_MAP);
   if (!DeviceIoControl(
         hDev,
         IOCTL_XWDM_MAP,
         NULL,NULL,
         &MappedVa,4,
         &BytesProcessed,
         NULL
         )) {
   
      printf("ERROR!\n");
      goto ErrorProcessing;
   } else {
      printf("OK! %d bytes processed\n", BytesProcessed);
      printf("Mapped VA = 0x%X\n", MappedVa);
   }

   if (MappedVa != NULL) {
      __try {
         lstrcpyA((char *) MappedVa, "Hi, cruel world!\n");
      } __except(EXCEPTION_CONTINUE_EXECUTION) {
         printf("Cause exception (trying to copy test message) VA correct?!\n");
      }
      printf("---------------------------------------------\n");
      printf("Testing IOCTL_XWDM_TESTMAP (0x%x): ",IOCTL_XWDM_TESTMAP);
      if (!DeviceIoControl(
            hDev,
            IOCTL_XWDM_TESTMAP,
            NULL,NULL,
            NULL,NULL,
            &BytesProcessed,
            NULL
      )){
         printf("ERROR!\n");
         goto ErrorProcessing;
      } else {
         printf("OK! %d bytes processed\n", BytesProcessed);
         __try {
            printf("Test message writed driver: %s\n", MappedVa);
         } __except (EXCEPTION_CONTINUE_EXECUTION) {
            printf("Cause exception (printing test message)\n");
         }
         printf("Memory un mapped\n");
      }


      
      printf("---------------------------------------------\n");
      printf("Testing IOCTL_XWDM_UNMAP (0x%x): ",IOCTL_XWDM_UNMAP);
      if (!DeviceIoControl(
            hDev,
            IOCTL_XWDM_UNMAP,
            NULL,NULL,
            NULL,NULL,
            &BytesProcessed,
            NULL
      )){
         printf("ERROR!\n");
         goto ErrorProcessing;
      } else {
         printf("OK! %d bytes processed\n", BytesProcessed);
         printf("Memory un mapped\n");
      }
   }
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines