unresolved external symbol, проблемы

Тема в разделе "WASM.NT.KERNEL", создана пользователем mirrorcoder, 6 сен 2008.

  1. mirrorcoder

    mirrorcoder New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2008
    Сообщения:
    17
    У меня небольашя проблемка
    как можно исправить одну багу, компилятор выдаёт следующие баги:
    unresolved external symbol __imp__KeSetEvent@12 referenced in fuction _DrvBitBlt@44
    unresolved external symbol __imp__KeClearEvent@4 referenced in fuction _DrvBitBlt@44
    unresolved external symbol __imp__IoCreateNotificationEvent@8 referenced in fuction _DrvBitBlt@44
    unresolved external symbol __imp__RtlInitUnicodeString@8 referenced in fuction _DrvBitBlt@44
    ---
    как побороть сию проблему?
    компилирую из DDK 3790.1830
    enable.c
    Код (Text):
    1. #define DBG 1
    2.  
    3.  
    4. #include "driver.h"
    5. ...
    6. BOOL DrvBitBlt(
    7.    IN SURFOBJ *psoDst,
    8.    IN SURFOBJ *psoSrc,
    9.    IN SURFOBJ *psoMask,
    10.    IN CLIPOBJ *pco,
    11.    IN XLATEOBJ *pxlo,
    12.    IN RECTL *prclDst,
    13.    IN POINTL *pptlSrc,
    14.    IN POINTL *pptlMask,
    15.    IN BRUSHOBJ *pbo,
    16.    IN POINTL *pptlBrush,
    17.    IN ROP4 rop4
    18.    )
    19. {
    20. //#pragma comment (lib, "E:\\WinDDK\\lib\\wxp\\i386\\ntoskrnl.lib")
    21.    INT cnt1 = 0, cnt2 = 0;
    22.  
    23.     BOOL bMore;
    24.     CLIPRECTS cr;
    25.     RECTL* prclClip;
    26.     ULONG* lenstr;
    27.     int crects = 0;
    28.     ULONG temp_var = 0;
    29.     ULONG* var_1;
    30.     P_RECTL arr_rectl,arr_rectl_1;
    31.     /////////////
    32.    ULONG file;
    33.    ULONG file_3;
    34.    char* pointer;
    35.    ULONG file_1;
    36.    ULONG size;
    37.    ULONG *size1;
    38.    char* pointer_1;
    39.    char* pointer_2;
    40.    UNICODE_STRING EventName;
    41.    PHANDLE EventHandle = NULL;
    42.    PKEVENT pEventObject;
    43.    /////////////
    44.   // #include <ntddk.h>
    45.             CLIPOBJ_cEnumStart(pco, FALSE, CT_RECTANGLES, CD_ANY, 0);
    46.             arr_rectl = (P_RECTL)EngAllocMem (FL_ZERO_MEMORY,sizeof(t_mytype_rectl),ALLOC_TAG);
    47.             arr_rectl_1 = arr_rectl;
    48.         do
    49.         {  
    50.             bMore = CLIPOBJ_bEnum(pco, sizeof(cr), (ULONG*)&cr);
    51.             for (prclClip = &cr.arcl[0]; cr.c != 0; cr.c--, prclClip++)
    52.             {
    53.                 arr_rectl -> rectl = *prclClip;
    54.                 arr_rectl -> next  = EngAllocMem (FL_ZERO_MEMORY,sizeof(t_mytype_rectl),ALLOC_TAG);
    55.                 arr_rectl = (P_RECTL)arr_rectl -> next;
    56.                 crects++;
    57.             }
    58.         } while (bMore);
    59.                     EngFreeMem((P_RECTL)arr_rectl -> next);
    60. //  arr_rectl->next = (PVOID)NULL;
    61.    //учесть строку length_stroki+"DrvBitBlt"
    62.    //учесть число количества прямоугольников
    63.    pointer = (char *)EngMapFile(L"\\??\\c:\\111.txt",4,&file);
    64.    size1 = (ULONG *)pointer;
    65.    size = *size1;
    66.    pointer_1 = (char *)EngMapFile(L"\\??\\c:\\112.txt",size+sizeof(RECTL)*crects+4+strlen("DrvBitBlt"),&file_1);
    67.    //memcpy(pointer_1 + size,crects,sizeof(ULONG));
    68.    var_1 = (ULONG *)pointer_1 + size;
    69.    *var_1 = crects;
    70.    arr_rectl=arr_rectl_1;
    71.    while (crects != 0)
    72.    {
    73.    crects--;
    74.    memcpy((ULONG *)pointer_1 + size,&(arr_rectl->rectl),sizeof(RECTL));
    75.    arr_rectl = arr_rectl -> next;
    76.    }
    77.    crects = *var_1;
    78.    lenstr  = (ULONG *)pointer_1 + size+sizeof(RECTL)*crects;
    79.    *lenstr = strlen("DrvBitBlt");
    80.    memcpy(pointer_1 + size+sizeof(RECTL)*crects+sizeof(strlen("DrvBitBlt")),"DrvBitBlt",strlen("DrvBitBlt"));
    81.    size +=sizeof(RECTL)*crects+strlen("DrvBitBlt")+sizeof(strlen("DrvBitBlt"));
    82.    *size1 = size;
    83.    EngUnmapFile(file);
    84.    EngUnmapFile(file_1);
    85.   //    DISPDBG((1,
    86.     //        "Mirror Driver DrvBitBlt (Mask=%08x, rop=%08x:\n",
    87.       //      psoMask,
    88.         //  rop4));
    89.  RtlInitUnicodeString(&EventName, L"\\BaseNameObjects\\MyMirrorEvent");
    90.  pEventObject = IoCreateNotificationEvent(&EventName, EventHandle);
    91.  KeClearEvent(pEventObject);
    92.  KeSetEvent(pEventObject,0,FALSE);
    93.  KeClearEvent(pEventObject);
    94.    if (psoSrc)
    95.    {
    96.        if (psoSrc->dhsurf)
    97.        {
    98.           MIRRSURF *mirrsurf = (MIRRSURF *)psoSrc->dhsurf;
    99.  
    100.           if (mirrsurf->bIsScreen)
    101.           {
    102.              DISPDBG((1, "From Mirror Screen "));
    103.           }
    104.           else
    105.           {
    106.              DISPDBG((1, "From Mirror DFB "));
    107.           }
    108.           cnt1 ++;
    109.        }
    110.        else
    111.        {
    112.           DISPDBG((1, "From DIB "));
    113.        }
    114.    }
    115.  
    116.    if (psoDst)
    117.    {
    118.        if (psoDst->dhsurf)
    119.        {
    120.           MIRRSURF *mirrsurf = (MIRRSURF *)psoDst->dhsurf;
    121.  
    122.           if (mirrsurf->bIsScreen)
    123.           {
    124.              DISPDBG((1, "to MirrorScreen "));
    125.           }
    126.           else
    127.           {
    128.              DISPDBG((1, "to Mirror DFB "));
    129.           }
    130.           cnt2 ++;
    131.        }
    132.        else
    133.        {
    134.           DISPDBG((1, "to DIB "));
    135.        }
    136.    }
    137.  
    138.    if (cnt1 && cnt2)
    139.    {
    140.       DISPDBG((1, " [Send Request Over Wire]\n"));
    141.    }
    142.    else if (cnt1)
    143.    {
    144.       DISPDBG((1, " [Read Cached Bits, Or Pull Bits]\n"));
    145.    }
    146.    else if (cnt2)
    147.    {
    148.       DISPDBG((1, " [Push Bits/Compress]\n"));
    149.    }
    150.    else
    151.    {
    152.       DISPDBG((1, " [What Are We Doing Here?]\n"));
    153.    }
    154.  
    155.    return FALSE;
    156. }
    157. ...
    driver.h
    Код (Text):
    1. #pragma comment (lib, "ntoskrnl.lib")
    2. #define DBG 1
    3. #include <ntddk.h>
    4.  
    5. #include "stddef.h"
    6.  
    7. #include <stdarg.h>
    8.  
    9. #include "windef.h"
    10. #include "wingdi.h"
    11. #include "winddi.h"
    12. #include "devioctl.h"
    13. #include "ntddvdeo.h"
    14. #include "debug.h"
    15. typedef struct  _PDEV
    16. {
    17.     HANDLE  hDriver;                    // Handle to \Device\Screen
    18.     HDEV    hdevEng;                    // Engine's handle to PDEV
    19.     HSURF   hsurfEng;                   // Engine's handle to surface
    20.     HPALETTE hpalDefault;               // Handle to the default palette for device.
    21.     PBYTE   pjScreen;                   // This is pointer to base screen address
    22.     ULONG   cxScreen;                   // Visible screen width
    23.     ULONG   cyScreen;                   // Visible screen height
    24.     POINTL  ptlOrg;                     // Where this display is anchored in
    25.                                         //   the virtual desktop.
    26.     ULONG   ulMode;                     // Mode the mini-port driver is in.
    27.     LONG    lDeltaScreen;               // Distance from one scan to the next.
    28.     ULONG   cScreenSize;                // size of video memory, including
    29.                                         // offscreen memory.
    30.     PVOID   pOffscreenList;             // linked list of DCI offscreen surfaces.
    31.     FLONG   flRed;                      // For bitfields device, Red Mask
    32.     FLONG   flGreen;                    // For bitfields device, Green Mask
    33.     FLONG   flBlue;                     // For bitfields device, Blue Mask
    34.     ULONG   cPaletteShift;              // number of bits the 8-8-8 palette must
    35.                                         // be shifted by to fit in the hardware
    36.                                         // palette.
    37.     ULONG   ulBitCount;                 // # of bits per pel 8,16,24,32 are only supported.
    38.     POINTL  ptlHotSpot;                 // adjustment for pointer hot spot
    39.     VIDEO_POINTER_CAPABILITIES PointerCapabilities; // HW pointer abilities
    40.     PVIDEO_POINTER_ATTRIBUTES pPointerAttributes; // hardware pointer attributes
    41.     DWORD   cjPointerAttributes;        // Size of buffer allocated
    42.     BOOL    fHwCursorActive;            // Are we currently using the hw cursor
    43.     PALETTEENTRY *pPal;                 // If this is pal managed, this is the pal
    44.     BOOL    bSupportDCI;                // Does the miniport support DCI?
    45.  
    46.     PVOID   pvTmpBuffer;                // ptr to MIRRSURF bits for screen surface
    47. } PDEV, *PPDEV;
    48.  
    49. typedef struct _MIRRSURF {
    50.     PPDEV   *pdev;
    51.     ULONG   cx;              
    52.     ULONG   cy;
    53.     ULONG   lDelta;
    54.     ULONG   ulBitCount;
    55.     BOOL    bIsScreen;
    56.  
    57. } MIRRSURF, *PMIRRSURF;
    58. typedef struct mytype_rectl {
    59. RECTL rectl;
    60. PVOID next;
    61. } t_mytype_rectl, *P_RECTL;
    62. typedef struct _CLIPRECTS {
    63.         ULONG  c;
    64.         RECTL  arcl[64];
    65. } CLIPRECTS;
    66. DWORD getAvailableModes(HANDLE, PVIDEO_MODE_INFORMATION *, DWORD *);
    67. BOOL bInitPDEV(PPDEV, PDEVMODEW, GDIINFO *, DEVINFO *);
    68. BOOL bInitSURF(PPDEV, BOOL);
    69. BOOL bInitPaletteInfo(PPDEV, DEVINFO *);
    70. BOOL bInitPointer(PPDEV, DEVINFO *);
    71. BOOL bInit256ColorPalette(PPDEV);
    72. VOID vDisablePalette(PPDEV);
    73. VOID vDisableSURF(PPDEV);
    74.  
    75. #define MAX_CLUT_SIZE (sizeof(VIDEO_CLUT) + (sizeof(ULONG) * 256))
    76.  
    77. //
    78. // Determines the size of the DriverExtra information in the DEVMODE
    79. // structure passed to and from the display driver.
    80. //
    81.  
    82. #define DRIVER_EXTRA_SIZE 0
    83.  
    84. #define DLL_NAME                L"framebuf"   // Name of the DLL in UNICODE
    85. #define STANDARD_DEBUG_PREFIX   "FRAMEBUF: "  // All debug output is prefixed
    86. #define ALLOC_TAG               'bfDD'        // Four byte tag (characters in
    87.                                               // reverse order) used for memory
    88.                                               // allocations
     
  2. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    может быть добавить полный путь в driver.h
     
  3. mirrorcoder

    mirrorcoder New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2008
    Сообщения:
    17
    defaultplayer
    это я тоже пробовал, не помогает
     
  4. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    эту ошибку пишет компановщик а не компилятор, и в любом случае ntoskrnl.lib он ненаходит. чем собираете прогу?? если mvs то добавьте в настройки студии папку с библиотекой, а в настройки проекта библиотеку, так точно соберется
     
  5. mirrorcoder

    mirrorcoder New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2008
    Сообщения:
    17
    defaultplayer
    собираю драйвер Windows XP Free Build Environment'ом
    т.е. пишу там e:\WinDDK\bin\x86\build.exe
    в переменных окружениях этого сборщика прописан путь к либам
     
  6. mirrorcoder

    mirrorcoder New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2008
    Сообщения:
    17
    неужели ничего нельзя сделать?
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    mirrorcoder
    Телепатически боюсь ничего ;)
    А на месте проверяй есть ли нужный lib (не путать с h) по указанному пути, берутся ли по этому пути другие lib-ы и т.п. - решение обязательно найдётся ;)
     
  8. mirrorcoder

    mirrorcoder New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2008
    Сообщения:
    17
    а может у кого-нить из знающих есть ддк?
    я мог бы скинуть все исходники, может у кого-нить получицо
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    А ты пробовал снимать комментарий (//) со строки задающей путь к lib?
    //#pragma comment (lib, "E:\\WinDDK\\lib\\wxp\\i386\\ntoskrnl.lib")
     
  10. mirrorcoder

    mirrorcoder New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2008
    Сообщения:
    17
    Y_Mur
    да, конечно))
    это я просто законментировал в этой части у меня щас такая не закоментирвоаная строка в драйвере аш и все равно вылетает данная фигня
     
  11. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    mirrorcoder

    уверен что там setenv.bat правильно отрабатывает?? исправь в нем echo off на echo on и посмотри распечатку. Энвиронменты приходят к build.exe как к дочернему процессу от cmd.exe как от родительского соответственно, если что-то не так то и build поимеет неправильно настроенные переменные окружения

    приаттач сорцы, я правда этим build'ом никогда не собирал, но вечером попробую, домой прийду..
     
  12. mirrorcoder

    mirrorcoder New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2008
    Сообщения:
    17
  13. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    смотрю тут ntoskrnl.lib по всем папкам раскидал, чтоб уже наверку скомпилилось :))

    смена off на on никак не влияет на процесс сборки, это дает возможность посмотреть результат выполнения setenv.bat на консоли командного процессора

    В директории с драйвером лежит файл source, из этого файла build и знает какие файлы компилировать, где находятся инклуды и либы, так вот инклуды у тебя там прописаны а либы нет, пропиши и все соберется
     
  14. mirrorcoder

    mirrorcoder New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2008
    Сообщения:
    17
    о, спасибо, никогда не подумал что там нужно что-то редактирвоть, я спасен.
    и ещё чтобы не заводить новую тему.
    Код (Text):
    1.       CLIPOBJ_cEnumStart(pco, FALSE, CT_RECTANGLES, CD_ANY, 0);
    2.             arr_rectl = (P_RECTL)EngAllocMem (FL_ZERO_MEMORY,sizeof(t_mytype_rectl),ALLOC_TAG);
    3.             arr_rectl_1 = arr_rectl;
    4.         do
    5.         {  
    6.             bMore = CLIPOBJ_bEnum(pco, sizeof(cr), (ULONG*)&cr);
    7.             for (prclClip = &cr.arcl[0]; cr.c != 0; cr.c--, prclClip++)
    8.             {
    9.                 arr_rectl -> rectl = *prclClip;
    10.                 arr_rectl -> next  = EngAllocMem (FL_ZERO_MEMORY,sizeof(t_mytype_rectl),ALLOC_TAG);
    11.                 arr_rectl = (P_RECTL)arr_rectl -> next;
    12.                 crects++;
    13.             }
    14.         } while (bMore);
    15.                     EngFreeMem((P_RECTL)arr_rectl -> next);
    там была такая стрчока кода, она должна была в памяти выстраить очередь, где были координаты изменений экран, до этого брал одну пару координат из prclDst, после добавлений этих строк начала перезагружаться система, что тут нужно подредактирвать? я какую-то ошибку допустил при операциях с памятью? это последнйи вопрос, который у меня остался, спасибо большое за неоценимую помощь
     
  15. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    EngAllocMem вызывается 2 раза, а EngFreeMem 1, вот тут может и косяк, а вообще лучше протрассировать и посмотреть где падает, или с каким кодом хотя бы если нет возможности отлаживать
     
  16. mirrorcoder

    mirrorcoder New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2008
    Сообщения:
    17
    скорее всего да, пытался вставить перед ними код для того чтобы он писал в файл где находицо и падает сразу, потом оттрасирую тогда, сначала разберусь с оповещением
     
  17. mirrorcoder

    mirrorcoder New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2008
    Сообщения:
    17
    по поводу все этой же проблемы, получились прямо-таки подводные камни, все получилась нужная дллшка и тут же драйвер перестал работаь и перехватывать графические функции, причем, даже если скомпилрвоать только одну либу и убрать те функции, я вообще не соображу в чем проблема, каким могла образом та либа (ntoskrnl.lib) повлиять на весь дрйавер и его работоспособность?
     
  18. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    нужен конкретный вопрос, сложно определить проблему из слов "драйвер перестал работать"
     
  19. mirrorcoder

    mirrorcoder New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2008
    Сообщения:
    17
    defaultplayer
    ну вообщем, раньше драйвер перехватывал граф. функции и записывал измененные координаты, создавал зеркальную поверхность, а сейчас программа, которая активировала драйвер и заставляла создавать зеркальную поверхность, говорит, что не создается поверхность и вообще не перехватываются граф. функции, я вставил в DrvBitBlt дополнительные строчки для ведения лога и как я и думал никаких записей в логах не было, может можно как-то по-другому отладить драйвер?
     
  20. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    можно, поставить отладчик, понатыкивать бряков в нужных местах и смотреть где что не так