windows-nt/Source/XPSP1/NT/base/ntsetup/win95upg/tools/lookup/init.c
2020-09-26 16:20:57 +08:00

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();
}