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