Mirror Driver

Тема в разделе "WASM.NT.KERNEL", создана пользователем nbyte, 27 май 2007.

  1. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Никаких я модификаций в коде не производил.
    В чём тут может быть дело?
     
  2. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Нашол с интернете тока эту инфу
    Тока неособо понимаю как GDIINFO сделать так?
     
  3. kelt

    kelt New Member

    Публикаций:
    0
    Регистрация:
    28 май 2007
    Сообщения:
    16
    посмотри на свою реализацию DrvEnablePDEV. выстави там соответствующий флаг и будет все замечательно.
     
  4. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    kelt, ну вроде так всё сделал переинтсталировал заново драйвер, но всеровно иконки такие.
    Вот такой я сделал код
    Код (Text):
    1. DHPDEV DrvEnablePDEV(
    2. DEVMODEW   *pDevmode,       // Pointer to DEVMODE
    3. PWSTR       pwszLogAddress, // Logical address
    4. ULONG       cPatterns,      // number of patterns
    5. HSURF      *ahsurfPatterns, // return standard patterns
    6. ULONG       cjGdiInfo,      // Length of memory pointed to by pGdiInfo
    7. ULONG      *pGdiInfo,       // Pointer to GdiInfo structure
    8. ULONG       cjDevInfo,      // Length of following PDEVINFO structure
    9. DEVINFO    *pDevInfo,       // physical device information structure
    10. HDEV        hdev,           // HDEV, used for callbacks
    11. PWSTR       pwszDeviceName, // DeviceName - not used
    12. HANDLE      hDriver)        // Handle to base driver
    13. {
    14.     GDIINFO GdiInfo;
    15.     DEVINFO DevInfo;
    16.     PPDEV   ppdev = (PPDEV) NULL;
    17.  
    18.     DISPDBG((0,"DrvEnablePDEV:\n"));
    19.  
    20.     UNREFERENCED_PARAMETER(pwszLogAddress);
    21.     UNREFERENCED_PARAMETER(pwszDeviceName);
    22.  
    23.     // Allocate a physical device structure.
    24.  
    25.     ppdev = (PPDEV) EngAllocMem(0, sizeof(PDEV), ALLOC_TAG);
    26.  
    27.     if (ppdev == (PPDEV) NULL)
    28.     {
    29.         RIP("DISP DrvEnablePDEV failed EngAllocMem\n");
    30.         return((DHPDEV) 0);
    31.     }
    32.  
    33.     memset(ppdev, 0, sizeof(PDEV));
    34.  
    35.     // Save the screen handle in the PDEV.
    36.  
    37.     ppdev->hDriver = hDriver;
    38.  
    39.     // Get the current screen mode information.  Set up device caps and devinfo.
    40.  
    41.     if (!bInitPDEV(ppdev, pDevmode, &GdiInfo, &DevInfo))
    42.     {
    43.         DISPDBG((0,"DISP DrvEnablePDEV failed\n"));
    44.         goto error_free;
    45.     }
    46.    
    47.     // Copy the devinfo into the engine buffer.
    48.  
    49.     memcpy(pDevInfo, &DevInfo, min(sizeof(DEVINFO), cjDevInfo));
    50.  
    51.     // Set the pdevCaps with GdiInfo we have prepared to the list of caps for this
    52.     // pdev.
    53.  
    54.     GdiInfo.flShadeBlend = 3;
    55.     memcpy(pGdiInfo, &GdiInfo, min(cjGdiInfo, sizeof(GDIINFO)));
    56.  
    57.     //
    58.     return((DHPDEV) ppdev);
    59.  
    60.     // Error case for failure.
    61. error_free:
    62.     EngFreeMem(ppdev);
    63.     return((DHPDEV) 0);
    64. }
    Может что нетак?
     
  5. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    kelt, может можешь что сказать насчет этого бага?
    Как я понимаю что я вижу на экране монитора(что выводиться) это другой драйвер контролирует,так как Mirror Driver влияет на работу другого ?
    Ну получается вроде так.
     
  6. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Ну может кто подскажеь хоть чтонибудь ?
     
  7. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    kelt, я решил ту проблему, там с палитрой была проблемма.
    Спасибо большое за ответы.
     
  8. kelt

    kelt New Member

    Публикаций:
    0
    Регистрация:
    28 май 2007
    Сообщения:
    16
    на всякое пожарное будущее: mirror driver все же влияет на возможности графической подсистемы. например, с работающим mirror driver гражданка vista отказывается запускать aero.
     
  9. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    kelt, а может знаешь где я могу статей каких про этот тайнственный Mirror Driver.
    Вся проблема в том что недостаточно инфы.
    У меня опять проблема другая.
    Вот на этой картинке видно
    [​IMG]
     
  10. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Может кто знает получше способ снятия и иментшения изображения, без большой нагрузки на процессор?
    А то мне то что Aero не поддерживает тоже очень ненравиться.
     
  11. nbyte

    nbyte New Member

    Публикаций:
    0
    Регистрация:
    27 май 2007
    Сообщения:
    161
    Может kelt или кто другой ответит.
    При DrvEscape в дрйвере используется обшая память с user-mode?
    Я попробовал сделать такой код что-бы получить Surface
    Код (Text):
    1. ULONG DrvEscape(
    2.     SURFOBJ *pso,
    3.     ULONG iEsc,
    4.     ULONG cjIn,
    5.     PVOID pvIn,
    6.     ULONG cjOut,
    7.     PVOID pvOut)
    8. {
    9.  
    10.     if (pvOut == NULL)
    11.     {
    12.         DISPDBG((0, "Experimental NULL param\n"));
    13.         return 0;
    14.     }
    15.     memcpy(&pvOut,&pso->pvBits,pso->cjBits);
    16.     DISPDBG((0, "Experimental %s: %p, %p, %p, %p, %p, %p\n", __FUNCTION__, pso, iEsc, cjIn, pvIn, cjOut, pvOut));
    17.     return pso->cjBits;
    18. }
    и в usermode вызываю так (Delphi)
    Код (Text):
    1.     GetMem(surfObjPointer,10485760);
    2.     ExtEscape(hdc1,1,2,nil,3,surfObjPointer);
    Но как тока вызываю то экран ставиться синим, тоеть система обрываеться.
     
  12. Timur

    Timur New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2009
    Сообщения:
    3
    nbyte

    Как вижу ты разобрался с mirror driver? Можешь помочь?
     
  13. Nerka

    Nerka New Member

    Публикаций:
    0
    Регистрация:
    14 мар 2009
    Сообщения:
    16
    Привет, очень скоро перебежал по теме, так что возможно что то упустил. Насчет non transparent иконок на десктопе... отдавая pGdiInfo->cBitsPixel нужно указать 32 бита (помоему ето просто текусчий BPP должен бить). Есче один bug в microsoft mirror sample есть тоже в фаиле screen.c на самом конце:
    EngCreatePalette(PAL_BITFIELDS, 0,NULL, ppdev->flRed,ppdev->flGreen,ppdev->flBlue); <== здесь в оригинале перемешани цвета (зелений и синий) и в итоге получите безпредел в фреимбуфере. насчет других артефактов (ненормальные combobox и т.д.), у меня тоже по началу били проблеми но исправляя microsoft mirror sample исчезли. Теперь все просто летает. Даже на delphi клиентской програме можно смотреть фильмы конкретно realtime без тормозов (1600 х 1200 х 32!) и всяких изменений hardware acceleration. Source кинуть пока нехочю, но если есть вопроси, спрашивайте, постораюсь помочь.

    P.S.

    насчет передачи экрана в usermode через DrvEscape, я просто загружаю другой kernelmode dll при помощи EngLoadImage, потом визиваю EngFindImageProcAddress и там уже пользуюсь своеи нормальной (т.е. с импортами из ntoskrnl) функцией которая мапит nonpaged video память в usermode virtual address (в контексте визиваюсчего процесса конечно, см.: IoAllocateMdl, MmBuildMdlForNonPagedPool, MmMapLockedPagesSpecifyCache). Тогда остается, только трансформировать если нужно видео память в свои формат (ddb, dib (top-down, bottom-up)) и т.д.

    Для отслеживания изменений по моему не нужно изобретать велосипед. Для этого можно брать пример с сорсов VirtualBox например (имею в виду интересекти RECTL с CLIPOBJ и т.д.)
     
  14. Timur

    Timur New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2009
    Сообщения:
    3
    Драйвер установил нормально, ничего не меняя. Все как у всех выдает.
    Вопрос такой- ставишь bWndObj в True, и получаешь - printf("Mirror driver specific DC creation failed\n"), ну а если чуть код меняешь для hdc, уже другая проблема- printf("ExtEscape: WNDOBJ_SETUP failed\n"). И никак с ней не справиться. Я так понимаю в созданном окошке ("Mirror Driver Tracking Window") что-то интересное должно происходить. да я никак не разберусь.

    Код (Text):
    1.  if (bWndObj)
    2.         {
    3.             HWND hwnd = CreateWindow("Mirror Driver Tracking Window");
    4.  
    5.             if (hwnd)
    6.             {
    7.                 HDC hdc = CreateDC("Display", deviceName, NULL, NULL);
    8.  
    9.                 if (hdc)
    10.                 {
    11.                     ShowWindow (SW_SHOW);
    12.                     UpdateWindow();        
    13.                     int ret = ExtEscape(hdc,
    14.                                         WNDOBJ_SETUP,
    15.                                         4,
    16.                                         this,
    17.                                         0,
    18.                                         (LPSTR)NULL);
    19.  
    20.                     if (ret <= 0)
    21.                     {
    22.                         printf("ExtEscape: WNDOBJ_SETUP failed\n");
    23.                     }
    24.                     else
    25.                     {
    26.                         MSG msg;
    27.  
    28.                         while(GetMessage(&msg, NULL, 0, 0))
    29.                         {
    30.                             TranslateMessage(&msg);
    31.                             DispatchMessage(&msg);
    32.                         }
    33.                     }
    34.                 }
    35.                 else
    36.                 {
    37.                     printf("Mirror driver specific DC creation failed\n");
    38.                 }
    39.             }
    40.             else
    41.             {
    42.                printf("Hwnd creation failed\n");
    43.             }
    44.         }
     
  15. SHKIPER

    SHKIPER New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    1
    интересует данная тема, может кто подскажет, откуда копать, ссылку на сайт и т.д.
     
  16. Timur

    Timur New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2009
    Сообщения:
    3
    Ув. nbyte

    Если ты еще на форуме, дай знать.
    Оченно надо