Создание статичной lib в Visual Studio

Тема в разделе "WASM.BEGINNERS", создана пользователем Llirik, 29 янв 2011.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    ну это не ко мне вопрос... попросите TermoSINteZ...
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Llirik
    у компилятора с есть ключ, при указании которого он ещё и ассемблерный код выдаст. И в нем можно посмотреть,во что реализуется ваша функция. Какой ключ - не помню, можно у компилятора спросить: cl /?
     
  3. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    А как его попросить-то??)
    Так я собираю драйвер на C просто словом build)
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    /FA - только ассемблерный листинг
    /FAc - асм с машинным кодом
    /FAs - асм с исходниками на си
    /FAcs - все вместе
    к нему еще надо указывать папку, куда сливать листинги...
    пример: /FA"Release\"

    Так посморите в настройках проекта... C/C++ -> Output Files -> Assembler Output
     
  5. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Так я собираю его в Win XP Free Build Environment в другой Винде, а в Visual Studio я его собрать не могу
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    блин... все ваши проблемы решаются 2-3 ссылкой в гугле... если так:
    Код (Text):
    1. TARGETNAME=filter
    2. TARGETPATH=obj
    3. TARGETTYPE=DRIVER
    4. USE_PDB=1
    5. USER_C_FLAGS=/FAs
    6.  
    7. SOURCES=    DriverEntry.cpp \
    8.         driver.rc
    (файл sources)
     
  7. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Дело не в этом) просто переменные среды не опредены. Драйверы я собираю в DDK в другой винде.
    А какой код получится? как в MASM или как в IDA??
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    масм, если флаг сработает канеш... я никогда так не собирал сам...
     
  9. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Asm я получил, правда он похож на асм IDA и я так и не смог понять где у меня ошибка, потому что там ещё есть лишние функци.
    Может кто-нибудь поделится самым простым примером функции AddDevice? Пусть даже на С, но лучше на асме
     
  10. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Всё) спасибо) не надо) нашёл я ошибку) если только простой пример DispatchPnP
     
  11. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    А как к примеру уменьшить переменную, которая находится в *.asm из кода на С?
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    объявить ее как экстерн, или же по ее адресу допустим...
    Код (Text):
    1. extern int GlobalA;
    2. ...
    3. GlobalA = 69;
     
  13. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    при линковке выходит: error LNK2001: unresolved external symbol _gr
    директива extern добавляет _ к имени
     
  14. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    ну? и что? все уже написано в ошибке... смотрите, как объявлена переменная в асм-файле, проверяйте экспортируемые и импортируемые символы в обж файлах...
     
  15. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Всё. выучил директиву PUBLIC)
     
  16. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Rel, большое Вам спасибо!! мой драйвер заработал!
     
  17. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Помогите, пожалуйста, ещё собрать вот такой код:
    Код (Text):
    1. #include "kbfiltr.h"
    2. #ifdef ALLOC_PRAGMA
    3. #pragma alloc_text (PAGE, KbFilter_InternIoCtl)
    4. #endif
    5. extern int ScanCode;
    6. extern int FiDO_DispatchPassThrough;
    7. NTSTATUS
    8. KbFilter_InternIoCtl(
    9.     IN PDEVICE_OBJECT DeviceObject,
    10.     IN PIRP Irp
    11.     )
    12. {
    13.     PIO_STACK_LOCATION              irpStack;
    14.     PDEVICE_EXTENSION               devExt;
    15.     PCONNECT_DATA                   connectData;
    16.     NTSTATUS                        status = STATUS_SUCCESS;
    17.  
    18.     devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    19.     Irp->IoStatus.Information = 0;
    20.     irpStack = IoGetCurrentIrpStackLocation(Irp);
    21.  
    22.     switch (irpStack->Parameters.DeviceIoControl.IoControlCode) {
    23.  
    24.     case IOCTL_INTERNAL_KEYBOARD_CONNECT:
    25.         if (devExt->UpperConnectData.ClassService != NULL) {
    26.             status = STATUS_SHARING_VIOLATION;
    27.             break;
    28.         }
    29.         else if (irpStack->Parameters.DeviceIoControl.InputBufferLength <
    30.                 sizeof(CONNECT_DATA)) {
    31.             //
    32.             // invalid buffer
    33.             //
    34.             status = STATUS_INVALID_PARAMETER;
    35.             break;
    36.         }
    37.  
    38.         connectData = ((PCONNECT_DATA)
    39.             (irpStack->Parameters.DeviceIoControl.Type3InputBuffer));
    40.  
    41.         devExt->UpperConnectData = *connectData;
    42.         connectData->ClassDeviceObject = devExt->Self;
    43.         connectData->ClassService = KbFilter_ServiceCallback;
    44.  
    45.         break;
    46.  
    47.     //
    48.      return FiDO_DispatchPassThrough(DeviceObject, Irp);
    49. }
    50.  
    51.  
    52.  
    53. VOID
    54. KbFilter_ServiceCallback(
    55.     IN PDEVICE_OBJECT DeviceObject,
    56.     IN PKEYBOARD_INPUT_DATA InputDataStart,
    57.     IN PKEYBOARD_INPUT_DATA InputDataEnd,
    58.     IN OUT PULONG InputDataConsumed
    59.     )
    60.  
    61. {
    62.     PDEVICE_EXTENSION   devExt;
    63.  
    64.     devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    65.  
    66.     (*(PSERVICE_CALLBACK_ROUTINE) devExt->ClassService)(
    67.         devExt->ClassDeviceObject,
    68.         InputDataStart,
    69.         InputDataEnd,
    70.         InputDataConsumed);
    71.      ScanCode = InputDataStart->MakeCode;
    72. }
    Код (Text):
    1. #ifndef KBFILTER_H
    2. #define KBFILTER_H
    3.  
    4. #include "ntddk.h"
    5. #include "kbdmou.h"
    6. #include <ntddkbd.h>
    7. #include <ntdd8042.h>
    8.  
    9. typedef struct _DEVICE_EXTENSION
    10. {
    11.    
    12.     PDEVICE_OBJECT  Self;
    13.     PDEVICE_OBJECT  PDO;
    14.     PDEVICE_OBJECT  TopOfStack;
    15.     BOOLEAN         Started;
    16.     BOOLEAN         SurpriseRemoved;
    17.     BOOLEAN         Removed;
    18.     struct _UPPER_CONNECT {
    19.     PDEVICE_OBJECT     ClassDeviceObject;
    20.     PVOID    ClassService;
    21.     } UpperConnectData;
    22. } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
    23.  
    24. //
    25. // Prototypes
    26. //
    27.  
    28.  
    29.    
    30. NTSTATUS
    31. KbFilter_InternIoCtl (
    32.     IN PDEVICE_OBJECT DeviceObject,
    33.     IN PIRP Irp
    34.     );
    35.  
    36. NTSTATUS
    37. FiDO_DispatchPassThrough(
    38.         IN PDEVICE_OBJECT DeviceObject,
    39.         IN PIRP Irp
    40.         );
    41.    
    42. #endif  // KBFILTER_H
    Ошибки:
    Код (Text):
    1. 1>kbfiltr.c(6) : error C2365: 'FiDO_DispatchPassThrough' : redefinition; previous definition was a 'function'
    2. 1>kbfiltr.c(41) : error C2115: '=' : incompatible types
    3. 1>kbfiltr.c(43) : error C2065: 'KbFilter_ServiceCallback' : undeclared identifier
    4. 1>kbfiltr.c(43) : error C4047: '=' : 'PVOID' differs in levels of indirection from 'int'
    5. 1>kbfiltr.c(54) : error C2143: syntax error : missing ';' before 'type'
    6. 1>kbfiltr.c(66) : error C2039: 'ClassService' : is not a member of '_DEVICE_EXTENSION'
    7. 1>kbfiltr.c(67) : error C2039: 'ClassDeviceObject' : is not a member of '_DEVICE_EXTENSION'
    8. 1>kbfiltr.c(68) : error C2065: 'InputDataStart' : undeclared identifier
    9. 1>kbfiltr.c(69) : error C2065: 'InputDataEnd' : undeclared identifier
    10. 1>kbfiltr.c(70) : error C2065: 'InputDataConsumed' : undeclared identifier
    11. 1>kbfiltr.c(71) : error C2223: left of '->MakeCode' must point to struct/union
     
  18. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Извините, я тогда спутал) Это не Ваша функция заработала тогда, а наоборот мой драйвер вообще перестал работать))) Потом я взял эту функцию из IDA и продолжил работу. а сейчас просто захотелось разобраться в этой основательно. и я вновь вернулся коду. но, извините меня, он попахивает бредом))) но всё-равно спасибо. сейчас попробую его исправить