Reply To: Build Delphi examples

Home Forums Discussions Support Build Delphi examples Reply To: Build Delphi examples

#5945
Vadim Smirnov
Keymaster

    Вот что выдает dumpbin по экспортам ndisapi.dll собранной в Visual C++ (та что стандартно идет в инсталляторе WinpkFilter):

    Microsoft (R) COFF Binary File Dumper Version 6.00.8447
    Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


    Dump of file ndisapi.dll

    File Type: DLL

    Section contains the following exports for ndisapi.dll

    0 characteristics
    43BD7734 time date stamp Thu Jan 05 21:44:52 2006
    0.00 version
    1 ordinal base
    57 number of functions
    57 number of names

    ordinal hint RVA name

    1 0 00001000 ??0CNdisApi@@QAE@ABV0@@Z
    2 1 00001110 ??0CNdisApi@@QAE@PBD@Z
    3 2 000011F0 ??1CNdisApi@@UAE@XZ
    4 3 00001040 ??4CNdisApi@@QAEAAV0@ABV0@@Z
    5 4 0000ABF0 ??_7CNdisApi@@6B@
    6 5 00001080 ??_FCNdisApi@@QAEXXZ
    7 6 00001E50 ?ConvertWindows2000AdapterName@CNdisApi@@SAHPBDPADK@Z
    8 7 00001FB0 ?ConvertWindows9xAdapterName@CNdisApi@@SAHPBDPADK@Z
    9 8 00001CA0 ?ConvertWindowsNTAdapterName@CNdisApi@@SAHPBDPADK@Z
    10 9 00001220 ?DeviceIoControl@CNdisApi@@QAEHKPAXH0HPAHPAU_OVERLAPPED@@@Z
    11 A 00001400 ?FlushAdapterPacketQueue@CNdisApi@@QAEHPAX@Z
    12 B 000013D0 ?GetAdapterMode@CNdisApi@@QAEHPAU_ADAPTER_MODE@@@Z
    13 C 00001430 ?GetAdapterPacketQueueSize@CNdisApi@@QAEHPAXPAK@Z
    14 D 00001BB0 ?GetAdaptersStartupMode@CNdisApi@@SAKXZ
    15 E 00001870 ?GetBytesReturned@CNdisApi@@QAEKXZ
    16 F 00001800 ?GetHwPacketFilter@CNdisApi@@QAEHPAXPAK@Z
    17 10 000019A0 ?GetMTUDecrement@CNdisApi@@SAKXZ
    18 11 000012D0 ?GetTcpipBoundAdaptersInfo@CNdisApi@@QAEHPAU_TCP_AdapterList@@@Z
    19 12 00001290 ?GetVersion@CNdisApi@@QAEKXZ
    20 13 00001860 ?IsDriverLoaded@CNdisApi@@QAEHXZ
    21 14 000016E0 ?NdisrdRequest@CNdisApi@@QAEHPAU_PACKET_OID_DATA@@H@Z
    22 15 00001370 ?ReadPacket@CNdisApi@@QAEHPAU_ETH_REQUEST@@@Z
    23 16 00001340 ?SendPacketToAdapter@CNdisApi@@QAEHPAU_ETH_REQUEST@@@Z
    24 17 00001310 ?SendPacketToMstcp@CNdisApi@@QAEHPAU_ETH_REQUEST@@@Z
    25 18 00001610 ?SetAdapterListChangeEvent@CNdisApi@@QAEHPAX@Z
    26 19 000013A0 ?SetAdapterMode@CNdisApi@@QAEHPAU_ADAPTER_MODE@@@Z
    27 1A 00001A90 ?SetAdaptersStartupMode@CNdisApi@@SAHK@Z
    28 1B 000017B0 ?SetHwPacketFilter@CNdisApi@@QAEHPAXK@Z
    29 1C 00001880 ?SetMTUDecrement@CNdisApi@@SAHK@Z
    30 1D 00001470 ?SetPacketEvent@CNdisApi@@QAEHPAX0@Z
    31 1E 00001540 ?SetWANEvent@CNdisApi@@QAEHPAX@Z
    32 1F 000020B0 CloseFilterDriver
    33 20 00002520 ConvertWindows2000AdapterName
    34 21 00002540 ConvertWindows9xAdapterName
    35 22 00002500 ConvertWindowsNTAdapterName
    36 23 000022A0 FlushAdapterPacketQueue
    37 24 00002260 GetAdapterMode
    38 25 000022F0 GetAdapterPacketQueueSize
    39 26 000024B0 GetAdaptersStartupMode
    40 27 000024E0 GetBytesReturned
    41 28 000020D0 GetDriverVersion
    42 29 00002420 GetHwPacketFilter
    43 2A 00002490 GetMTUDecrement
    44 2B 00002120 GetTcpipBoundAdaptersInfo
    45 2C 000024C0 IsDriverLoaded
    46 2D 000023A0 NdisrdRequest
    47 2E 00002090 OpenFilterDriver
    48 2F 000021E0 ReadPacket
    49 30 000021A0 SendPacketToAdapter
    50 31 00002160 SendPacketToMstcp
    51 32 00002380 SetAdapterListChangeEvent
    52 33 00002220 SetAdapterMode
    53 34 000024A0 SetAdaptersStartupMode
    54 35 000023C0 SetHwPacketFilter
    55 36 00002480 SetMTUDecrement
    56 37 00002340 SetPacketEvent
    57 38 00002360 SetWANEvent

    Summary

    2000 .data
    4000 .rdata
    2000 .reloc
    1000 .rsrc
    8000 .text

    Как видно их приведенного, ndisapi.dll экспортирует два набора функций, один в форме C++ класса (может быть использован только из C++) и второй в виде _stdcall функций (для использования из других програмных сред). C Visual C run time библиотека слинкована статически.

    Думаю, что проблема в следущем, библиотека была собрана в C++ Builder без учета DEF файла (судя по тому что экспортируется только C++ класс). Что касается cc3260mt.dll, тут мне сложно сказать с уверенностью(нет под рукой проверить), но думаю с run-time библиотекой можно и в C++ Builder слинковаться статически.

    Собственно, возможность сборки DLL под C++ Builder была добавлена только для использования с C++ Builder, из-за того что name decoration используемый Visual C++ и C++ Builder различен. Возникшие проблемы скорей всего обьясняются с переносом и сборкой проектов под версию C++ Builder отличную от используемой нами. Вот экспорты ndisapi.dll собранной под C++ Builder 6.0:

    Microsoft (R) COFF Binary File Dumper Version 6.00.8447
    Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


    Dump of file ndisapi.dll

    File Type: DLL

    Section contains the following exports for ndisapi.dll

    0 characteristics
    0 time date stamp Thu Jan 01 02:00:00 1970
    0.00 version
    1 ordinal base
    54 number of functions
    54 number of names

    ordinal hint RVA name

    1 0 00001258 @CNdisApi@$bctr$qpxc
    2 1 00001344 @CNdisApi@$bdtr$qv
    26 2 00001E0C @CNdisApi@ConvertWindows2000AdapterName$qpxcpcul
    27 3 00001F30 @CNdisApi@ConvertWindows9xAdapterName$qpxcpcul
    25 4 00001CAC @CNdisApi@ConvertWindowsNTAdapterName$qpxcpcul
    3 5 00001390 @CNdisApi@DeviceIoControl$qulpvit2ipip11_OVERLAPPED
    11 6 00001554 @CNdisApi@FlushAdapterPacketQueue$qpv
    10 7 00001528 @CNdisApi@GetAdapterMode$qp13_ADAPTER_MODE
    12 8 00001580 @CNdisApi@GetAdapterPacketQueueSize$qpvpul
    24 9 00001BD8 @CNdisApi@GetAdaptersStartupMode$qv
    20 A 00001960 @CNdisApi@GetBytesReturned$qv
    18 B 000018EC @CNdisApi@GetHwPacketFilter$qpvpul
    22 C 00001A38 @CNdisApi@GetMTUDecrement$qv
    5 D 00001444 @CNdisApi@GetTcpipBoundAdaptersInfo$qp16_TCP_AdapterList
    4 E 0000140C @CNdisApi@GetVersion$qv
    19 F 00001954 @CNdisApi@IsDriverLoaded$qv
    16 10 000017BC @CNdisApi@NdisrdRequest$qp16_PACKET_OID_DATAi
    8 11 000014D0 @CNdisApi@ReadPacket$qp12_ETH_REQUEST
    7 12 000014A4 @CNdisApi@SendPacketToAdapter$qp12_ETH_REQUEST
    6 13 00001478 @CNdisApi@SendPacketToMstcp$qp12_ETH_REQUEST
    15 14 00001710 @CNdisApi@SetAdapterListChangeEvent$qpv
    9 15 000014FC @CNdisApi@SetAdapterMode$qp13_ADAPTER_MODE
    23 16 00001B0C @CNdisApi@SetAdaptersStartupMode$qul
    17 17 0000188C @CNdisApi@SetHwPacketFilter$qpvul
    21 18 0000196C @CNdisApi@SetMTUDecrement$qul
    13 19 000015AC @CNdisApi@SetPacketEvent$qpvt1
    14 1A 00001664 @CNdisApi@SetWANEvent$qpv
    30 1B 0000202C CloseFilterDriver
    53 1C 00002398 ConvertWindows2000AdapterName
    54 1D 000023B0 ConvertWindows9xAdapterName
    52 1E 00002380 ConvertWindowsNTAdapterName
    38 1F 000021AC FlushAdapterPacketQueue
    37 20 00002184 GetAdapterMode
    39 21 000021D4 GetAdapterPacketQueueSize
    49 22 0000232C GetAdaptersStartupMode
    51 23 0000235C GetBytesReturned
    31 24 00002098 GetDriverVersion
    45 25 000022D4 GetHwPacketFilter
    47 26 00002310 GetMTUDecrement
    32 27 000020BC GetTcpipBoundAdaptersInfo
    50 28 00002338 IsDriverLoaded
    43 29 0000227C NdisrdRequest
    29 2A 00001FD8 OpenFilterDriver
    35 2B 00002134 ReadPacket
    34 2C 0000210C SendPacketToAdapter
    33 2D 000020E4 SendPacketToMstcp
    42 2E 00002254 SetAdapterListChangeEvent
    36 2F 0000215C SetAdapterMode
    48 30 0000231C SetAdaptersStartupMode
    44 31 000022A8 SetHwPacketFilter
    46 32 00002300 SetMTUDecrement
    40 33 00002200 SetPacketEvent
    41 34 0000222C SetWANEvent
    28 35 000030F8 ___CPPdebugHook

    Summary

    1000 .data
    1000 .edata
    1000 .idata
    1000 .reloc
    1000 .rsrc
    2000 .text
    1000 .tls

    Как видно экспорты опять отличаются от приведенных вами.

    Решение проблемы в том что необходимо должным образом настроить проект под C++ Builder:

    1) Убедится что DEF файл включен в сборку (по всей видимости он был убран в следствии конвертации проекта).

    2) Вместо динамической run-time библиотеки использовать статическую.