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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Не работает драйвер с функциями из ntoskrnl.exe в MirrorDriver  (Прочитано 46226 раз)
0 Пользователей и 1 Гость смотрят эту тему.
MirrorCoder
Участник

ru
Offline Offline

« : 01-11-2008 11:47 » 

Добрый день!
У меня такая проблема пишу свой миррор драйвер и я использую функции из либы ntoskrnl, но...
Если использовать из данной либы какие-либо функции,например RtlInitUnicodeString, то драйвер тут же перестает функционировать, хотя из WinObjEx программы показывается, что драйвер запускается. Пытался делать контрольные точки, которые вели лог до использования этих функций из данной либы... Собствнно вопрос: Почему драйвер перестает функционировать, когда используешь функции из ntoskrnl.lib ? (для уточнения, он не перехватывает граф.операции если использую функции, которые я отметил в ниже след. коде комментариями, я привел часть кода в котором перехватывается функция BitBlt)
Код:
#define DBG 1


#include "driver.h"
...
BOOL DrvBitBlt(
   IN SURFOBJ *psoDst,
   IN SURFOBJ *psoSrc,
   IN SURFOBJ *psoMask,
   IN CLIPOBJ *pco,
   IN XLATEOBJ *pxlo,
   IN RECTL *prclDst,
   IN POINTL *pptlSrc,
   IN POINTL *pptlMask,
   IN BRUSHOBJ *pbo,
   IN POINTL *pptlBrush,
   IN ROP4 rop4
   )
{
//#pragma comment (lib, "E:\\WinDDK\\lib\\wxp\\i386\\ntoskrnl.lib")
   INT cnt1 = 0, cnt2 = 0;

    BOOL bMore;
    CLIPRECTS cr;
    RECTL* prclClip;
    ULONG* lenstr;
int crects = 0;
ULONG temp_var = 0;
ULONG* var_1;
P_RECTL arr_rectl,arr_rectl_1;
/////////////
   ULONG file;
   ULONG file_3;
   char* pointer;
   ULONG file_1;
   ULONG size;
   ULONG *size1;
   char* pointer_1;
   char* pointer_2;
   UNICODE_STRING EventName;
   PHANDLE EventHandle = NULL;
   PKEVENT pEventObject;

          CLIPOBJ_cEnumStart(pco, FALSE, CT_RECTANGLES, CD_ANY, 0);
arr_rectl = (P_RECTL)EngAllocMem (FL_ZERO_MEMORY,sizeof(t_mytype_rectl),ALLOC_TAG);
arr_rectl_1 = arr_rectl;
        do
        {
            bMore = CLIPOBJ_bEnum(pco, sizeof(cr), (ULONG*)&cr);
for (prclClip = &cr.arcl[0]; cr.c != 0; cr.c--, prclClip++)
            {
arr_rectl -> rectl = *prclClip;
arr_rectl -> next  = EngAllocMem (FL_ZERO_MEMORY,sizeof(t_mytype_rectl),ALLOC_TAG);
arr_rectl = (P_RECTL)arr_rectl -> next;
crects++;
}
        } while (bMore);
EngFreeMem((P_RECTL)arr_rectl -> next);
   pointer = (char *)EngMapFile(L"\\??\\c:\\111.txt",4,&file);
   size1 = (ULONG *)pointer;
   size = *size1;
   pointer_1 = (char *)EngMapFile(L"\\??\\c:\\112.txt",size+sizeof(RECTL)*crects+4+strlen("DrvBitBlt"),&file_1);
   //memcpy(pointer_1 + size,crects,sizeof(ULONG));
   var_1 = (ULONG *)pointer_1 + size;
   *var_1 = crects;
   arr_rectl=arr_rectl_1;
   while (crects != 0)
   {
   crects--;
   memcpy((ULONG *)pointer_1 + size,&(arr_rectl->rectl),sizeof(RECTL));
   arr_rectl = arr_rectl -> next;
   }
   crects = *var_1;
   lenstr  = (ULONG *)pointer_1 + size+sizeof(RECTL)*crects;
   *lenstr = strlen("DrvBitBlt");
   memcpy(pointer_1 + size+sizeof(RECTL)*crects+sizeof(strlen("DrvBitBlt")),"DrvBitBlt",strlen("DrvBitBlt"));
   size +=sizeof(RECTL)*crects+strlen("DrvBitBlt")+sizeof(strlen("DrvBitBlt"));
   *size1 = size;
   EngUnmapFile(file);
   EngUnmapFile(file_1);

 RtlInitUnicodeString(&EventName, L"\\BaseNameObjects\\MyMirrorEvent"); //используется вот эта функция
 pEventObject = IoCreateNotificationEvent(&EventName, EventHandle); //используется вот эта функция
 KeClearEvent(pEventObject); //используется вот эта функция
 KeSetEvent(pEventObject,0,FALSE); //используется вот эта функция
 KeClearEvent(pEventObject); //используется вот эта функция
   if (psoSrc)
   {
       if (psoSrc->dhsurf)
       {
          MIRRSURF *mirrsurf = (MIRRSURF *)psoSrc->dhsurf;

          if (mirrsurf->bIsScreen)
          {
             DISPDBG((1, "From Mirror Screen "));
          }
          else
          {
             DISPDBG((1, "From Mirror DFB "));
          }
          cnt1 ++;
       }
       else
       {
          DISPDBG((1, "From DIB "));
       }
   }

   if (psoDst)
   {
       if (psoDst->dhsurf)
       {
          MIRRSURF *mirrsurf = (MIRRSURF *)psoDst->dhsurf;

          if (mirrsurf->bIsScreen)
          {
             DISPDBG((1, "to MirrorScreen "));
          }
          else
          {
             DISPDBG((1, "to Mirror DFB "));
          }
          cnt2 ++;
       }
       else
       {
          DISPDBG((1, "to DIB "));
       }
   }

   if (cnt1 && cnt2)
   {
      DISPDBG((1, " [Send Request Over Wire]\n"));
   }
   else if (cnt1)
   {
      DISPDBG((1, " [Read Cached Bits, Or Pull Bits]\n"));
   }
   else if (cnt2)
   {
      DISPDBG((1, " [Push Bits/Compress]\n"));
   }
   else
   {
      DISPDBG((1, " [What Are We Doing Here?]\n"));
   }

   return FALSE;
}
...
Смысл драйвера таков:
найти все изменения экрана, записать в файл и оповестить приложение (событие в сигнальное состояние перевести)
Спасибо заранее)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 01-11-2008 14:43 » 

