255 lines
5 KiB
C
255 lines
5 KiB
C
#include "pch.h"
|
|
#include "resource.h"
|
|
|
|
extern PCTSTR GetMemDbDat (VOID);
|
|
|
|
HANDLE g_hHeap;
|
|
HWND g_ParentWnd;
|
|
HINSTANCE g_hInst;
|
|
HINF g_Win95UpgInf;
|
|
|
|
TCHAR g_WinDir[MAX_TCHAR_PATH];
|
|
TCHAR g_System32Dir[MAX_TCHAR_PATH];
|
|
TCHAR g_TempDir[MAX_TCHAR_PATH];
|
|
TCHAR g_ProfileDir[MAX_TCHAR_PATH];
|
|
PCTSTR g_SourceDir;
|
|
static TCHAR WinDir[MAX_TCHAR_PATH];
|
|
static TCHAR TempDir[MAX_TCHAR_PATH];
|
|
static TCHAR ProfileDir[MAX_TCHAR_PATH];
|
|
static TCHAR System32Dir[MAX_TCHAR_PATH];
|
|
static TCHAR WkstaMigInf[MAX_TCHAR_PATH];
|
|
|
|
//
|
|
// Define structure we pass around to describe a billboard.
|
|
//
|
|
typedef struct _BILLBOARD_PARAMS {
|
|
LPCTSTR Message;
|
|
HWND Owner;
|
|
DWORD NotifyThreadId;
|
|
} BILLBOARD_PARAMS, *PBILLBOARD_PARAMS;
|
|
|
|
//
|
|
// Custom window messages
|
|
//
|
|
#define WMX_BILLBOARD_DISPLAYED (WM_USER+243)
|
|
#define WMX_BILLBOARD_TERMINATE (WM_USER+244)
|
|
|
|
BOOL
|
|
BillboardDlgProc(
|
|
IN HWND hdlg,
|
|
IN UINT msg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
)
|
|
{
|
|
switch(msg) {
|
|
|
|
case WM_INITDIALOG:
|
|
{
|
|
PBILLBOARD_PARAMS BillParams = (PBILLBOARD_PARAMS) lParam;
|
|
PWSTR p;
|
|
BOOL b;
|
|
|
|
g_ParentWnd = hdlg;
|
|
|
|
SetDlgItemText (hdlg, IDT_STATIC_1, BillParams->Message);
|
|
CenterWindow (hdlg, NULL);
|
|
PostMessage(hdlg,WMX_BILLBOARD_DISPLAYED,0,(LPARAM)BillParams->NotifyThreadId);
|
|
}
|
|
break;
|
|
|
|
case WMX_BILLBOARD_DISPLAYED:
|
|
|
|
PostThreadMessage(
|
|
(DWORD)lParam,
|
|
WMX_BILLBOARD_DISPLAYED,
|
|
TRUE,
|
|
(LPARAM)hdlg
|
|
);
|
|
|
|
break;
|
|
|
|
case WMX_BILLBOARD_TERMINATE:
|
|
|
|
EndDialog(hdlg,0);
|
|
break;
|
|
|
|
default:
|
|
return(FALSE);
|
|
}
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
DWORD
|
|
BillboardThread(
|
|
IN PVOID ThreadParam
|
|
)
|
|
{
|
|
PBILLBOARD_PARAMS BillboardParams;
|
|
int i;
|
|
|
|
BillboardParams = ThreadParam;
|
|
|
|
i = DialogBoxParam(
|
|
g_hInst,
|
|
MAKEINTRESOURCE(IDD_BILLBOARD1),
|
|
BillboardParams->Owner,
|
|
BillboardDlgProc,
|
|
(LPARAM)BillboardParams
|
|
);
|
|
|
|
return(0);
|
|
}
|
|
|
|
|
|
HWND
|
|
DisplayBillboard(
|
|
IN HWND Owner,
|
|
IN LPCTSTR Message
|
|
)
|
|
{
|
|
HANDLE ThreadHandle;
|
|
DWORD ThreadId;
|
|
BILLBOARD_PARAMS ThreadParams;
|
|
HWND hwnd;
|
|
MSG msg;
|
|
|
|
hwnd = NULL;
|
|
|
|
//
|
|
// The billboard will exist in a separate thread so it will
|
|
// always be responsive.
|
|
//
|
|
ThreadParams.Message = Message;
|
|
ThreadParams.Owner = Owner;
|
|
ThreadParams.NotifyThreadId = GetCurrentThreadId();
|
|
|
|
ThreadHandle = CreateThread(
|
|
NULL,
|
|
0,
|
|
BillboardThread,
|
|
&ThreadParams,
|
|
0,
|
|
&ThreadId
|
|
);
|
|
|
|
if(ThreadHandle) {
|
|
//
|
|
// Wait for the billboard to tell us its window handle
|
|
// or that it failed to display the billboard dialog.
|
|
//
|
|
do {
|
|
GetMessage(&msg,NULL,0,0);
|
|
if(msg.message == WMX_BILLBOARD_DISPLAYED) {
|
|
if(msg.wParam) {
|
|
hwnd = (HWND)msg.lParam;
|
|
Sleep(1500); // let the user see it even on fast machines
|
|
}
|
|
} else {
|
|
DispatchMessage(&msg);
|
|
}
|
|
} while(msg.message != WMX_BILLBOARD_DISPLAYED);
|
|
|
|
CloseHandle(ThreadHandle);
|
|
}
|
|
|
|
return(hwnd);
|
|
}
|
|
|
|
|
|
VOID
|
|
KillBillboard(
|
|
IN HWND BillboardWindowHandle
|
|
)
|
|
{
|
|
if(IsWindow(BillboardWindowHandle)) {
|
|
PostMessage(BillboardWindowHandle,WMX_BILLBOARD_TERMINATE,0,0);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
MyInitLibs (
|
|
PCSTR Path OPTIONAL
|
|
)
|
|
{
|
|
DWORD ThreadId;
|
|
PCWSTR UnicodePath;
|
|
CHAR TempDirA[MAX_MBCHAR_PATH];
|
|
|
|
g_hHeap = GetProcessHeap();
|
|
g_hInst = GetModuleHandle(NULL);
|
|
|
|
if (!Path) {
|
|
GetWindowsDirectoryA (TempDirA, MAX_MBCHAR_PATH);
|
|
Path = TempDirA;
|
|
}
|
|
|
|
DisplayBillboard (GetDesktopWindow(), TEXT("Test application started"));
|
|
|
|
//
|
|
// Official init
|
|
//
|
|
|
|
FirstInitRoutine (g_hInst);
|
|
|
|
InitLibs (g_hInst, DLL_PROCESS_ATTACH, NULL);
|
|
|
|
FinalInitRoutine();
|
|
|
|
//
|
|
// Redirect settings
|
|
//
|
|
|
|
UnicodePath = ConvertAtoW (Path);
|
|
|
|
StringCopy (WinDir, UnicodePath);
|
|
|
|
StringCopy (TempDir, WinDir);
|
|
StringCopy (AppendWack (TempDir), TEXT("setup"));
|
|
|
|
StringCopy (ProfileDir, WinDir);
|
|
StringCopy (AppendWack (ProfileDir), TEXT("Profiles"));
|
|
|
|
StringCopy (System32Dir, WinDir);
|
|
StringCopy (AppendWack (System32Dir), TEXT("system32"));
|
|
|
|
StringCopy (WkstaMigInf, UnicodePath);
|
|
StringCopy (AppendWack (WkstaMigInf), TEXT("wkstamig.inf"));
|
|
|
|
StringCopy (g_WinDir, WinDir);
|
|
StringCopy (g_TempDir, TempDir);
|
|
g_SourceDir = WinDir;
|
|
StringCopy (g_ProfileDir, ProfileDir);
|
|
StringCopy (g_System32Dir, System32Dir);
|
|
g_WkstaMigInf = WinDir;
|
|
|
|
MemDbLoad (GetMemDbDat());
|
|
|
|
FreeConvertedStr (UnicodePath);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
VOID
|
|
MyTerminateLibs (
|
|
VOID
|
|
)
|
|
{
|
|
FirstCleanupRoutine();
|
|
TerminateLibs (g_hInst, DLL_PROCESS_DETACH, NULL);
|
|
FinalCleanupRoutine();
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|