[Winpcap-users] While testing Gianlucas winpcap3.1[prerelease]...
Marc Wetzel
mwse at gmx.de
Tue Aug 2 10:36:49 GMT 2005
I wrote a little test application
First version just calls ThreadProc() (without using threads),
the second version uses BeginThread() to use this function as the
threadproc.
Please see my findings:
Winpcap (prerelease) using Windows XP/latest SP
SingleThreaded version:
- Works with and without using COINIT_APARTMENTTHREADED
- mulitple calls to pcap_open() are successful (not tested if they
actually receive packets)
MultiThreaded version:
- Works only with using COINIT_MULTITHREADED !!
- it only works if I init COM _outside_ the thread.
- mulitple calls (say multiple threads) to pcap_open() are NOT
successful, the second call to pcap_open blocks until the first
pcap_handle is closed
Greetings
/Marc
--
PS:
snippet of my testcode:
I only used it to test, while single-stepping through the code, so
checking some resultcodes was omitted!
FUNCTION ThreadProc(Thread: TThread): Integer;
VAR
ErrBuf : ARRAY[0..PCAP_ERRBUF_SIZE - 1] OF Char;
FPcap : PPcap;
FError : STRING;
BEGIN
FPcap := pcap_open('\Device\NPF_GenericDialupAdapter', 1600, 0, 30,
NIL, ErrBuf);
//FPcap := pcap_open('\Device\NPF_GenericNdisWanAdapter', 1600, 0,
30, NIL, ErrBuf);
IF FPcap = NIL THEN
BEGIN
FError := ErrBuf;
exit;
END;
IF assigned(Thread) THEN
WHILE (true) DO
sleep(1000);
END;
PROCEDURE TForm1.Button1Click(Sender: TObject);
VAR
FHandle : THandle;
FThreadID : THandle;
FHandle2 : THandle;
FThreadID2 : THandle;
res : LongInt;
BEGIN
InitPCAP; // Loadlibrary and function binding...
CoUninitialize;
//res:=CoInitializeEx(NIL, COINIT_APARTMENTTHREADED);
res := CoInitializeEx(NIL, COINIT_MULTITHREADED);
// Test-1 SingleThreaded
// ThreadProc(nil);
// ThreadProc(nil);
// Test-2 MultiThreaded
FHandle := BeginThread(NIL, 0, @ThreadProc, Pointer(Self),
CREATE_SUSPENDED, FThreadID);
ResumeThread(FHandle);
Sleep(5000);
FHandle2 := BeginThread(NIL, 0, @ThreadProc, Pointer(Self),
CREATE_SUSPENDED, FThreadID2);
ResumeThread(FHandle2);
END;
Gianluca Varenni wrote:
>
> ----- Original Message ----- From: "Marc Wetzel" <mwse at gmx.de>
> To: <winpcap-users at winpcap.org>
> Sent: Monday, August 01, 2005 12:43 PM
> Subject: Re: [Winpcap-users] While testing Gianlucas winpcap3.1
> [prerelease]...
>
>
>>
>>>>
>>>> But you might remember, that I had trouble using winpcap3.1.b4/WAN
>>>> devices with Delphi,
>>>> because of some kind of COM initialization problems.
>>>> It only worked if I do a CoInitializeEx(NIL, COINIT_MULTITHREADED)
>>>> at the very start of the code.
>>>
>>>
>>>
>>> I know. This is one of the biggest headaches I had with WinPcap and
>>> NdisWan.
>>>
>> It really really only works if I set it to COINIT_MULTITHREADED (not
>> the other way around).
>
>
> Uhm, are you using Windows XP? If you are using the test dlls on my
> web pages (i.e. the latest build of the dlls, in practice) every
> attempt to open/list the wan adapters fails if COM has been
> initialized as COINIT_MULTITHREADED *on the same thread*.
>
>
>>
>> I use winpcap the following way... maybe there is a problem with my
>> code?
>>
>> in the main process I fetch the devices (pcap_findalldevs) to look if
>> there is a WAN device.
>> I such device is found I create a new thread and tell it to open the
>> specific device (I found out in the main process)
>> inside the thread I use pcap_open to open this device...
>
>
> That's ok.
>
>>
>> And I really have to initialize to COINIT_MULTITHREADED, get it going
>> (in beta4)
>> In beta4 this had nothing to do with pcap_findalldevs(). This just
>> ever worked, regardless which
>> ComThreadModel I choosed.
>> The failure just happened on pcap_open()
>
>
> In beta4, there were a series of bugs related to COM initialization
> (coupled to a series of bugs in the MS NetMon
> COM component for which I've put some patches only after 3.1beta4,
> i.e. in the test DLLs on my web). These bugs caused a whole series of
> random effects: application crashes, Wan adapters not listed....
>
>
>>
>> I just tested it again (this time I tried to use multiple threads
>> opening NdisWanBh)
>> And I found out, that my second call to pcap_open blocks until I
>> close the first winpcap handle.
>
>
> Wait, wait. NdisWanBh should NOT be listed by WinPcap. If it's listed,
> it probably means that your WinPcap installation has something really
> weird. Are you sure it's NdisWanBh??
>
>>
>>
>>
>>>>
>>>> #2:
>>>> With the prerelease I have now other problems...
>>>> If I use CoInitializeEx(NIL, COINIT_MULTITHREADED) I only see my
>>>> Ethernet-Device (using pcap_findalldevs).
>>>
>>>
>>>
>>> This is correct. Basically, the NetMon COM component used by WinPcap
>>> to capture from PPP does NOT work in the MULTITHREADED threading
>>> model on Windows XP. As a consequence, that device is not listed
>>> *if* COM has already been initialized with that threading model.
>>>
>>>
>> Is there any official documentation to this? I didnt found anything
>> on MSDN on this subject.
>
>
> Nope. The MSDN documentation says almost *nothing* about the NetMon
> component (and all its issues/bugs).
>
>>
>>>
>>>> And if I comment the CoInitializeEx call out, I see all devices as
>>>> expected, but then it fails
>>>> in the call to pcap_open() with the error message "The system
>>>> cannot find the device" (just as before).
>>>
>>>
>>>
>>> Uhm, are you sure? I've thoroughly tested it without any problem on
>>> my machine. Have you tried building a small C app (or one in the
>>> devpack) and see if it works?
>>>
>>> If you don't initialize COM, winpcap initializes it with
>>> CoInitialize(NULL) before opening the GenericDialupAdapter.
>>>
>> Delphi normally does not initialize COM. Only if needed (by using
>> certain libraries, I dont use).
>>
>>>>
>>>>
>>>> Just an addendum:
>>>> #3:
>>>> Using CoInitializeEx(NIL, COINIT_MULTITHREADED) in a
>>>> Com-Application is not possible,
>>>> e.g. embedding the IE-ActiveX object will always fail. This means
>>>> that having an application which uses
>>>> both the IE-ActiveX and winpcap (sniffing on WAN devices) is not
>>>> possible.
>>>>
>>>> Sniffing ethernet devices is not touched by this problem.
>>>>
>>>> Maybe I am completely wrong?
>>>> Does anybody have a clue, or is this a bug?
>>>
>>>
>>>
>>> I think that's what I explained before. On Windows XP the MS NetMon
>>> COM component does NOT support the MULTITHREADED threading model. At
>>> the moment I haven't found an easy solution to this issue.
>>>
>>
>> Gianluca,
>> Is there maybe a newer release I can test against?
>
>
> No. No further patches have been added to the dialup/NdisWan code. The
> test dlls on my web area are the latest ones from that point of view.
>
> Have a nice day
> GV
>
>>
>>
>> TIA
>> /Marc
>> _______________________________________________
>> Winpcap-users mailing list
>> Winpcap-users at winpcap.org
>> https://www.winpcap.org/mailman/listinfo/winpcap-users
>
>
> _______________________________________________
> Winpcap-users mailing list
> Winpcap-users at winpcap.org
> https://www.winpcap.org/mailman/listinfo/winpcap-users
>
More information about the Winpcap-users
mailing list