Доброго Улыбаюсь

что значит перестает функционировать?  BSOD? номер ошибки?
RtlInitUnicodeString вызывается при IRQL <= DISPATCH_LEVEL - удовлетоворяется?
IoCreateNotificationEvent - вообще только на  IRQL = PASSIVE_LEVEL!

а во вторых раздел DDK:
Цитата
Using Events in Display Drivers
GDI provides support for events, a type of kernel dispatcher object that can be used to synchronize two threads running below DISPATCH_LEVEL. A display driver can use events to synchronize access to the video hardware:

By the display driver and the video miniport driver
By the display or video miniport driver and another component, such as an OpenGL driver or a program extension (such as the Display program in Control Panel).

The following table lists the GDI event-related functions.
...

Цитата
Using Events in Video Miniport Drivers
The video port driver provides support for events, a type of kernel dispatcher object that can be used to synchronize two threads running below DISPATCH_LEVEL. A video miniport driver can use events to synchronize access to the video hardware:

By the video miniport driver and the display driver
By the display or video miniport driver and another component, such as an OpenGL driver or a program extension (such as the Display program in Control Panel).

The following table lists the event-related functions that the video port driver supplies.
...
Цитата
GDI Event Services
GDI provides several services related to events. Drivers using these services can create and delete events, map and unmap events, and read, set and clear events.
-наверное не зря новые функции ввели.
см. EngCreateEvent() или VideoPortCreateEvent()
впрочем последнее - мои предположения) сам графикой не занимался...

а по поводу вообще использования ntoskrnl в видео драверах - честно надо DDK читать. слабо себе их структуру представляю. посмотрите у Руссиновича, и Фень Юань. может там что то есть.

попробуйте для начала GDI-шные event-ы использовать?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MirrorCoder
Участник

ru
Offline Offline

« Ответ #2 : 02-11-2008 11:12 » 

 Улыбаюсь я вообще новичок в программирование драйверов, но нужно написать этот драйвер Улыбаюсь
Цитата
что значит перестает функционировать?  BSOD? номер ошибки?
вот именно ничего этого нету, просто ни BSOD,ни номера ошибки.
Если быть поточнеее, то если эти функции убрать, то у меня в файл писались изменения экрана, а если добавить хоть одну из них, то изменения в файл не писались, да и сам  файл не создавался.
EngCreateEvent() - в мсдн написано, что это для синхронизации драйвера дисплея и минипорта.
VideoPortCreateEvent() - пока ещё не особо разобрался.
---
Все что мне нужно добиться это оповещение приложения любыми способами о том, что произошли изменения на экране без потерь производительности. Хотя заметил вот такую особенности у миррор драйвера УльтраВНС и РАДМИН, что у первого достаточно много функций реализовано, а в радмин только костяк из майкрософтского примера и оба хорошо функционируют (смотрел из HEX-редактора и заметил названия функций используемых). У меня такое преположение, что например , когда происходят изменения на экране, то вызывается сначала операция из перехватчиков, а потом уже самого драйвера, но может есть возможность вызвать какое-нибудь параллельно приложение и передать обработанные данные из перехватчика в само это приложение?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 02-11-2008 19:04 » 

в структуру драйвера особо вникать - сложно, поэтому:
предлагаю следуюшие возможные варианты решений:
1. вопервых я так понимаю что DrvBitBlt() это у вас типа HOOK процедуры? перенесите инициализацию события за ее переделы.
2 возможно стоит попробовать KeInitializeEvent() - для связи с приложением. поищите в форуме, я уже описывал как. KeSetEvent - поиграть параметрами  Wait =FALSE.
3. почему вы ставите NotificationEvent ? помоему там имеет смысл только SynchronizationEvent. потому что нотификационные события пытаются немедленно запустить ожидающую нить.... не уверен что вам это надо.
4 на кайний случай. заведите вспомогательную нить, ей передавать Interlocked счетчик. а она уже события выставляет. либо DPC в очередь ставить... (но то все уже совсем на крайний случай)


для начала наконец высяните на каком IRQL вызывается ваша функция. - возможно это многое объяснит. воспользуйтесь KeGetCurrentIrql() и выведете в лог.

далее попробуйте использовать SynchronizationEvent и KeInitializeEvent().

поместите DISPDBG до момента использования этих функций - мало ли... вызывается ли оно вообще? и если да, то один раз или...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MirrorCoder
Участник

ru
Offline Offline

« Ответ #4 : 02-11-2008 19:15 » 

Ochkarik, о спасибо, за такую интересную информацию, пойду немедленно проверять
Записан
MirrorCoder
Участник

ru
Offline Offline

« Ответ #5 : 02-11-2008 19:21 » 

Цитата
1. вопервых я так понимаю что DrvBitBlt() это у вас типа HOOK процедуры? перенесите инициализацию события за ее переделы.
да. Абсолютно верно.
Цитата
3. почему вы ставите NotificationEvent ? помоему там имеет смысл только SynchronizationEvent. потому что нотификационные события пытаются немедленно запустить ожидающую нить.... не уверен что вам это надо.
мне так сказали ранее на другом форуме сделать, да и удобно оказалось, не знал всех этих тонкостей
Записан
MirrorCoder
Участник

ru
Offline Offline

« Ответ #6 : 02-11-2008 20:10 » 

Ochkarik,
что-то не то...
сейчас попытался следовать тем советам что Вы мне дали... используя функции не Eng* , то требуется подключить ещё либы, подключаю, но происходит тоже, что и раньше, не работает. Вставил KeGetCurrentIrql() пришлось подключить либу hal.lib , подключил и произошло все по аналогии с ntoskrnl.lib... я немного в ступоре, если не совсем
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 02-11-2008 20:21 » 

