X-Recipient: archive-cygwin AT delorie DOT com X-Spam-Check-By: sourceware.org To: cygwin AT cygwin DOT com Date: Fri, 03 Oct 2008 14:00:19 +0100 Subject: Re: non-persistent DllMain Envelope-To: cygwin AT cygwin DOT com References: <48E5FB68 DOT 1090104 AT liddicott DOT com> <48E5FE38 DOT 7040400 AT gmail DOT com> <48E60C19 DOT 8070409 AT liddicott DOT com> <028e01c92554$709fef20$9601a8c0 AT CAM DOT ARTIMI DOT COM> Message-ID: <48E61763.8040601@liddicott.com> From: "Sam Liddicott" User-Agent: Thunderbird 2.0.0.17 (X11/20080925) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-IsSubscribed: yes Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by delorie.com id m93D22xs025428 [sent again without optional alternative html part] * Dave Korn wrote, On 03/10/08 13:34: > Sam Liddicott wrote on 03 October 2008 13:12: > > >> [Forgot to copy this to the list, + new question] >> >> * Aurimas Černius wrote, On 03/10/08 12:12: >> >>> If I'm not wrong, GetModuleHandle(NULL) returns the handle of the >>> current module (should be DLL handle, when called from DLL). So saving >>> handle to a global variable is not needed. >>> >>> >> thanks! >> > > GetModuleHandle will return the main .exe's handle, won't it? MSDN says: > > http://msdn.microsoft.com/en-us/library/ms683199(VS.85).aspx > "If this parameter is NULL, GetModuleHandle returns a handle to the file used > to create the calling process (.exe file)." > Yep, you are quite right. I just changed this to GetModuleHandle("GuiTest.dll"); and it no longer crashes - the hookproc still isn't called though :-( > ... and I have a memory that this issue cropped up recently in the context of > the cygwin dll's DllMain call. > >>> I think that DllMain is called when DLL is not yet completely loaded, >>> so it is impossible to set values of global variables. Isn't it? >>> >>> >> Makes sense, >> > > No it doesn't. The DLL is completely loaded and all relocations applied. > Anything else would be insanity. > > >> Sadly it then crashes explorer.exe, but thats another problem for me to >> look into. >> > > No, it's because you haven't solved the underlying problem yet. > > >> It crashes when I do the first sendmessage after hooking. >> > > ... with presumably a null pointer dereference? > it's hard to tell, it's explorer.exe that is crashing. > DllMain is special. There's a lot you cannot do in there, in particular > file i/o, printf etc, because you're running inside a lock and it's a sort of > critical section-y sort of situation, and indeed the MSVC CRT probably isn't > inited yet, so you definitely won't have stdio. > > If I were you, I'd put loads of OutputDebugMessage calls in your DllMain, > and watch what's happening and look at the value of hModule, and the addressof > g_hDLL (etc) using Sysinternals DebugView. > Thanks, I was wondering how to get at the OutputDebugMessage text. I've been out of windows dev for a long time. I'll see if hModule is the same as GetModuleHandle(dllname); and if so I'll look at why the hookproc isn't being called. I don't know if I have the skill to work out why dllmain won't hold global vars, but I can debug what is going on. The top of source is here, should you feel inclined to peep: http://cygwin.pastebin.com/m410a886a Sam -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/