Problem with "this" pointer with NT4 Ring 3 CPP driver code

Hello all,

I’m porting a customer’s video capture dll, which was written in C++. I
realize that the official Microsoft position frowns on C++ for NT4 drivers,
but I have never heard anyone say it could not be done.

The problem I’m having involves the “this” pointer. It appears that some
system calls, like CopyMemory and CreateEvent to name two, are zeroing the
ECX register and leaving it zeroed. The trouble is that the ECX register is
the “this” pointer. So suddenly my code is running with a NULL “this”
pointer. As an experiment I wrapped a couple of the calls with a “_ASM push
ECX” and “_ASM pop ECX” and those particular code segments behaved better.
This is a hack, of course; I shouldn’t have to be doing this.

So is there a compiler setting for preserving the registers during system
calls, or is there some other setting that is missing that tells the
compiler that we are dealing with C++ files?

I’m using MSDEV SP3, NT4 SP 6 and SoftIce 4.01. All this code runs in ring
3.

Thanks for any help,

Evan Hillman

> So is there a compiler setting for preserving the registers during system

calls, or is there some other setting that is missing that tells the
compiler that we are dealing with C++ files?

Use __stdcall calling convention for C++ methods instead of default
__thiscall. You will end with “this” being an on-stack local variable
instead of
ECX.

Max