так.... все интереснее и интереснее...
а покажите все свичи компилятора и линкера?
выравнивание структур - какое стоит?
кстати чем копилируете?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 02-11-2008 23:10 » 

забавно.... сейчас посмотрел на раздел Display Drivers.... а ведь там даже для выделения памяти своя функция EngAllocMem()
к чему бы это?... надо почитать)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MirrorCoder
Участник

ru
Offline Offline

« Ответ #9 : 02-11-2008 23:13 » 

Компилирую DDK 3790.1830, ничего больше в настройках не менял, использую готовый пример из DDK , немного только начал вносить своё для дальнейших целей.
прилагаю все имеющиеся измененный оттуда файлы.
из папки src\video\diplays\mirror\disp
Код:
файл source
TARGETNAME=mirror
TARGETPATH=obj
TARGETTYPE=GDI_DRIVER
!IFNDEF MSC_WARNING_LEVEL
MSC_WARNING_LEVEL=/W3
!ENDIF

MSC_WARNING_LEVEL=$(MSC_WARNING_LEVEL) /WX
TARGETLIBS=$(SDK_LIB_PATH)\ntoskrnl.lib
TARGETLIBS=$(SDK_LIB_PATH)\hal.lib
INCLUDES=..\inc;..\..\inc;..\..\..\inc;$(DDK_INC_PATH)
SOURCES=debug.c     \
        enable.c    \
        screen.c    \
        mirror.rc
Код:
файл enable.c
/******************************Module*Header*******************************\
*
*                           *******************
*                           * GDI SAMPLE CODE *
*                           *******************
*
* Module Name: enable.c
*
* This module contains the functions that enable and disable the
* driver, the pdev, and the surface.
*
* Copyright (c) 1992-1998 Microsoft Corporation
\**************************************************************************/
#define DBG 1


#include "driver.h"

// The driver function table with all function index/address pairs

static DRVFN gadrvfn[] =
{
    {   INDEX_DrvEnablePDEV,            (PFN) DrvEnablePDEV         },
    {   INDEX_DrvCompletePDEV,          (PFN) DrvCompletePDEV       },
    {   INDEX_DrvDisablePDEV,           (PFN) DrvDisablePDEV        },
    {   INDEX_DrvEnableSurface,         (PFN) DrvEnableSurface      },
    {   INDEX_DrvDisableSurface,        (PFN) DrvDisableSurface     },
    {   INDEX_DrvAssertMode,            (PFN) DrvAssertMode         },
#if 0
    // Windows 2000 Beta 3 has a bug in GDI that causes a crash
    // if a mirror driver supports device bitmaps.  A fix will be
    // in Windows 2000 RC0.
    {   INDEX_DrvCreateDeviceBitmap,    (PFN) DrvCreateDeviceBitmap },
    {   INDEX_DrvDeleteDeviceBitmap,    (PFN) DrvDeleteDeviceBitmap },
#endif
    {   INDEX_DrvTextOut,               (PFN) DrvTextOut            },
    {   INDEX_DrvBitBlt,                (PFN) DrvBitBlt             },
    {   INDEX_DrvCopyBits,              (PFN) DrvCopyBits           },
    {   INDEX_DrvStrokePath,            (PFN) DrvStrokePath         },
};

//
// always hook these routines to ensure the mirrored driver
// is called for our surfaces
//

#define flGlobalHooks   HOOK_BITBLT|HOOK_TEXTOUT|HOOK_COPYBITS|HOOK_STROKEPATH

// Define the functions you want to hook for 8/16/24/32 pel formats

#define HOOKS_BMF8BPP 0

#define HOOKS_BMF16BPP 0

#define HOOKS_BMF24BPP 0

#define HOOKS_BMF32BPP 0

/******************************Public*Routine******************************\
* DrvEnableDriver
*
* Enables the driver by retrieving the drivers function table and version.
*
\**************************************************************************/

BOOL DrvEnableDriver(
ULONG iEngineVersion,
ULONG cj,
PDRVENABLEDATA pded)
{
// Engine Version is passed down so future drivers can support previous
// engine versions.  A next generation driver can support both the old
// and new engine conventions if told what version of engine it is
// working with.  For the first version the driver does nothing with it.

    iEngineVersion;

    DISPDBG((0,"DrvEnableDriver:\n"));

// Fill in as much as we can.

    if (cj >= sizeof(DRVENABLEDATA))
        pded->pdrvfn = gadrvfn;

    if (cj >= (sizeof(ULONG) * 2))
        pded->c = sizeof(gadrvfn) / sizeof(DRVFN);

// DDI version this driver was targeted for is passed back to engine.
// Future graphic's engine may break calls down to old driver format.

    if (cj >= sizeof(ULONG))
// DDI_DRIVER_VERSION is now out-dated. See winddi.h
// DDI_DRIVER_VERSION_NT4 is equivalent to the old DDI_DRIVER_VERSION
        pded->iDriverVersion = DDI_DRIVER_VERSION_NT4;

    return(TRUE);
}

/******************************Public*Routine******************************\
* DrvEnablePDEV
*
* DDI function, Enables the Physical Device.
*
* Return Value: device handle to pdev.
*
\**************************************************************************/

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.

    memcpy(pGdiInfo, &GdiInfo, min(cjGdiInfo, sizeof(GDIINFO)));

    //
    return((DHPDEV) ppdev);

    // Error case for failure.
error_free:
    EngFreeMem(ppdev);
    return((DHPDEV) 0);
}

/******************************Public*Routine******************************\
* DrvCompletePDEV
*
* Store the HPDEV, the engines handle for this PDEV, in the DHPDEV.
*
\**************************************************************************/

VOID DrvCompletePDEV(
DHPDEV dhpdev,
HDEV  hdev)
{
    ((PPDEV) dhpdev)->hdevEng = hdev;
}

/******************************Public*Routine******************************\
* DrvDisablePDEV
*
* Release the resources allocated in DrvEnablePDEV.  If a surface has been
* enabled DrvDisableSurface will have already been called.
*
\**************************************************************************/

VOID DrvDisablePDEV(
DHPDEV dhpdev)
{
   PPDEV ppdev = (PPDEV) dhpdev;
  
   EngDeletePalette(ppdev->hpalDefault);

   EngFreeMem(dhpdev);
}

