- Fix breakage when in HCBT_CREATEWND callback.

svn path=/trunk/; revision=41617
This commit is contained in:
James Tabor 2009-06-26 02:10:52 +00:00
parent 336fb5e2d6
commit f69cbf46cc
4 changed files with 20 additions and 30 deletions

View file

@ -412,10 +412,8 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
LRESULT Result; LRESULT Result;
CREATESTRUCTW Csw; CREATESTRUCTW Csw;
CBT_CREATEWNDW CbtCreatewndw; CBT_CREATEWNDW CbtCreatewndw;
UNICODE_STRING UString;
CREATESTRUCTA Csa; CREATESTRUCTA Csa;
CBT_CREATEWNDA CbtCreatewnda; CBT_CREATEWNDA CbtCreatewnda;
ANSI_STRING AString;
PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra; PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra;
WPARAM wParam; WPARAM wParam;
LPARAM lParam; LPARAM lParam;
@ -451,18 +449,6 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
if (Common->Ansi) if (Common->Ansi)
{ {
memcpy(&Csa, &Csw, sizeof(CREATESTRUCTW)); memcpy(&Csa, &Csw, sizeof(CREATESTRUCTW));
if (NULL != Csw.lpszName)
{
RtlInitUnicodeString(&UString, Csw.lpszName);
RtlUnicodeStringToAnsiString(&AString, &UString, TRUE);
Csa.lpszName = AString.Buffer;
}
if (0 != HIWORD(Csw.lpszClass))
{
RtlInitUnicodeString(&UString, Csw.lpszClass);
RtlUnicodeStringToAnsiString(&AString, &UString, TRUE);
Csa.lpszClass = AString.Buffer;
}
CbtCreatewnda.lpcs = &Csa; CbtCreatewnda.lpcs = &Csa;
CbtCreatewnda.hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter; CbtCreatewnda.hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter;
lParam = (LPARAM) &CbtCreatewnda; lParam = (LPARAM) &CbtCreatewnda;
@ -478,22 +464,17 @@ User32CallHookProcFromKernel(PVOID Arguments, ULONG ArgumentLength)
return ZwCallbackReturn(NULL, 0, STATUS_NOT_SUPPORTED); return ZwCallbackReturn(NULL, 0, STATUS_NOT_SUPPORTED);
} }
Result = Common->Proc(Common->Code, wParam, lParam); if (Common->Proc)
Result = Common->Proc(Common->Code, wParam, lParam);
else
{
ERR("Common = 0x%x, Proc = 0x%x\n",Common,Common->Proc);
}
switch(Common->Code) switch(Common->Code)
{ {
case HCBT_CREATEWND: case HCBT_CREATEWND:
if (Common->Ansi) CbtCreatewndExtra->WndInsertAfter = CbtCreatewndw.hwndInsertAfter;
{
if (0 != HIWORD(Csa.lpszClass))
{
RtlFreeHeap(GetProcessHeap(), 0, (LPSTR) Csa.lpszClass);
}
if (NULL != Csa.lpszName)
{
RtlFreeHeap(GetProcessHeap(), 0, (LPSTR) Csa.lpszName);
}
}
break; break;
} }
break; break;

View file

@ -43,6 +43,7 @@ typedef struct _THREADINFO
UINT cPaintsReady; /* Count of paints pending. */ UINT cPaintsReady; /* Count of paints pending. */
UINT cTimersReady; /* Count of timers pending. */ UINT cTimersReady; /* Count of timers pending. */
ULONG fsHooks; ULONG fsHooks;
PHOOK sphkCurrent;
LIST_ENTRY PtiLink; LIST_ENTRY PtiLink;
CLIENTTHREADINFO cti; // Used only when no Desktop or pcti NULL. CLIENTTHREADINFO cti; // Used only when no Desktop or pcti NULL.

View file

@ -346,7 +346,7 @@ co_IntCallHookProc(INT HookId,
PHOOKPROC_CALLBACK_ARGUMENTS Common; PHOOKPROC_CALLBACK_ARGUMENTS Common;
CBT_CREATEWNDW *CbtCreateWnd =NULL; CBT_CREATEWNDW *CbtCreateWnd =NULL;
PCHAR Extra; PCHAR Extra;
PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra ; PHOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS CbtCreatewndExtra = NULL;
UNICODE_STRING WindowName; UNICODE_STRING WindowName;
UNICODE_STRING ClassName; UNICODE_STRING ClassName;
PANSI_STRING asWindowName; PANSI_STRING asWindowName;
@ -546,6 +546,14 @@ co_IntCallHookProc(INT HookId,
return 0; return 0;
} }
if (HookId == WH_CBT && Code == HCBT_CREATEWND)
{
if (CbtCreatewndExtra)
{
CbtCreateWnd->hwndInsertAfter = CbtCreatewndExtra->WndInsertAfter;
}
}
if (Argument) IntCbFreeMemory(Argument); if (Argument) IntCbFreeMemory(Argument);
return Result; return Result;

View file

@ -529,7 +529,7 @@ IntCallDebugHook(PHOOK Hook,
case HCBT_CREATEWND: /* Handle Ansi? */ case HCBT_CREATEWND: /* Handle Ansi? */
Size = sizeof(CBT_CREATEWND); Size = sizeof(CBT_CREATEWND);
/* What shall we do? Size += sizeof(HOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS); same ass CREATESTRUCTEX */ /* What shall we do? Size += sizeof(HOOKPROC_CBT_CREATEWND_EXTRA_ARGUMENTS); same as CREATESTRUCTEX */
break; break;
default: default:
@ -845,9 +845,9 @@ UserCallNextHookEx(PHOOK Hook,
DPRINT1("HOOK HCBT_CREATEWND write ERROR!\n"); DPRINT1("HOOK HCBT_CREATEWND write ERROR!\n");
} }
/* The next call handles the structures. */ /* The next call handles the structures. */
if (!BadChk) if (!BadChk && Hook->Proc)
{ {
// lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam); lResult = co_HOOK_CallHookNext(Hook, Code, wParam, lParam);
} }
break; break;
} }