Помогите с Ring0

Тема в разделе "WASM.BEGINNERS", создана пользователем LavanDOS, 11 апр 2007.

  1. LavanDOS

    LavanDOS New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2006
    Сообщения:
    5
    Вот код.
    Код (Text):
    1. extern "C"
    2. {
    3. #include "ntddk.h"
    4. }
    5.  
    6. UNICODE_STRING usDevName,usSymLinkName;
    7.  
    8. extern "C"
    9.  
    10. NTSTATUS DispatchCreate(PDEVICE_OBJECT  pDeviceObject,PIRP  pIrp)
    11. {
    12.    DbgPrint("DispatchCreate");
    13.    return STATUS_SUCCESS;
    14. }
    15. NTSTATUS DispatchControl(PDEVICE_OBJECT pDeviceObject,PIRP pIrp)
    16. {
    17.     NTSTATUS ntStatus;
    18.     PIO_STACK_LOCATION pslIrpStack = IoGetCurrentIrpStackLocation(pIrp);
    19.    // pslIrpStack->Parameters.IoControlCode
    20.     DbgPrint("DispatchControl");
    21.     pIrp->IoStatus.Status = STATUS_SUCCESS;
    22.     pIrp->IoStatus.Information = 0;
    23.     IoCompleteRequest(pIrp,IO_NO_INCREMENT);
    24.     return STATUS_SUCCESS;
    25. }
    26. NTSTATUS DispatchClose(PDEVICE_OBJECT pDeviceObject,PIRP  pIrp)
    27. {
    28.     DbgPrint("DispatchClose");
    29.     return STATUS_SUCCESS;
    30.  
    31. }
    32. void Unload(PDRIVER_OBJECT  pDriverObject)
    33. {
    34.     DbgPrint("Driver unload");
    35.     IoDeleteSymbolicLink(&usSymLinkName);
    36.     IoDeleteDevice(pDriverObject->DeviceObject);
    37. }
    38. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pusRegistryPath)
    39. {
    40.     NTSTATUS Status = STATUS_SUCCESS;
    41.     PDEVICE_OBJECT pDeviceObject;
    42.  
    43.     RtlInitUnicodeString(&usDevName,L"\\Device\\devRing0");
    44.     RtlInitUnicodeString(&usSymLinkName,L"\\??\\slRing0");
    45.    
    46.  
    47.     DbgPrint("Init driver");
    48.     if((IoCreateDevice(pDriverObject,0,&usDevName,FILE_DEVICE_UNKNOWN,0,FALSE,&pDeviceObject)) == STATUS_SUCCESS)
    49.     {      
    50.         if((IoCreateSymbolicLink(&usSymLinkName,&usDevName)) == STATUS_SUCCESS){
    51.             pDriverObject->MajorFunction[IRP_MJ_CREATE]         = DispatchCreate;
    52.             pDriverObject->MajorFunction[IRP_MJ_CLOSE]          = DispatchClose;
    53.             pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchControl;
    54.             pDriverObject->DriverUnload                         = Unload;
    55.         }else{
    56.             IoDeleteDevice(pDeviceObject);
    57.         }
    58.     }  
    59.     return STATUS_SUCCESS;
    60. }
    Скажите мне где здесь ошибка,а то я бьюсь и понять не могу.
    Выдают такую ошибку.

    1>errors in directory c:\[myproject]\ring0
    1>bufferoverflowk.lib(gs_support.obj) : error LNK2019: unresolved external symbol _DriverEntry@8 referenced in function _GsDriverEntry@8
    1>objchk_wxp_x86\i386\ring0.sys : error LNK1120: 1 unresolved externals


    А ещё можно ли вообще избавиться от extern "C" или нет?
    А то если убираю происходит другая ошибка.

    1>errors in directory c:\[myproject]\ring0
    1>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(2156) : error C2220: warning treated as error - no object file generated
    1>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(2156) : error C4162: '_ReturnAddress' : no function with C linkage found
    1>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(6902) : error C4162: '_InterlockedExchange' : no function with C linkage found
    1>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(6928) : error C4162: '_InterlockedIncrement' : no function with C linkage found
    1>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(6941) : error C4162: '_InterlockedDecrement' : no function with C linkage found
    1>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(6955) : error C4162: '_InterlockedExchangeAdd' : no function with C linkage found
    1>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(6985) : error C4162: '_InterlockedCompareExchange' : no function with C linkage found
    1>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(7037) : error C4162: '_InterlockedOr' : no function with C linkage found
    1>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(7047) : error C4162: '_InterlockedAnd' : no function with C linkage found
    1>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(7057) : error C4162: '_InterlockedXor' : no function with C linkage found
    100>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(2156) : error C2220: warning treated as error - no object file generated
    100>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(2156) : error C4162: '_ReturnAddress' : no function with C linkage found
    100>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(6902) : error C4162: '_InterlockedExchange' : no function with C linkage found
    100>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(6928) : error C4162: '_InterlockedIncrement' : no function with C linkage found
    100>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(6941) : error C4162: '_InterlockedDecrement' : no function with C linkage found
    100>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(6955) : error C4162: '_InterlockedExchangeAdd' : no function with C linkage found
    100>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(6985) : error C4162: '_InterlockedCompareExchange' : no function with C linkage found
    100>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(7037) : error C4162: '_InterlockedOr' : no function with C linkage found
    100>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(7047) : error C4162: '_InterlockedAnd' : no function with C linkage found
    100>c:\winddk\3790.1830\inc\ddk\wxp\ntddk.h(7057) : error C4162: '_InterlockedXor' : no function with C linkage found
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    надо тогда уж не extern "C", а extern "C" { .... }, то есть обернуть все это в скобки фигурные
     
  3. LavanDOS

    LavanDOS New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2006
    Сообщения:
    5
  4. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    LavanDOS
    NTSTATUS __stdcall DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pusRegistryPath)
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    LavanDOS
    gilg

    I. если код на С++ (файл .CPP), нужно:
    1) указать конвенцию вызова __stdcall, как ты правильно подметил
    2) указать, что имя не должно декорироваться по правилам С++, написав extern "C" перед каждой функцией.

    II. если код на Си (файл .C), нужно только указать конвенцию вызова __stdcall
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    иногда помогает изучение опций компилятора (/TC)
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    censored
    тоже вариант) тип __stdcall тоже можно задать в опциях как используемый по умолчанию вместо __cdecl.

    я вообще не очень люблю задавать все в аргументах комплера и предпочитаю все указывать в сорце по мере возможности.