/******************************Public*Routine******************************\
* DrvEnableSurface
*
* Enable the surface for the device.  Hook the calls this driver supports.
*
* Return: Handle to the surface if successful, 0 for failure.
*
\**************************************************************************/

HSURF DrvEnableSurface(
DHPDEV dhpdev)
{
    PPDEV ppdev;
    HSURF hsurf;
    SIZEL sizl;
    ULONG ulBitmapType;
    FLONG flHooks;
    ULONG mirrorsize;
    MIRRSURF *mirrsurf;
    DHSURF dhsurf;

    // Create engine bitmap around frame buffer.

    DISPDBG((0,"DrvEnableSurface:\n"));

    ppdev = (PPDEV) dhpdev;

    ppdev->ptlOrg.x = 0;
    ppdev->ptlOrg.y = 0;

    sizl.cx = ppdev->cxScreen;
    sizl.cy = ppdev->cyScreen;

    if (ppdev->ulBitCount == 16)
    {
        ulBitmapType = BMF_16BPP;
        flHooks = HOOKS_BMF16BPP;
    }
    else if (ppdev->ulBitCount == 24)
    {
        ulBitmapType = BMF_24BPP;
        flHooks = HOOKS_BMF24BPP;
    }
    else
    {
        ulBitmapType = BMF_32BPP;
        flHooks = HOOKS_BMF32BPP;
    }
    
    flHooks |= flGlobalHooks;

    mirrorsize = (ULONG)(sizeof(MIRRSURF) +
                         ppdev->lDeltaScreen * sizl.cy);
    
    mirrsurf = (MIRRSURF *) EngAllocMem(FL_ZERO_MEMORY,
                                        mirrorsize,
                                        0x4D495252);
    if (!mirrsurf) {
        RIP("DISP DrvEnableSurface failed EngAllocMem\n");
        return(FALSE);
    }
    
    
    dhsurf = (DHSURF) mirrsurf;

    hsurf = EngCreateDeviceSurface(dhsurf,
                                   sizl,
                                   ulBitmapType);

    if (hsurf == (HSURF) 0)
    {
        RIP("DISP DrvEnableSurface failed EngCreateBitmap\n");
        return(FALSE);
    }

    if (!EngAssociateSurface(hsurf, ppdev->hdevEng, flHooks))
    {
        RIP("DISP DrvEnableSurface failed EngAssociateSurface\n");
        EngDeleteSurface(hsurf);
        return(FALSE);
    }

    ppdev->hsurfEng = (HSURF) hsurf;
    ppdev->pvTmpBuffer = (PVOID) dhsurf;

    mirrsurf->cx = ppdev->cxScreen;
    mirrsurf->cy = ppdev->cyScreen;
    mirrsurf->lDelta = ppdev->lDeltaScreen;
    mirrsurf->ulBitCount = ppdev->ulBitCount;
    mirrsurf->bIsScreen = TRUE;

    return(hsurf);
}

/******************************Public*Routine******************************\
* DrvDisableSurface
*
* Free resources allocated by DrvEnableSurface.  Release the surface.
*
\**************************************************************************/

VOID DrvDisableSurface(
DHPDEV dhpdev)
{
    PPDEV ppdev = (PPDEV) dhpdev;

    DISPDBG((0,"DrvDisableSurface:\n"));

    EngDeleteSurface( ppdev->hsurfEng );
    
    // deallocate MIRRSURF structure.

    EngFreeMem( ppdev->pvTmpBuffer );
}

/******************************Public*Routine******************************\
* DrvCopyBits
*
\**************************************************************************/

BOOL DrvCopyBits(
   OUT SURFOBJ *psoDst,
   IN SURFOBJ *psoSrc,
   IN CLIPOBJ *pco,
   IN XLATEOBJ *pxlo,
   IN RECTL *prclDst,
   IN POINTL *pptlSrc
   )
{
   INT cnt1 = 0, cnt2 = 0;

   DISPDBG((1,"Mirror Driver DrvCopyBits: \n"));

   if (psoSrc)
   {
       if (psoSrc->dhsurf)
       {
          MIRRSURF *mirrsurf = (MIRRSURF *)psoSrc->dhsurf;

          if (mirrsurf->bIsScreen)
          {
             DISPDBG((1, "From Mirror Screen "));
          }
          else
          {
             DISPDBG((1, "From Mirror DFB "));
          }
          cnt1 ++;
       }
       else
       {
          DISPDBG((1, "From DIB "));
       }
   }

   if (psoDst)
   {
       if (psoDst->dhsurf)
       {
          MIRRSURF *mirrsurf = (MIRRSURF *)psoDst->dhsurf;

          if (mirrsurf->bIsScreen)
          {
             DISPDBG((1, "to MirrorScreen "));
          }
          else
          {
             DISPDBG((1, "to Mirror DFB "));
          }
          cnt2 ++;
       }
       else
       {
          DISPDBG((1, "to DIB "));
       }
   }

   if (cnt1 && cnt2)
   {
      DISPDBG((1, " [Send Request Over Wire]\n"));
   }
   else if (cnt1)
   {
      DISPDBG((1, " [Read Cached Bits, Or Pull Bits]\n"));
   }
   else if (cnt2)
   {
      DISPDBG((1, " [Push Bits/Compress]\n"));
   }
   else
   {
      DISPDBG((1, " [What Are We Doing Here?]\n"));
   }

   return FALSE;
}

/******************************Public*Routine******************************\
* DrvBitBlt
*
\**************************************************************************/

