Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

115 lines
3.5 KiB

//---------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation 1991-1992
//
//---------------------------------------------------------------------------
#include "shellprv.h"
#pragma hdrstop
// this is for backwards compat only.
HWND hwndMainShell = NULL;
HWND hwndTaskMan = NULL;
//----------------------------------------------------------------------------
// ShellHookProc was mistakenly exported in the original NT SHELL32.DLL when
// it didn't need to be (hookproc's, like wndproc's don't need to be exported
// in the 32-bit world). In order to maintain loadability of some stupid app
// which might have linked to it, we stub it here. If some app ended up really
// using it, then we'll look into a specific fix for that app.
//
// -BobDay
//
LONG WINAPI ShellHookProc( INT code, WPARAM wParam, LPARAM lParam)
{
return 0;
}
//---------------------------------------------------------------------------
// RegisterShellHook - This function is meant to allow applications to set
// themselves up as shell replacements. One of the things they need to do
// is watch alot of the WH_CBT hook events. But to simplify things for them,
// the old code used to translate the hook events into messages and then
// either post or send the messages. The new method, implemented below, lets
// USER do most of the real work. This allows USER to convert the hook event
// directly into a message and thereby save having to load hook callback
// code (in this case us, SHELL32.DLL) into any processes address space where
// a CBT hook event occurred.
BOOL WINAPI RegisterShellHook(HWND hwnd, BOOL fInstall)
{
BOOL fOk = TRUE;
// gross hacks galore...
switch (fInstall) {
case 2:
// from win 3.1 to know what to activate on the fault
// and because they use special registered messages
//
// Special magic from PROGMAN - They want only certain CBT
// hook events as messages.
//
if ( hwndMainShell != NULL )
{
SetProgmanWindow(NULL);
hwndMainShell = NULL;
}
fOk = SetProgmanWindow(hwnd);
if ( fOk )
{
hwndMainShell = hwnd;
}
break;
case 3:
//
// Special magic from TASKMAN & TRAY - They want only certain
// CBT hook events as messages.
//
if ( hwndTaskMan != NULL )
{
SetTaskmanWindow(NULL);
hwndTaskMan = NULL;
}
fOk = SetTaskmanWindow(hwnd);
if ( fOk )
{
hwndTaskMan = hwnd;
}
break;
case 4:
//
// Special magic from TRAY / EXPLORER - It wants to know if
// there is already a taskman window installed so it can fix
// itself if there was some sort of explorer restart.
//
hwndTaskMan = GetTaskmanWindow();
return ( hwndTaskMan == NULL );
case 5:
// Not needed in NT -- this is used for overflow processing in Win95.
return TRUE;
case 0:
//
// Process un-installation of fake shell hooks
//
hwndMainShell = GetProgmanWindow();
hwndTaskMan = GetTaskmanWindow();
if ( hwnd == hwndMainShell )
{
SetProgmanWindow(NULL);
}
if ( hwnd == hwndTaskMan )
{
SetTaskmanWindow(NULL);
}
DeregisterShellHookWindow(hwnd);
return TRUE;
}
//
// Process installation of fake shell hooks
//
return RegisterShellHookWindow(hwnd);
}