Физический адрес памяти видеокарты
Кинте линком а?
Мне нужен именно линейный адрес видео
Иначе только через GDI. Можно сделать DIB-секцию, и копировать байты пикселей в нее, а после того как кадр нарисован, делать блиттинг. Примерно так делает OpenGL. В любом случае без окна не обойтись.
Иначе только через GDI. Можно сделать DIB-секцию, и копировать байты пикселей в нее, а после того как кадр нарисован, делать блиттинг. Примерно так делает OpenGL. В любом случае без окна не обойтись.
DirectDrawCreate(
SetCooperativeLevel(
CreateSurface(
Surface->Lock(
виртуальный адрес видеопамяти, и никаких окон, и никаких HDC
в общем я нашел один способ, на уровне ядра, но пока не проверял
invoke IoGetDeviceInterfaces, offset GUID_DEVINTERFACE_DISPLAY_ADAPTER, 0, DEVICE_INTERFACE_INCLUDE_NONACTIVE, offset pw
invoke RtlInitUnicodeString, offset uDevName, pw
invoke IoGetDeviceObjectPointer, offset uDevName, FILE_READ_DATA, offset FileObject, offset DeviceObject
invoke ExFreePool, pw
invoke KeInitializeEvent, offset event, NotificationEvent, FALSE
invoke IoGetAttachedDeviceReference, DeviceObject
mov targetObject, eax
invoke IoBuildDeviceIoControlRequest, IOCTL_VIDEO_MAP_VIDEO_MEMORY, targetObject, offset videoMemory, sizeof VIDEO_MEMORY, pVI, sizeof VIDEO_MEMORY_INFORMATION, FALSE, offset event, offset ioStatusBlock
mov _irp, eax
invoke IoCallDriver, targetObject, _irp
.if eax==STATUS_PENDING
invoke KeWaitForSingleObject, offset event, Executive, KernelMode, FALSE, NULL
.endif
invoke ObDereferenceObject, targetObject
DirectDrawCreate(
SetCooperativeLevel(
CreateSurface(
Surface->Lock(
виртуальный адрес видеопамяти, и никаких окон, и никаких HDC
В SetCooperativeLevel передается хэндл окна.
Окно нужно всегда.
Во-первых для того чтобы полноэкранное приложения можно было свернуть и развернуть.
Во-вторых, т.к. тогда могут случиться нечайные запуски ярлыков на рабочем столе и т.д.. Курсор мыши продолжает функционировать, даже если он скрыт, не говоря о фокусе ввода с клавиатуры.
в общем я нашел один способ, на уровне ядра, но пока не проверял
А еще можно напрямую комманды драйверу отправлять, но так до BSOD недалеко. Я не стал бы так извращаться.
кроме того как известно десктоп не является окном в полном смысле этого слова
чтобы не срабатывали ярлыки корректно обрабатывать сообщения мыши/клавы надо
Но это все лирика, мне нужен был именно линейный адрес, более того в режиме ядра, потому директХ тут как бы второстепенен
Я не говорил что это окно. Я говорил, что можно брать его HDC.
А device context можно использовать для блиттинга (разницы в скорости между этим методом и использованием direct x - не заметно невооруженным глазом).
Ну что ж, может быть. Хотя если честно не могу представить для какой задачи может быть нужен линейный адрес в редиме ядра. Это ненадежно.
-----------------------------------
Но я вас ни к чему не склоняю. :)
У меня задача снять картинку с монитора так чтобы не мешать оператору.
Разница заметна если использовать память напрямую, и даже невооруженным глазом.
К примеру когда лочишь поверхность исчезает курсор. (на некоторых видюхах). Тоже самое при работе с контекстом. И это сильней заметно когда используются графические программы например WinCC. Если же работать напрямую с памятью курсор не исчезнет. Только есть вероятность попасть в период обновления экрана, картинка может быть смазанной.
И как раз о надежности и идет речь, так как я обнаружил, что не на всех видюхах можно использовать директХ, к примеру, на серверах у которых видюха встроенная, а видов и типов компьютеров у меня много. Поэтому нужен универсальный метод.