BOOL DrvBitBlt(
   IN SURFOBJ *psoDst,
   IN SURFOBJ *psoSrc,
   IN SURFOBJ *psoMask,
   IN CLIPOBJ *pco,
   IN XLATEOBJ *pxlo,
   IN RECTL *prclDst,
   IN POINTL *pptlSrc,
   IN POINTL *pptlMask,
   IN BRUSHOBJ *pbo,
   IN POINTL *pptlBrush,
   IN ROP4 rop4
   )
{
//#pragma comment (lib, "E:\\WinDDK\\lib\\wxp\\i386\\ntoskrnl.lib")
  INT cnt1 = 0, cnt2 = 0;
/*
    BOOL bMore;
    CLIPRECTS cr;
    RECTL* prclClip;
    ULONG* lenstr;
int crects = 0;
ULONG temp_var = 0;
ULONG* var_1;
P_RECTL arr_rectl,arr_rectl_1;
/////////////
*/
   ULONG file;
   ULONG file_3;
   char* pointer;
   PEVENT* tmp_event = NULL;
   BOOL tmpb;
   KIRQL kirql;
   /*
   ULONG file_1;
   ULONG size;
   ULONG *size1;
   char* pointer_1;
   char* pointer_2;
   */
  // UNICODE_STRING EventName;
   /*
   PHANDLE EventHandle = NULL;
   PKEVENT pEventObject;
   /////////////
  // #include <ntddk.h>
       CLIPOBJ_cEnumStart(pco, FALSE, CT_RECTANGLES, CD_ANY, 0);
arr_rectl = (P_RECTL)EngAllocMem (FL_ZERO_MEMORY,sizeof(t_mytype_rectl),ALLOC_TAG);
arr_rectl_1 = arr_rectl;
        do
        {
            bMore = CLIPOBJ_bEnum(pco, sizeof(cr), (ULONG*)&cr);
for (prclClip = &cr.arcl[0]; cr.c != 0; cr.c--, prclClip++)
            {
arr_rectl -> rectl = *prclClip;
arr_rectl -> next  = EngAllocMem (FL_ZERO_MEMORY,sizeof(t_mytype_rectl),ALLOC_TAG);
arr_rectl = (P_RECTL)arr_rectl -> next;
crects++;
}
        } while (bMore);
EngFreeMem((P_RECTL)arr_rectl -> next);
// arr_rectl->next = (PVOID)NULL;
   //учесть строку length_stroki+"DrvBitBlt"
   //учесть число количества прямоугольников */
   pointer = (char *)EngMapFile(L"\\??\\c:\\111.txt",10,&file);
   memcpy(pointer,"test ",5);
   kirql = KeGetCurrentIrql();
   memcpy((ULONG*)pointer+5,&kirql,sizeof(KIRQL));
   EngUnmapFile(file);
 //   RtlInitUnicodeString(&EventName, L"\\BaseNameObjects\\MyMirrorEvent");
   /*
   size1 = (ULONG *)pointer;
   size = *size1;
   pointer_1 = (char *)EngMapFile(L"\\??\\c:\\112.txt",size+sizeof(RECTL)*crects+4+strlen("DrvBitBlt"),&file_1);
   //memcpy(pointer_1 + size,crects,sizeof(ULONG));
   var_1 = (ULONG *)pointer_1 + size;
   *var_1 = crects;
   arr_rectl=arr_rectl_1;
   while (crects != 0)
   {
   crects--;
   memcpy((ULONG *)pointer_1 + size,&(arr_rectl->rectl),sizeof(RECTL));
   arr_rectl = arr_rectl -> next;
   }
   crects = *var_1;
   lenstr  = (ULONG *)pointer_1 + size+sizeof(RECTL)*crects;
   *lenstr = strlen("DrvBitBlt");
   memcpy(pointer_1 + size+sizeof(RECTL)*crects+sizeof(strlen("DrvBitBlt")),"DrvBitBlt",strlen("DrvBitBlt"));
   size +=sizeof(RECTL)*crects+strlen("DrvBitBlt")+sizeof(strlen("DrvBitBlt"));
   *size1 = size;
   EngUnmapFile(file);
   EngUnmapFile(file_1);
  //    DISPDBG((1,
    //        "Mirror Driver DrvBitBlt (Mask=%08x, rop=%08x:\n",
      //      psoMask,
        //  rop4));
pointer_1 = (char *)EngMapFile(L"\\??\\c:\\112.txt",4,&file_1);
memcpy(pointer_1,"FUCK",4);
EngUnmapFile(file_1);
pointer_1 = (char *)EngMapFile(L"\\??\\c:\\112.txt",104,&file_1);
 RtlInitUnicodeString(&EventName, L"\\BaseNameObjects\\MyMirrorEvent");
memcpy((ULONG *)pointer_1+4,&EventName,66);
 pEventObject = IoCreateNotificationEvent(&EventName, EventHandle);
 if (pEventObject = NULL)  memcpy(pointer_1+66,"NULL",4);
 EngUnmapFile(file_1);
 KeClearEvent(pEventObject);
 KeSetEvent(pEventObject,0,FALSE);
 KeClearEvent(pEventObject); */
   if (psoSrc)
   {
       if (psoSrc->dhsurf)
       {
          MIRRSURF *mirrsurf = (MIRRSURF *)psoSrc->dhsurf;

          if (mirrsurf->bIsScreen)
          {
             DISPDBG((1, "From Mirror Screen "));
          }
          else
          {
             DISPDBG((1, "From Mirror DFB "));
          }
          cnt1 ++;
       }
       else
       {
          DISPDBG((1, "From DIB "));
       }
   }

   if (psoDst)
   {
       if (psoDst->dhsurf)
       {
          MIRRSURF *mirrsurf = (MIRRSURF *)psoDst->dhsurf;

          if (mirrsurf->bIsScreen)
          {
             DISPDBG((1, "to MirrorScreen "));
          }
          else
          {
             DISPDBG((1, "to Mirror DFB "));
          }
          cnt2 ++;
       }
       else
       {
          DISPDBG((1, "to DIB "));
       }
   }

   if (cnt1 && cnt2)
   {
      DISPDBG((1, " [Send Request Over Wire]\n"));
   }
   else if (cnt1)
   {
      DISPDBG((1, " [Read Cached Bits, Or Pull Bits]\n"));
   }
   else if (cnt2)
   {
      DISPDBG((1, " [Push Bits/Compress]\n"));
   }
   else
   {
      DISPDBG((1, " [What Are We Doing Here?]\n"));
   }

   return FALSE;
}

