посмотри на свою реализацию DrvEnablePDEV. выстави там соответствующий флаг и будет все замечательно.
kelt, ну вроде так всё сделал переинтсталировал заново драйвер, но всеровно иконки такие. Вот такой я сделал код Код (Text): DHPDEV DrvEnablePDEV( DEVMODEW *pDevmode, // Pointer to DEVMODE PWSTR pwszLogAddress, // Logical address ULONG cPatterns, // number of patterns HSURF *ahsurfPatterns, // return standard patterns ULONG cjGdiInfo, // Length of memory pointed to by pGdiInfo ULONG *pGdiInfo, // Pointer to GdiInfo structure ULONG cjDevInfo, // Length of following PDEVINFO structure DEVINFO *pDevInfo, // physical device information structure HDEV hdev, // HDEV, used for callbacks PWSTR pwszDeviceName, // DeviceName - not used HANDLE hDriver) // Handle to base driver { GDIINFO GdiInfo; DEVINFO DevInfo; PPDEV ppdev = (PPDEV) NULL; DISPDBG((0,"DrvEnablePDEV:\n")); UNREFERENCED_PARAMETER(pwszLogAddress); UNREFERENCED_PARAMETER(pwszDeviceName); // Allocate a physical device structure. ppdev = (PPDEV) EngAllocMem(0, sizeof(PDEV), ALLOC_TAG); if (ppdev == (PPDEV) NULL) { RIP("DISP DrvEnablePDEV failed EngAllocMem\n"); return((DHPDEV) 0); } memset(ppdev, 0, sizeof(PDEV)); // Save the screen handle in the PDEV. ppdev->hDriver = hDriver; // Get the current screen mode information. Set up device caps and devinfo. if (!bInitPDEV(ppdev, pDevmode, &GdiInfo, &DevInfo)) { DISPDBG((0,"DISP DrvEnablePDEV failed\n")); goto error_free; } // Copy the devinfo into the engine buffer. memcpy(pDevInfo, &DevInfo, min(sizeof(DEVINFO), cjDevInfo)); // Set the pdevCaps with GdiInfo we have prepared to the list of caps for this // pdev. GdiInfo.flShadeBlend = 3; memcpy(pGdiInfo, &GdiInfo, min(cjGdiInfo, sizeof(GDIINFO))); // return((DHPDEV) ppdev); // Error case for failure. error_free: EngFreeMem(ppdev); return((DHPDEV) 0); } Может что нетак?
kelt, может можешь что сказать насчет этого бага? Как я понимаю что я вижу на экране монитора(что выводиться) это другой драйвер контролирует,так как Mirror Driver влияет на работу другого ? Ну получается вроде так.
на всякое пожарное будущее: mirror driver все же влияет на возможности графической подсистемы. например, с работающим mirror driver гражданка vista отказывается запускать aero.
kelt, а может знаешь где я могу статей каких про этот тайнственный Mirror Driver. Вся проблема в том что недостаточно инфы. У меня опять проблема другая. Вот на этой картинке видно
Может кто знает получше способ снятия и иментшения изображения, без большой нагрузки на процессор? А то мне то что Aero не поддерживает тоже очень ненравиться.
Может kelt или кто другой ответит. При DrvEscape в дрйвере используется обшая память с user-mode? Я попробовал сделать такой код что-бы получить Surface Код (Text): ULONG DrvEscape( SURFOBJ *pso, ULONG iEsc, ULONG cjIn, PVOID pvIn, ULONG cjOut, PVOID pvOut) { if (pvOut == NULL) { DISPDBG((0, "Experimental NULL param\n")); return 0; } memcpy(&pvOut,&pso->pvBits,pso->cjBits); DISPDBG((0, "Experimental %s: %p, %p, %p, %p, %p, %p\n", __FUNCTION__, pso, iEsc, cjIn, pvIn, cjOut, pvOut)); return pso->cjBits; } и в usermode вызываю так (Delphi) Код (Text): GetMem(surfObjPointer,10485760); ExtEscape(hdc1,1,2,nil,3,surfObjPointer); Но как тока вызываю то экран ставиться синим, тоеть система обрываеться.
Привет, очень скоро перебежал по теме, так что возможно что то упустил. Насчет 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 и т.д.)
Драйвер установил нормально, ничего не меняя. Все как у всех выдает. Вопрос такой- ставишь bWndObj в True, и получаешь - printf("Mirror driver specific DC creation failed\n"), ну а если чуть код меняешь для hdc, уже другая проблема- printf("ExtEscape: WNDOBJ_SETUP failed\n"). И никак с ней не справиться. Я так понимаю в созданном окошке ("Mirror Driver Tracking Window") что-то интересное должно происходить. да я никак не разберусь. Код (Text): if (bWndObj) { HWND hwnd = CreateWindow("Mirror Driver Tracking Window"); if (hwnd) { HDC hdc = CreateDC("Display", deviceName, NULL, NULL); if (hdc) { ShowWindow (SW_SHOW); UpdateWindow(); int ret = ExtEscape(hdc, WNDOBJ_SETUP, 4, this, 0, (LPSTR)NULL); if (ret <= 0) { printf("ExtEscape: WNDOBJ_SETUP failed\n"); } else { MSG msg; while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } else { printf("Mirror driver specific DC creation failed\n"); } } else { printf("Hwnd creation failed\n"); } }