BOOL DrvTextOut(
   IN SURFOBJ *psoDst,
   IN STROBJ *pstro,
   IN FONTOBJ *pfo,
   IN CLIPOBJ *pco,
   IN RECTL *prclExtra,
   IN RECTL *prclOpaque,
   IN BRUSHOBJ *pboFore,
   IN BRUSHOBJ *pboOpaque,
   IN POINTL *pptlOrg,
   IN MIX mix
   )
{
   DISPDBG((1,
            "Mirror Driver DrvTextOut: pwstr=%08x\n",
            pstro ? pstro->pwszOrg : (WCHAR*)-1));

   return FALSE;
}

BOOL
DrvStrokePath(SURFOBJ*   pso,
              PATHOBJ*   ppo,
              CLIPOBJ*   pco,
              XFORMOBJ*  pxo,
              BRUSHOBJ*  pbo,
              POINTL*    pptlBrush,
              LINEATTRS* pLineAttrs,
              MIX        mix)
{
   DISPDBG((1,
            "Mirror Driver DrvStrokePath:\n"));

   return FALSE;
}

#if 0

HBITMAP DrvCreateDeviceBitmap(
   IN DHPDEV dhpdev,
   IN SIZEL sizl,
   IN ULONG iFormat
   )
{
   HBITMAP hbm;
   MIRRSURF *mirrsurf;
   ULONG mirrorsize;
   DHSURF dhsurf;
   ULONG stride;
   HSURF hsurf;

   PPDEV ppdev = (PPDEV) dhpdev;
  
   DISPDBG((1,"CreateDeviceBitmap:\n"));
  
   if (iFormat == BMF_1BPP || iFormat == BMF_4BPP)
   {
      return NULL;
   };

   // DWORD align each stride
   stride = (sizl.cx*(iFormat/8)+3);
   stride -= stride % 4;
  
   mirrorsize = (int)(sizeof(MIRRSURF) + stride * sizl.cy);

   mirrsurf = (MIRRSURF *) EngAllocMem(FL_ZERO_MEMORY,
                                       mirrorsize,
                                       0x4D495252);
   if (!mirrsurf) {
        RIP("DISP DrvEnableSurface failed EngAllocMem\n");
        return(FALSE);
   }
                                      
   dhsurf = (DHSURF) mirrsurf;

   hsurf = (HSURF) EngCreateDeviceBitmap(dhsurf,
                                 sizl,
                                 iFormat);

   if (hsurf == (HSURF) 0)
   {
       RIP("DISP DrvEnableSurface failed EngCreateBitmap\n");
       return(FALSE);
   }

   if (!EngAssociateSurface(hsurf,
                            ppdev->hdevEng,
                            flGlobalHooks))
   {
       RIP("DISP DrvEnableSurface failed EngAssociateSurface\n");
       EngDeleteSurface(hsurf);
       return(FALSE);
   }
  
   mirrsurf->cx = sizl.cx;
   mirrsurf->cy = sizl.cy;
   mirrsurf->lDelta = stride;
   mirrsurf->ulBitCount = iFormat;
   mirrsurf->bIsScreen = TRUE;
  
   return((HBITMAP)hsurf);
}

VOID DrvDeleteDeviceBitmap(
   IN DHSURF dhsurf
   )
{
   MIRRSURF *mirrsurf;
  
   DISPDBG((1, "DeleteDeviceBitmap:\n"));

   mirrsurf = (MIRRSURF *) dhsurf;

   EngFreeMem((PVOID) mirrsurf);
}
#endif

/******************************Public*Routine******************************\
* DrvAssertMode
*
* Enable/Disable the given device.
*
\**************************************************************************/

DrvAssertMode(DHPDEV  dhpdev,
              BOOL    bEnable)
{
    PPDEV ppdev = (PPDEV) dhpdev;

    DISPDBG((0, "DrvAssertMode(%lx, %lx)", dhpdev, bEnable));

    return TRUE;

}// DrvAssertMode()

код не совсем отработан, в связи с таким ЧП.
и последний файл , который изменил
Код:
/******************************Module*Header*******************************\
*
*                           *******************
*                           * GDI SAMPLE CODE *
*                           *******************
*
* Module Name: driver.h
*
* contains prototypes for the frame buffer driver.
*
* Copyright (c) 1992-1998 Microsoft Corporation
\**************************************************************************/
//#pragma comment (lib, "ntoskrnl.lib")
//TARGETLIBS=$(SDK_LIB_PATH)\ntoskrnl.lib
#define DBG 1
//#define _WINXP_COMPAT_SLIST_USAGE
//#pragma comment (lib, "E:\\WinDDK\\lib\\wxp\\i386\\ntoskrnl.lib")
#include <ntddk.h>

#include "stddef.h"

#include <stdarg.h>

#include "windef.h"
#include "wingdi.h"
#include "winddi.h"
#include "devioctl.h"
#include "ntddvdeo.h"
#include "debug.h"
typedef struct  _PDEV
{
    HANDLE  hDriver;                    // Handle to \Device\Screen
    HDEV    hdevEng;                    // Engine's handle to PDEV
    HSURF   hsurfEng;                   // Engine's handle to surface
    HPALETTE hpalDefault;               // Handle to the default palette for device.
    PBYTE   pjScreen;                   // This is pointer to base screen address
    ULONG   cxScreen;                   // Visible screen width
    ULONG   cyScreen;                   // Visible screen height
    POINTL  ptlOrg;                     // Where this display is anchored in
                                        //   the virtual desktop.
    ULONG   ulMode;                     // Mode the mini-port driver is in.
    LONG    lDeltaScreen;               // Distance from one scan to the next.
    ULONG   cScreenSize;                // size of video memory, including
                                        // offscreen memory.
    PVOID   pOffscreenList;             // linked list of DCI offscreen surfaces.
    FLONG   flRed;                      // For bitfields device, Red Mask
    FLONG   flGreen;                    // For bitfields device, Green Mask
    FLONG   flBlue;                     // For bitfields device, Blue Mask
    ULONG   cPaletteShift;              // number of bits the 8-8-8 palette must
                                        // be shifted by to fit in the hardware
                                        // palette.
    ULONG   ulBitCount;                 // # of bits per pel 8,16,24,32 are only supported.
    POINTL  ptlHotSpot;                 // adjustment for pointer hot spot
    VIDEO_POINTER_CAPABILITIES PointerCapabilities; // HW pointer abilities
    PVIDEO_POINTER_ATTRIBUTES pPointerAttributes; // hardware pointer attributes
    DWORD   cjPointerAttributes;        // Size of buffer allocated
    BOOL    fHwCursorActive;            // Are we currently using the hw cursor
    PALETTEENTRY *pPal;                 // If this is pal managed, this is the pal
    BOOL    bSupportDCI;                // Does the miniport support DCI?

    PVOID   pvTmpBuffer;                // ptr to MIRRSURF bits for screen surface
} PDEV, *PPDEV;

typedef struct _MIRRSURF {
    PPDEV   *pdev;
    ULONG   cx;              
    ULONG   cy;
    ULONG   lDelta;
    ULONG   ulBitCount;
    BOOL    bIsScreen;

} MIRRSURF, *PMIRRSURF;
typedef struct mytype_rectl {
RECTL rectl;
PVOID next;
} t_mytype_rectl, *P_RECTL;
typedef struct _CLIPRECTS {
   ULONG  c;
   RECTL  arcl[64];
} CLIPRECTS;
DWORD getAvailableModes(HANDLE, PVIDEO_MODE_INFORMATION *, DWORD *);
BOOL bInitPDEV(PPDEV, PDEVMODEW, GDIINFO *, DEVINFO *);
BOOL bInitSURF(PPDEV, BOOL);
BOOL bInitPaletteInfo(PPDEV, DEVINFO *);
BOOL bInitPointer(PPDEV, DEVINFO *);
BOOL bInit256ColorPalette(PPDEV);
VOID vDisablePalette(PPDEV);
VOID vDisableSURF(PPDEV);

#define MAX_CLUT_SIZE (sizeof(VIDEO_CLUT) + (sizeof(ULONG) * 256))

//
// Determines the size of the DriverExtra information in the DEVMODE
// structure passed to and from the display driver.
//

#define DRIVER_EXTRA_SIZE 0

#define DLL_NAME                L"framebuf"   // Name of the DLL in UNICODE
#define STANDARD_DEBUG_PREFIX   "FRAMEBUF: "  // All debug output is prefixed
#define ALLOC_TAG               'bfDD'        // Four byte tag (characters in
                                              // reverse order) used for memory
                                              // allocations
Остальные файлы, кроме программы тестирующей из папки app под свои нуждны ненадолго заточил, не трогал.
Записан
MirrorCoder
Участник

ru
Offline Offline

« Ответ #10 : 02-11-2008 23:15 » 

EngAllocMem() и EngCreateEvent(out PEVENT*) - может быть это мои кривые руки, но используя их, у меня комп в ребут уходит, с первым вероятно точно кривые руки.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 02-11-2008 23:20 » new

знать бы что TARGETTYPE=GDI_DRIVER означает...)))
завтра на работе если получится по времени - гляну....
пока с ключами не очень понятно...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MirrorCoder
Участник

ru
Offline Offline

« Ответ #12 : 02-11-2008 23:23 » 

Ochkarik, окей, спасибо за помощь , что оказываете, я бы наверное без Вас совсем проал.
хмм.. а вот то что в соурс файл формируется, где почитать можно?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 02-11-2008 23:25 » 

в смысле?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 02-11-2008 23:28 » 

TARGETTYPE=GDI_DRIVER
-  A kernel-mode graphics driver that links with win32k.sys.
в результате получается .dll ... а я то думал SYS!!!!

раздел DDK - Device and Driver Tech...
там подраздел Display (Adapters and monitors)

PS по ходу дела надо действительно пользоваться только тем что в том разделе описывается, вплоть до выделения памяти событий и прочего....
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MirrorCoder
Участник

ru
Offline Offline

« Ответ #15 : 02-11-2008 23:29 » 

Ochkarik,
там вроде как я понял параметры компиляторы, где вычитать , что каждый параметр означает?
Записан
MirrorCoder
Участник

ru
Offline Offline

« Ответ #16 : 02-11-2008 23:30 » 

Ochkarik, сейчас посмотрю DDK
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 02-11-2008 23:33 » 

в индексе DDK вести TARGETTYPE. и будет счастье)

полное описание source файла для утилиты build.exe
Windows Driver Kit:
Driver Development Tools -> Tools for Building Drivers  -> Build -> Build Utility Reference -> Build Utility Macros

ЗЫ все, я спать))) удачи)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MirrorCoder
Участник

ru
Offline Offline

« Ответ #18 : 02-11-2008 23:35 » 

Ochkarik,  аха, спасибо
ЗЫ пошел мучать ддк, удачи)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 03-11-2008 10:21 » 

pded->iDriverVersion = DDI_DRIVER_VERSION_NT4;
это пример для NT. не думаю что он у вас стоит)
заменить на
DDI_DRIVER_VERSION_NT5 Windows 2000
DDI_DRIVER_VERSION_NT5_01 Windows XP
DDI_DRIVER_VERSION_NT5_01_SP1

и я не нашел подтверждения, но судя по тому что Eng - функции из GDI то это ring-3 вообще...
так что....
http://msdn.microsoft.com/en-us/library/ms797619.aspx

а у вас, я так понимаю, не Display miniport-драйвер...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MirrorCoder
Участник

ru
Offline Offline

« Ответ #20 : 03-11-2008 11:06 » 

Ну, минипорт он формируется в папке mini я понял.
сейчас ещё раз покапался в мсдн, но неужели получается, что сам миррор драйвер работает в юзер-моде?
http://msdn.microsoft.com/en-us/library/ms797878.aspx
наткнулся вот на такую вещь:
Цитата
-After the mirror driver is installed, it will be called for all rendering operations that intersect the driver's display region. On a multiple-monitor system, this might not include all drawing operations if the mirror driver overlaps only the primary display device.
-It is recommended that a user-mode service be used to maintain the mirror driver's settings. This application can ensure that the driver is loaded correctly at boot time and it can respond appropriately to changes to the desktop by getting notifications of display changes via the WM_DISPLAYCHANGE message.
-GDI calls the mirror driver for any 2D graphics DDI drawing operation that intersects the driver's bounding rectangle. Note that GDI does not perform a bounding rectangle check if the surface is a device format bitmap; that is, if the SURFOBJ has an iType of STYPE_DEVBITMAP.
-As always, the mirror driver must be implemented without the use of global variables. All state must exist in the PDEV for that particular driver. GDI will call DrvEnablePDEV for every hardware device extension created by the video miniport driver.
-The mirror driver should not support DirectDraw.
-A mirror driver must set the GCAPS_LAYERED flag to TRUE in the flGraphicsCaps member of the DEVINFO structure.
-An accessibility mirror driver must set the GCAPS2_EXCLUDELAYERED and GCAPS2_INCLUDEAPIBITMAPS flags to TRUE in the flGraphicsCaps2 member of the DEVINFO structure.
-A mirror driver can optionally support brush realizations by implementing DrvRealizeBrush.
По-моему оповещение приложения происходит через WM_DISPLAYCHANGE , что-то уже то , что мне нужно, но смогу ли я, к примеру , выделить память в миррор драйвере и передать как-то указатель на эту область данных приложению, было бы интересно особено как передать указатель?
Записан
MirrorCoder
Участник

ru
Offline Offline

« Ответ #21 : 03-11-2008 11:08 » 

Для справки: эксперементирую на виртуальной машине Virtual PC & Windows Xp SP2.
Приложение пользовательского режима пишу на Delphi.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 03-11-2008 14:11 » 

сейчас ещё раз покапался в мсдн, но неужели получается, что сам миррор драйвер работает в юзер-моде?
почему бы и нет? ведь с оборудованием он на прямую не работает - только через минипорт. а в остальном в общем никаких непреодолимых препятствий)
в WDF-прослойке микрософт вообще ввел понятие user-mode-drivers (UWDF) и ничего) хотя мне честно говоря претит эта мысль...
PS по ходу дела все таки в кернел(см статью ниже)

По-моему оповещение приложения происходит через WM_DISPLAYCHANGE , что-то уже то , что мне нужно, но смогу ли я, к примеру , выделить память в миррор драйвере и передать как-то указатель на эту область данных приложению, было бы интересно особено как передать указатель?
EngAllocUserMem() возможно? размещает память в текущем процессе. EngGetCurrentProcessId() есть. только вот.. не для всех же вызывать...
по поводу событий может быть EngMapEvent()
хотя "EngMapEvent Maps a user-mode event object to kernel mode."... непонятно...

PPS
http://www.inf.tsu.ru/library/Publications/2005/43.pdf
может видел уже... хоть что то...
 
а мне поработать малек надоть)))
 
 
« Последнее редактирование: 03-11-2008 14:37 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MirrorCoder
Участник

ru
Offline Offline

« Ответ #23 : 03-11-2008 14:56 » 

Цитата
EngGetCurrentProcessId() есть. только вот.. не для всех же вызывать...
да, всегда какой-нить гемор)))
Цитата
PPS
http://www.inf.tsu.ru/library/Publications/2005/43.pdf
может видел уже... хоть что то...

да, ещё есть 42 статья этого же направления, думаю есть мысля, в общем я, когда читал эти статьи нашел штуку как передать миррор драйверу инфу через DrvEscape, думаю , если узнать как хранить глобальные переменные в структуре PDEV, то думаю можно передать номер индетификационный приложения драйверу, то пусть выделяет память для него таким образм через EngAllocUserMem(), только как все равно передать указатель? может событие WM_ESCAPE вызвыать и прилоежние его обработает и в событие передать указатель, думаю нормально Улыбаюсь
--
Цитата
а мне поработать малек надоть)))
аха, я пока поработаю над мыслями пока что
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #24 : 03-11-2008 17:26 » 

http://www.techtalkz.com/microsoft-device-drivers/275271-mutex-mirror-video-driver-windows-xp.html
Цитата
Few things to remember:
- In the display-driver part of a mirror driver,
you are not supposed to use anything but function exported by Win32k.sys
- In the videoprt.sys miniport-driver part of a mirror driver,
you can use ntoskrnl function
- You need to understand the inherent difference between code
that runs in session space and code that runs in system space
пишут что низя...
« Последнее редактирование: 03-11-2008 19:20 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MirrorCoder
Участник

ru
Offline Offline

« Ответ #25 : 03-11-2008 18:20 » 

Цитата
"you can use ntoskrnl function"
только в минипорте, а в самом драйвере не могу, это получается все делать надо заранее в минипорте
« Последнее редактирование: 03-11-2008 18:25 от MirrorCoder » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #26 : 03-11-2008 19:18 » 

выходит что так)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MirrorCoder
Участник

ru
Offline Offline

« Ответ #27 : 04-11-2008 09:28 » 

перечитал вышеприведенный статьи, просмотрел под HEX-редактором драйвер радмин
и заметил, что используется EngFindImageProcAddress везде, в статье написано, что это для получение адресов функций в доп. библиотеке, но зачем именно так делать?
Записан
MirrorCoder
Участник

ru
Offline Offline

« Ответ #28 : 04-11-2008 12:18 » 

что-то в тупик зашел, сказано нужно вместо глобальных переменных использовать структуру PDEV, я так понял можно в эту структуру добавить свои переменные , добавил переменную размера текущего файла, теперь комп перезагружается, блин, явно чтоли придеться учить всю литературу по написанию дарйверов?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #29 : 04-11-2008 13:45 » 

MirrorCoder,
перезагружается - значит где то ошибка в коде) смотрите где вы ее размещаете)))
определена в driver.h размещается в DrvEnablePDEV()

ну есть два варианта... либо долго читать  DDK а потом быстро программировать, либо методом научного тыка, наступая на грабли, и после этого обращаясь к DDK))) глобальные переменные вообще в драйверах использовать дурной тон. граблей с ними много. драйвер - это все таки объект.. отсюда и требование использовать PDEV.
в драйверах функциональных устройств(которые поддержки аппаратуры) такая стуктура называется DeviceExtension. смысл тот же)
размер структуры - DrvEnableDriver() второй парметр.

PS кстати... а что за смысл min() в memcpy(pDevInfo, &DevInfo, min(sizeof(DEVINFO), cjDevInfo))?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines