• [C++] 反编译器


    各种开源的decompiler都不太好用,目前最好的反编译器是IDA pro。

    虽然是收费的,不过破解版很好找。

    我试过5.5版本的,还不错。


    我把windows notepad进行了反编译,多少算有点可读性:

    /* This file has been generated by the Hex-Rays decompiler.
       Copyright (c) 2009 Hex-Rays <info@hex-rays.com>
    
       Detected compiler: Visual C++
    */
    
    #include <windows.h>
    #include <defs.h>
    
    #include <stdarg.h>
    
    
    //-------------------------------------------------------------------------
    // Data declarations
    
    // extern void *acmdln; weak
    extern const WCHAR szOtherStuff; // idb
    extern wchar_t aW[3]; // weak
    extern wchar_t aA[3]; // weak
    extern const WCHAR TableName[]; // idb
    extern const WCHAR aCommdlg_help[]; // idb
    extern const WCHAR String[]; // idb
    extern wchar_t a_setup[8]; // weak
    extern wchar_t aP[3]; // weak
    extern wchar_t aPt[4]; // weak
    extern wchar_t aSC_txtCSC_C[]; // idb
    extern wchar_t aSecuritySppGen[32]; // weak
    extern int dword_1002B48[2]; // weak
    extern const WCHAR aIpointsize[]; // idb
    extern const WCHAR aLffacename[]; // idb
    extern const WCHAR aLfpitchandfami[]; // idb
    extern const WCHAR aLfquality[]; // idb
    extern const WCHAR aLfclipprecisio[]; // idb
    extern const WCHAR aLfoutprecision[]; // idb
    extern const WCHAR aLfcharset[]; // idb
    extern const WCHAR aLfstrikeout[]; // idb
    extern const WCHAR aLfunderline[]; // idb
    extern const WCHAR aLfitalic[]; // idb
    extern const WCHAR aLfweight[]; // idb
    extern const WCHAR aLforientation[]; // idb
    extern const WCHAR ValueName[]; // idb
    extern const WCHAR SubKey[]; // idb
    extern const WCHAR aIwindowposdy[]; // idb
    extern const WCHAR aIwindowposdx[]; // idb
    extern const WCHAR aIwindowposy[]; // idb
    extern const WCHAR aIwindowposx[]; // idb
    extern const WCHAR aImarginright[]; // idb
    extern const WCHAR aImarginleft[]; // idb
    extern const WCHAR aImarginbottom[]; // idb
    extern const WCHAR aImargintop[]; // idb
    extern const WCHAR aSztrailer[]; // idb
    extern const WCHAR aSzheader[]; // idb
    extern const WCHAR aStatusbar[]; // idb
    extern const WCHAR aFwrap[]; // idb
    extern const WCHAR aEdit[]; // idb
    extern const WCHAR aFmle_is_broken[]; // idb
    extern const WCHAR aFsavewindowpos[]; // idb
    extern const WCHAR aSoftwareMicr_0[]; // idb
    extern wchar_t aLucidaConsole[15]; // weak
    extern const WCHAR ClassName[]; // idb
    extern int dword_1003AF0[2]; // weak
    extern wchar_t aTxt[4]; // weak
    extern int dword_1003C74[5]; // weak
    extern wchar_t a_[4]; // weak
    extern const WCHAR pszPath[]; // idb
    extern IID riid; // idb
    extern IID rclsid; // idb
    extern IID stru_100400C; // idb
    extern IID stru_100401C; // idb
    extern IID stru_10043D0; // idb
    extern IID stru_10043E0; // idb
    extern wchar_t aNull[7]; // weak
    extern OLECHAR psz[]; // idb
    extern wchar_t aHelp_entry_id_[27]; // weak
    extern int dword_1004748[4]; // weak
    extern int dword_10049F4[4]; // weak
    extern int dword_1004A04[2]; // weak
    extern int dword_1004AF0[4]; // weak
    extern const WCHAR aSlipupacc[]; // idb
    extern wchar_t aStringfileinfo[]; // idb
    extern const WCHAR SubBlock[]; // idb
    extern wchar_t aSppsvc_exe[12]; // weak
    extern wchar_t aSlui_exe[10]; // weak
    extern wchar_t aSppuinotify_dl[17]; // weak
    extern const WCHAR aSppsvc[]; // idb
    extern const WCHAR ServiceName[]; // idb
    extern int dword_1006D38[6]; // weak
    extern wchar_t aD[]; // idb
    extern wchar_t a_txt_0[5]; // weak
    extern int dword_10098B8; // weak
    extern wchar_t asc_10098BC[3]; // weak
    extern int dword_1009EE0[2]; // weak
    extern struct _EXCEPTION_POINTERS ExceptionInfo; // idb
    extern __int16 word_100C000; // weak
    extern BYTE Data; // idb
    extern int dword_100C008; // weak
    extern int dword_100C00C; // weak
    extern int dword_100C010; // weak
    extern int dword_100C014; // weak
    extern int dword_100C018; // weak
    extern int dword_100C01C; // weak
    extern HWND hWnd; // idb
    extern HWND dword_100C024; // idb
    extern HWND dword_100C028; // idb
    extern BYTE dword_100C02C; // idb
    extern int dword_100C030; // weak
    extern WPARAM wParam; // idb
    extern int dword_100C038; // weak
    extern int dword_100C03C; // weak
    extern int dword_100C040; // weak
    extern WPARAM dword_100C044; // idb
    extern LPARAM lParam; // idb
    extern int nHeight; // idb
    extern int nWidth; // idb
    extern int X; // idb
    extern int Y; // idb
    extern int dword_100C05C; // weak
    extern int dword_100C060; // weak
    extern int dword_100C064; // weak
    extern int dword_100C070; // weak
    extern HANDLE hFile; // idb
    extern int dword_100C078; // weak
    extern int dword_100C07C; // weak
    extern HACCEL hAccTable; // idb
    extern int dword_100C084; // weak
    extern HGDIOBJ ho; // idb
    extern HINSTANCE hInstance; // idb
    extern HCURSOR hCursor; // idb
    extern HCURSOR dword_100C094; // idb
    extern HLOCAL hMem; // idb
    extern int dword_100C0A4; // weak
    extern struct tagFINDREPLACEW stru_100C0C0; // idb
    extern WINDOWPLACEMENT wndpl; // idb
    extern struct tagPSDW stru_100C140; // idb
    extern struct tagOFNW stru_100C1A0; // idb
    extern LOGFONTW lf; // idb
    extern volatile LONG Destination; // idb
    extern int (__stdcall *off_100C26C)(int, int, int); // weak
    extern int (__stdcall *off_100C288)(int, int, int); // weak
    extern LPCWSTR dword_100C2B0; // idb
    extern LPCWSTR dword_100C2B4; // idb
    extern LPCWSTR lpString2; // idb
    extern LPCVOID lpSource; // idb
    extern LPCWSTR dword_100C2C4; // idb
    extern LPCWSTR lpText; // idb
    extern LPCWSTR szApp; // idb
    extern LPCWSTR dword_100C2DC; // idb
    extern int dword_100C2E0; // weak
    extern LPCWSTR dword_100C2EC; // idb
    extern int dword_100C2F0; // weak
    extern LPCWSTR lpszHelp; // idb
    extern int dword_100C2F8; // weak
    extern int dword_100C2FC; // weak
    extern int dword_100C300; // weak
    extern char Args[]; // idb
    extern int dword_100C308; // weak
    extern int dword_100C30C; // weak
    extern int dword_100C310; // weak
    extern LPCWSTR dword_100C314; // idb
    extern LPCWSTR dword_100C318; // idb
    extern LPCWSTR dword_100C31C; // idb
    extern LPCWSTR dword_100C320; // idb
    extern LPCWSTR dword_100C324; // idb
    extern wchar_t *dword_100C328; // idb
    extern LPCWSTR lpCaption; // idb
    extern LPCWSTR dword_100C330; // idb
    extern LPARAM dword_100C334; // idb
    extern LPARAM dword_100C338; // idb
    extern LPARAM dword_100C33C; // idb
    extern LPARAM dword_100C340; // idb
    extern wchar_t *dword_100C344; // idb
    extern wchar_t *Format; // idb
    extern int dword_100C368; // weak
    extern int dword_100C370; // weak
    extern int dword_100C374; // weak
    extern int dword_100C37C; // weak
    extern int dword_100C3C0; // weak
    extern __int16 word_100C44C; // weak
    extern __int16 word_100C450; // weak
    extern __int16 word_100C454; // weak
    extern __int16 word_100C458; // weak
    extern int dword_100C45C; // weak
    extern int dword_100C460; // weak
    extern int dword_100C464; // weak
    extern int dword_100C468; // weak
    extern int dword_100C46C; // weak
    extern int dword_100C470; // weak
    extern int dword_100C474; // weak
    extern int dword_100C478; // weak
    extern __int16 word_100C47C; // weak
    extern int dword_100C480; // weak
    extern int dword_100C484; // weak
    extern __int16 word_100C488; // weak
    extern WCHAR word_100C6A0; // idb
    extern _UNKNOWN unk_100C6F0; // weak
    extern const WCHAR word_100C740; // idb
    extern BYTE Dst; // idb
    extern wchar_t word_100C7E0; // idb
    extern wchar_t Dest; // idb
    extern int off_100C920[2]; // weak
    extern _UNKNOWN unk_100C9DC; // weak
    extern const WCHAR word_100C9E0; // idb
    extern const WCHAR FileName; // idb
    extern HWND dword_100CCE8; // idb
    extern int dword_100CCEC; // weak
    extern int dword_100CCF0; // weak
    extern int dword_100CCF4; // weak
    extern int (__thiscall *dword_100CD0C)(_DWORD); // weak
    extern int dword_100CD10; // weak
    extern int *off_100CD14; // weak
    extern _UNKNOWN unk_100CD50; // weak
    extern _UNKNOWN unk_100CD54; // weak
    extern _UNKNOWN unk_100CD58; // weak
    extern const WCHAR word_100CD60; // idb
    extern const WCHAR word_100CF68; // idb
    extern const WCHAR String2; // idb
    extern const WCHAR word_100D378; // idb
    extern int dword_100D580; // weak
    extern const WCHAR word_100D588; // idb
    extern LPARAM dword_100D790; // idb
    extern WPARAM dword_100D794; // idb
    extern int dword_100D798; // weak
    extern int dword_100D79C; // weak
    extern HMENU dword_100D7A0; // idb
    extern volatile LONG Target; // idb
    extern int dword_100D7A8; // weak
    extern char dword_100D7AC[]; // idb
    extern int dword_100D7B0; // weak
    extern int x; // idb
    extern int dword_100D7B8; // weak
    extern int dword_100D7BC; // weak
    extern int dword_100D7C0; // weak
    extern int dword_100D7C4; // weak
    extern int y; // idb
    extern int dword_100D7CC; // idb
    extern int dword_100D7D0; // weak
    extern int dword_100D7D4; // weak
    extern int dword_100D7D8; // weak
    extern struct _SYSTEMTIME SystemTime; // idb
    extern const WCHAR word_100D800; // idb
    extern const WCHAR word_100DA08; // idb
    extern const WCHAR word_100DC10; // idb
    extern struct tagPOINT pt; // idb
    extern int dword_100DE28; // weak
    extern int dword_100DE2C; // weak
    extern int dword_100DE30; // weak
    extern int dword_100DE34; // weak
    extern HWND hDlg; // idb
    extern int dword_100DE3C; // weak
    extern WCHAR pPrinterName; // idb
    extern int dword_100E040; // weak
    extern HMENU hMenu; // idb
    extern _UNKNOWN unk_100E060; // weak
    extern int dword_100E160; // weak
    
    //-------------------------------------------------------------------------
    // Function declarations
    
    #define __thiscall __cdecl // Test compile in C mode
    
    // LSTATUS __stdcall RegSetValueExW(HKEY hKey, LPCWSTR lpValueName, DWORD Reserved, DWORD dwType, const BYTE *lpData, DWORD cbData);
    // LSTATUS __stdcall RegQueryValueExW(HKEY hKey, LPCWSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData);
    // LSTATUS __stdcall RegCloseKey(HKEY hKey);
    // LSTATUS __stdcall RegCreateKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult);
    // LSTATUS __stdcall RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult);
    // BOOL __stdcall IsTextUnicode(const void *lpv, int iSize, LPINT lpiResult);
    // BOOL __stdcall CloseServiceHandle(SC_HANDLE hSCObject);
    // BOOL __stdcall QueryServiceConfigW(SC_HANDLE hService, LPQUERY_SERVICE_CONFIGW lpServiceConfig, DWORD cbBufSize, LPDWORD pcbBytesNeeded);
    // SC_HANDLE __stdcall OpenServiceW(SC_HANDLE hSCManager, LPCWSTR lpServiceName, DWORD dwDesiredAccess);
    // SC_HANDLE __stdcall OpenSCManagerW(LPCWSTR lpMachineName, LPCWSTR lpDatabaseName, DWORD dwDesiredAccess);
    // int __stdcall FindNLSString(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); weak
    // HGLOBAL __stdcall GlobalAlloc(UINT uFlags, SIZE_T dwBytes);
    // BOOL __stdcall GlobalUnlock(HGLOBAL hMem);
    // LPVOID __stdcall GlobalLock(HGLOBAL hMem);
    // int __stdcall GetTimeFormatW(LCID Locale, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpTimeStr, int cchTime);
    // int __stdcall GetDateFormatW(LCID Locale, DWORD dwFlags, const SYSTEMTIME *lpDate, LPCWSTR lpFormat, LPWSTR lpDateStr, int cchDate);
    // void __stdcall GetLocalTime(LPSYSTEMTIME lpSystemTime);
    // LANGID __stdcall GetUserDefaultUILanguage();
    // BOOL __stdcall HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem);
    // LPVOID __stdcall HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes);
    // HANDLE __stdcall GetProcessHeap();
    // BOOL __stdcall GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation);
    // LONG __stdcall InterlockedExchange(volatile LONG *Target, LONG Value);
    // void __stdcall FreeLibraryAndExitThread(HMODULE hLibModule, DWORD dwExitCode);
    // DWORD __stdcall GetFileAttributesW(LPCWSTR lpFileName);
    // BOOL __stdcall Wow64RevertWow64FsRedirection(PVOID OlValue);
    // BOOL __stdcall Wow64DisableWow64FsRedirection(PVOID *OldValue);
    // BOOL __stdcall IsWow64Process(HANDLE hProcess, PBOOL Wow64Process);
    // HANDLE __stdcall GetCurrentProcess();
    // HANDLE __stdcall CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);
    // HMODULE __stdcall LoadLibraryW(LPCWSTR lpLibFileName);
    // DWORD __stdcall GetModuleFileNameW(HMODULE hModule, LPWCH lpFilename, DWORD nSize);
    // HANDLE __stdcall CreateFileMappingW(HANDLE hFile, LPSECURITY_ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCWSTR lpName);
    // DWORD __stdcall FormatMessageW(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPWSTR lpBuffer, DWORD nSize, va_list *Arguments);
    // LPVOID __stdcall MapViewOfFile(HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, SIZE_T dwNumberOfBytesToMap);
    // BOOL __stdcall UnmapViewOfFile(LPCVOID lpBaseAddress);
    // HLOCAL __stdcall LocalReAlloc(HLOCAL hMem, SIZE_T uBytes, UINT uFlags);
    // UINT __stdcall GetACP();
    // BOOL __stdcall DeleteFileW(LPCWSTR lpFileName);
    // BOOL __stdcall SetEndOfFile(HANDLE hFile);
    // int __stdcall WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar);
    // void __stdcall SetLastError(DWORD dwErrCode);
    // BOOL __stdcall WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);
    // DWORD __stdcall GetLastError();
    // SIZE_T __stdcall LocalSize(HLOCAL hMem);
    // DWORD __stdcall GetFullPathNameW(LPCWSTR lpFileName, DWORD nBufferLength, LPWSTR lpBuffer, LPWSTR *lpFilePart);
    // int __stdcall MulDiv(int nNumber, int nNumerator, int nDenominator);
    // LPWSTR __stdcall GetCommandLineW();
    // DWORD __stdcall GetCurrentProcessId();
    // int __stdcall FoldStringW(DWORD dwMapFlags, LPCWSTR lpSrcStr, int cchSrc, LPWSTR lpDestStr, int cchDest);
    // int __stdcall lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2);
    // HANDLE __stdcall FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData);
    // BOOL __stdcall FindClose(HANDLE hFindFile);
    // BOOL __stdcall HeapSetInformation(HANDLE HeapHandle, HEAP_INFORMATION_CLASS HeapInformationClass, PVOID HeapInformation, SIZE_T HeapInformationLength);
    // BOOL __stdcall TerminateProcess(HANDLE hProcess, UINT uExitCode);
    // void __stdcall GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime);
    // DWORD __stdcall GetCurrentThreadId();
    // DWORD __stdcall GetTickCount();
    // BOOL __stdcall QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);
    // HMODULE __stdcall GetModuleHandleA(LPCSTR lpModuleName);
    // LPTOP_LEVEL_EXCEPTION_FILTER __stdcall SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter);
    // void __stdcall GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo);
    // LONG __stdcall InterlockedCompareExchange(volatile LONG *Destination, LONG Exchange, LONG Comperand);
    // void __stdcall Sleep(DWORD dwMilliseconds);
    // LPVOID __stdcall LocalLock(HLOCAL hMem);
    // BOOL __stdcall LocalUnlock(HLOCAL hMem);
    // int __stdcall lstrlenW(LPCWSTR lpString);
    // int __stdcall GetLocaleInfoW(LCID Locale, LCTYPE LCType, LPWSTR lpLCData, int cchData);
    // HGLOBAL __stdcall GlobalFree(HGLOBAL hMem);
    // int __stdcall lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2);
    // UINT __stdcall SetErrorMode(UINT uMode);
    // HANDLE __stdcall CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
    // BOOL __stdcall ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
    // BOOL __stdcall CloseHandle(HANDLE hObject);
    // HLOCAL __stdcall LocalAlloc(UINT uFlags, SIZE_T uBytes);
    // LONG __stdcall InterlockedDecrement(volatile LONG *lpAddend);
    // HLOCAL __stdcall LocalFree(HLOCAL hMem);
    // LONG __stdcall InterlockedIncrement(volatile LONG *lpAddend);
    // BOOL __stdcall GetVersionExW(LPOSVERSIONINFOW lpVersionInformation);
    // LONG __stdcall UnhandledExceptionFilter(struct _EXCEPTION_POINTERS *ExceptionInfo);
    // HFONT __stdcall CreateFontIndirectW(const LOGFONTW *lplf);
    // int __stdcall SetMapMode(HDC hdc, int iMode);
    // BOOL __stdcall SetViewportExtEx(HDC hdc, int x, int y, LPSIZE lpsz);
    // BOOL __stdcall SetWindowExtEx(HDC hdc, int x, int y, LPSIZE lpsz);
    // BOOL __stdcall LPtoDP(HDC hdc, LPPOINT lppt, int c);
    // int __stdcall SetBkMode(HDC hdc, int mode);
    // BOOL __stdcall GetTextMetricsW(HDC hdc, LPTEXTMETRICW lptm);
    // int __stdcall SetAbortProc(HDC hdc, ABORTPROC proc);
    // int __stdcall StartDocW(HDC hdc, const DOCINFOW *lpdi);
    // int __stdcall StartPage(HDC hdc);
    // int __stdcall EndPage(HDC hdc);
    // int __stdcall AbortDoc(HDC hdc);
    // int __stdcall EndDoc(HDC hdc);
    // BOOL __stdcall DeleteDC(HDC hdc);
    // BOOL __stdcall TextOutW(HDC hdc, int x, int y, LPCWSTR lpString, int c);
    // BOOL __stdcall GetTextExtentPoint32W(HDC hdc, LPCWSTR lpString, int c, LPSIZE psizl);
    // HDC __stdcall CreateDCW(LPCWSTR pwszDriver, LPCWSTR pwszDevice, LPCWSTR pszPort, const DEVMODEW *pdm);
    // HGDIOBJ __stdcall SelectObject(HDC hdc, HGDIOBJ h);
    // int __stdcall GetTextFaceW(HDC hdc, int c, LPWSTR lpName);
    // int __stdcall EnumFontsW(HDC hdc, LPCWSTR lpLogfont, FONTENUMPROCW lpProc, LPARAM lParam);
    // int __stdcall GetDeviceCaps(HDC hdc, int index);
    // BOOL __stdcall DeleteObject(HGDIOBJ ho);
    // HWND __stdcall SetActiveWindow(HWND hWnd);
    // HKL __stdcall GetKeyboardLayout(DWORD idThread);
    // void __stdcall PostQuitMessage(int nExitCode);
    // LRESULT __stdcall DefWindowProcW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
    // HWND __stdcall GetForegroundWindow();
    // BOOL __stdcall IsIconic(HWND hWnd);
    // BOOL __stdcall DestroyWindow(HWND hWnd);
    // BOOL __stdcall MessageBeep(UINT uType);
    // BOOL __stdcall GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT *lpwndpl);
    // LPWSTR __stdcall CharUpperW(LPWSTR lpsz);
    // ATOM __stdcall RegisterClassExW(const WNDCLASSEXW *);
    // HANDLE __stdcall LoadImageW(HINSTANCE hInst, LPCWSTR name, UINT type, int cx, int cy, UINT fuLoad);
    // HCURSOR __stdcall LoadCursorW(HINSTANCE hInstance, LPCWSTR lpCursorName);
    // LONG __stdcall SetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong);
    // HACCEL __stdcall LoadAcceleratorsW(HINSTANCE hInstance, LPCWSTR lpTableName);
    // HMENU __stdcall GetSystemMenu(HWND hWnd, BOOL bRevert);
    // BOOL __stdcall SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT *lpwndpl);
    // HWND __stdcall CreateWindowExW(DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);
    // UINT __stdcall RegisterWindowMessageW(LPCWSTR lpString);
    // BOOL __stdcall UpdateWindow(HWND hWnd);
    // BOOL __stdcall InvalidateRect(HWND hWnd, const RECT *lpRect, BOOL bErase);
    // int __stdcall SetScrollPos(HWND hWnd, int nBar, int nPos, BOOL bRedraw);
    // int __stdcall GetWindowTextLengthW(HWND hWnd);
    // LONG __stdcall GetWindowLongW(HWND hWnd, int nIndex);
    // BOOL __stdcall PeekMessageW(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg);
    // BOOL __stdcall EnableWindow(HWND hWnd, BOOL bEnable);
    // INT_PTR __stdcall DialogBoxParamW(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);
    // HWND __stdcall CreateDialogParamW(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);
    // int __stdcall GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount);
    // BOOL __stdcall SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags);
    // HCURSOR __stdcall SetCursor(HCURSOR hCursor);
    // BOOL __stdcall SetForegroundWindow(HWND hWnd);
    // HWND __stdcall FindWindowW(LPCWSTR lpClassName, LPCWSTR lpWindowName);
    // int __stdcall GetSystemMetrics(int nIndex);
    // BOOL __stdcall MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint);
    // LRESULT __stdcall SendMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
    // LPWSTR __stdcall CharNextW(LPCWSTR lpsz);
    // DWORD __stdcall CheckMenuItem(HMENU hMenu, UINT uIDCheckItem, UINT uCheck);
    // BOOL __stdcall CloseClipboard();
    // BOOL __stdcall IsClipboardFormatAvailable(UINT format);
    // BOOL __stdcall OpenClipboard(HWND hWndNewOwner);
    // UINT __stdcall GetMenuState(HMENU hMenu, UINT uId, UINT uFlags);
    // BOOL __stdcall EnableMenuItem(HMENU hMenu, UINT uIDEnableItem, UINT uEnable);
    // HMENU __stdcall GetSubMenu(HMENU hMenu, int nPos);
    // BOOL __stdcall GetClientRect(HWND hWnd, LPRECT lpRect);
    // BOOL __stdcall UnhookWinEvent(HWINEVENTHOOK hWinEventHook);
    // HMENU __stdcall GetMenu(HWND hWnd);
    // int __stdcall MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
    // BOOL __stdcall WinHelpW(HWND hWndMain, LPCWSTR lpszHelp, UINT uCommand, ULONG_PTR dwData);
    // int __stdcall GetDlgCtrlID(HWND hWnd);
    // HWND __stdcall ChildWindowFromPoint(HWND hWndParent, POINT Point);
    // HDC __stdcall GetDC(HWND hWnd);
    // BOOL __stdcall ShowWindow(HWND hWnd, int nCmdShow);
    // int __stdcall DrawTextExW(HDC hdc, LPWSTR lpchText, int cchText, LPRECT lprc, UINT format, LPDRAWTEXTPARAMS lpdtp);
    // int __stdcall ReleaseDC(HWND hWnd, HDC hDC);
    // HICON __stdcall LoadIconW(HINSTANCE hInstance, LPCWSTR lpIconName);
    // HWINEVENTHOOK __stdcall SetWinEventHook(DWORD eventMin, DWORD eventMax, HMODULE hmodWinEventProc, WINEVENTPROC pfnWinEventProc, DWORD idProcess, DWORD idThread, DWORD dwFlags);
    // BOOL __stdcall GetMessageW(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
    // BOOL __stdcall PostMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
    // BOOL __stdcall IsDialogMessageW(HWND hDlg, LPMSG lpMsg);
    // int __stdcall TranslateAcceleratorW(HWND hWnd, HACCEL hAccTable, LPMSG lpMsg);
    // BOOL __stdcall EndDialog(HWND hDlg, INT_PTR nResult);
    // UINT __stdcall GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int cchMax);
    // BOOL __stdcall SetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPCWSTR lpString);
    // HWND __stdcall SetFocus(HWND hWnd);
    // BOOL __stdcall SetWindowTextW(HWND hWnd, LPCWSTR lpString);
    // HWND __stdcall GetParent(HWND hWnd);
    // int __stdcall LoadStringW(HINSTANCE hInstance, UINT uID, LPWSTR lpBuffer, int cchBufferMax);
    // LRESULT __stdcall SendDlgItemMessageW(HWND hDlg, int nIDDlgItem, UINT Msg, WPARAM wParam, LPARAM lParam);
    // BOOL __stdcall GetCursorPos(LPPOINT lpPoint);
    // BOOL __stdcall ScreenToClient(HWND hWnd, LPPOINT lpPoint);
    // BOOL __stdcall TranslateMessage(const MSG *lpMsg);
    // HWND __stdcall GetAncestor(HWND hwnd, UINT gaFlags);
    // LRESULT __stdcall DispatchMessageW(const MSG *lpMsg);
    // unsigned int __cdecl controlfp(unsigned int NewValue, unsigned int Mask);
    // int __cdecl vsnwprintf(wchar_t *Dest, size_t Count, const wchar_t *Format, va_list Args);
    // __int32 __cdecl wtol(const wchar_t *Str);
    // int __cdecl iswctype(wint_t C, wctype_t Type);
    // int __cdecl wcsncmp(const wchar_t *Str1, const wchar_t *Str2, size_t MaxCount);
    // wchar_t *__cdecl wcsrchr(const wchar_t *Str, wchar_t Ch);
    // void __cdecl exit(int Code);
    // int __cdecl ismbblead(_DWORD); weak
    // int cexit(void); weak
    // void __cdecl exit(int Code);
    // void __cdecl terminate(); weak
    // HWND __stdcall ReplaceTextW(LPFINDREPLACEW);
    // BOOL __stdcall PageSetupDlgW(LPPAGESETUPDLGW);
    // HRESULT __stdcall PrintDlgExW(LPPRINTDLGEXW);
    // HWND __stdcall FindTextW(LPFINDREPLACEW);
    // BOOL __stdcall ChooseFontW(LPCHOOSEFONTW);
    // BOOL __stdcall GetSaveFileNameW(LPOPENFILENAMEW);
    // DWORD __stdcall CommDlgExtendedError();
    // BOOL __stdcall GetOpenFileNameW(LPOPENFILENAMEW);
    // __int16 __stdcall GetFileTitleW(LPCWSTR, LPWSTR Buf, WORD cchSize);
    // void __stdcall DragAcceptFiles(HWND hWnd, BOOL fAccept);
    // void __stdcall SHAddToRecentDocs(UINT uFlags, LPCVOID pv);
    // HRESULT __stdcall SHGetFolderPathW(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath);
    // int __stdcall SHCreateItemFromParsingName(_DWORD, _DWORD, _DWORD, _DWORD); weak
    // BOOL __stdcall ShellExecuteExW(LPSHELLEXECUTEINFOW lpExecInfo);
    // UINT __stdcall DragQueryFileW(HDROP hDrop, UINT iFile, LPWSTR lpszFile, UINT cch);
    // void __stdcall DragFinish(HDROP hDrop);
    // HRESULT __stdcall CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);
    // void __stdcall CoUninitialize();
    // LPVOID __stdcall CoTaskMemAlloc(SIZE_T cb);
    // HRESULT __stdcall CoCreateInstance(const IID *const rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, const IID *const riid, LPVOID *ppv);
    // void __stdcall CoTaskMemFree(LPVOID pv);
    // HRESULT __stdcall CoInitialize(LPVOID pvReserved);
    // BOOL __stdcall PathIsFileSpecW(LPCWSTR pszPath);
    // int __stdcall SHStrDupW(_DWORD, _DWORD); weak
    // HPROPSHEETPAGE __stdcall CreatePropertySheetPageW(LPCPROPSHEETPAGEW constPropSheetPagePointer);
    // INT_PTR __stdcall PropertySheetW(LPCPROPSHEETHEADERW);
    // HWND __stdcall CreateStatusWindowW(LONG style, LPCWSTR lpszText, HWND hwndParent, UINT wID);
    // int __stdcall COMCTL32_345(_DWORD, _DWORD, _DWORD, _DWORD); weak
    // void __stdcall SysFreeString(BSTR bstrString);
    // BSTR __stdcall SysAllocString(const OLECHAR *psz);
    // int __stdcall RtlInitUnicodeString(_DWORD, _DWORD); weak
    // int __stdcall NtQueryLicenseValue(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD); weak
    WPARAM __cdecl sub_1001405(HINSTANCE hInstance);
    // signed int __userpurge sub_10014DE<eax>(void *a1<ecx>, int a2<ebx>, HWND hWnd, signed int Msg, WPARAM hDrop, unsigned int lParam);
    void __thiscall sub_1001564(void *this);
    // void *__cdecl memset(void *Dst, int Val, size_t Size);
    signed int sub_10015C3(wchar_t *Dest, unsigned int a2, const wchar_t *Format, ...);
    // void __userpurge sub_1001620(int a1<ebp>, void (__stdcall *a2)(_DWORD, _DWORD, _DWORD, _DWORD)<esi>, int a3);
    signed int __stdcall sub_1001664(int a1);
    int __stdcall loc_100169F(int); // weak
    LRESULT __stdcall sub_100170A(unsigned int a1);
    int __stdcall loc_1001799(int); // weak
    LRESULT __stdcall pfnWinEventProc(int a1, int a2, int a3, int a4, int a5, int a6, int a7);
    // signed int __userpurge sub_1001809<eax>(void *a1<ecx>, int a2<ebx>, HWND a3, unsigned __int16 a4, int a5);
    __int32 __cdecl sub_1001963();
    HGLOBAL __cdecl sub_1001A1C();
    // void __userpurge sub_1001A4D(const WCHAR *a1<ebx>, int a2<ebp>, int (__stdcall *a3)(_DWORD, _DWORD, _DWORD, _DWORD)<esi>, int a4);
    // int __usercall sub_1001A72<eax>(int a1<ebp>);
    DWORD __stdcall sub_1001AA5(HWND hWndNewOwner);
    int __stdcall loc_1001C23(HWND hWndNewOwner); // weak
    int __stdcall loc_1001C66(HWND hWndNewOwner); // weak
    int __stdcall sub_1001E66(HINSTANCE hInstance, int, int nCmdShow); // idb
    // _DWORD __usercall sub_10023D0<eax>(_DWORD ebp0<ebp>); weak
    int __stdcall sub_1002409(int nWidth, int); // idb
    // void *__cdecl memcpy(void *Dst, const void *Src, size_t Size);
    int __stdcall sub_1002456(LPCWSTR lpString1); // idb
    signed int __stdcall sub_1002558(int a1, unsigned int a2, int a3);
    int __stdcall sub_10025CB(int a1);
    signed int __stdcall sub_10025EF(WCHAR **a1);
    int __stdcall sub_1002631(WCHAR **a1, int nCmdShow);
    int __stdcall loc_100266D(int, int nCmdShow); // weak
    // signed int __userpurge sub_1002689<eax>(unsigned __int16 *a1<eax>, WCHAR **a2);
    signed int __stdcall sub_10026D5(wchar_t *Dest, unsigned int a2);
    int __thiscall sub_1002733(int this);
    int loc_10027A2(); // weak
    // int __usercall sub_10027F0<eax>(unsigned int a1<eax>, int a2<ecx>);
    // int __userpurge sub_1002820<eax>(int a1<ebp>, int a2, int a3);
    int __stdcall loc_1002B3F(int, int); // weak
    char *__cdecl sub_1002B64(int a1, int a2);
    LPCWSTR __stdcall sub_1002C0D(LPWSTR lpBuffer, LPCWSTR lpFileName, DWORD nBufferLength);
    LONG __thiscall sub_1002F8B(void *this);
    // int __cdecl initterm(_DWORD, _DWORD); weak
    int __cdecl sub_100304B();
    DWORD __cdecl sub_1003053();
    LSTATUS __cdecl sub_10030E2();
    int __stdcall sub_100355B(HKEY hKey, LPCWSTR lpValueName, int); // idb
    __int32 __stdcall sub_10035B0(HKEY Type, LPCWSTR lpValueName, const void *Src, void *Dst, DWORD cbData);
    const WCHAR *__cdecl sub_100360C(LPCWSTR lpsz);
    int __cdecl sub_1003660(unsigned int a1, unsigned int a2);
    // int __usercall start<eax>(int a1<ebp>);
    int dword_1003784(); // weak
    int dword_100378C(); // weak
    int dword_1003790(); // weak
    int dword_100379C(); // weak
    int dword_10037A0(); // weak
    // ATOM __usercall sub_10037EF<ax>(HINSTANCE a1<esi>);
    HLOCAL __stdcall sub_1003881(HINSTANCE hInstance);
    int __stdcall sub_100392D(HINSTANCE hInstance); // idb
    unsigned int __cdecl sub_1003A48();
    signed int __cdecl sub_1003A60(signed int a1);
    // int __userpurge sub_1003A98<eax>(int a1<ebp>, int a2);
    char *__cdecl sub_1003B0C(int a1, int a2);
    int __stdcall sub_1003BCD(int a1, int a2, int a3, int a4);
    int __stdcall sub_1003C46(int a1);
    signed int __stdcall sub_1003C61(int a1, int a2);
    // int __userpurge sub_1003C89<eax>(int a1<ebx>, int a2);
    int __stdcall sub_1003D1B(int a1);
    int __stdcall sub_1003D6D(int, LPCWSTR pszPath, int, int); // idb
    int __stdcall sub_1003E75(int, LPCWSTR pszPath); // idb
    LONG __stdcall sub_1003EA6(int a1);
    // int __userpurge sub_1003F21<eax>(int a1<ebx>, int a2, int a3);
    // double __userpurge sub_1004038<st0>(int a1<eax>, int a2<ebp>, int a3<esi>, double result<st0>, int a5, int a6, int a7);
    signed int __stdcall sub_100405A(int a1, int a2);
    signed int __stdcall sub_1004073(int a1, int a2);
    signed int __stdcall sub_10040C4(int a1, int a2, int a3);
    LONG __stdcall sub_10040FB(int a1);
    int __stdcall sub_1004116(int a1);
    signed int __stdcall sub_100414E(int a1);
    int __cdecl sub_1004194();
    int __stdcall sub_1004240(HWND hDlg, int, int, int); // idb
    int __stdcall loc_1004280(HWND hDlg, int, int, int); // weak
    DWORD __cdecl sub_100432B();
    int __stdcall sub_10043F5(int a1, int a2);
    HRESULT __thiscall sub_100449D(void *this);
    int __stdcall sub_10045A7(int a1);
    // int __stdcall WinSqmAddToStream(_DWORD, _DWORD, _DWORD, _DWORD); weak
    int __stdcall sub_1004628(LPCWSTR lpString); // idb
    LSTATUS __stdcall sub_100478B(HKEY hKey, LPCWSTR lpValueName, LPCWSTR lpData);
    signed int __stdcall sub_10047BA(int a1, int a2, int a3, int a4);
    LSTATUS __stdcall sub_100498E(HKEY hKey, LPCWSTR lpValueName, BYTE Data);
    // void __usercall sub_10056E3(struct _SECURITY_ATTRIBUTES *a1<ebx>, int a2<ebp>, int a3<esi>);
    void __stdcall sub_10058A7(int a1, int a2);
    int __stdcall loc_10058B2(int, int); // weak
    int __stdcall loc_10058BD(int, int); // weak
    int __stdcall loc_10058D7(int, int); // weak
    int __stdcall loc_10058EB(int, int); // weak
    int __stdcall loc_100590F(int, int); // weak
    int __stdcall loc_1005951(int, int); // weak
    int __stdcall loc_1005976(int, int); // weak
    int __stdcall loc_1005A43(int, int); // weak
    int __stdcall loc_1005AC7(int, int); // weak
    int __stdcall loc_1005AEB(int, int); // weak
    int __stdcall loc_1005B5A(int, int); // weak
    int __stdcall loc_1005B65(int, int); // weak
    int __stdcall loc_1005B9C(int, int); // weak
    int __stdcall loc_1005BE2(int, int); // weak
    int __stdcall loc_1005C0C(int, int); // weak
    // void __usercall sub_1005D2A(int a1<ebp>, HWND a2<edi>);
    // int __usercall sub_1006C68<eax>(int a1<ebp>);
    // void __usercall sub_1006C7C(int a1<ebp>);
    int loc_1006C97(); // weak
    signed int __cdecl sub_1006CB4();
    LONG __stdcall sub_1006DC0(int a1);
    LONG __stdcall sub_1006DDA(int a1);
    int __stdcall sub_1006DF4(int a1, int a2, int a3, int a4);
    signed int __stdcall sub_1006E12(int a1, int a2, int a3);
    int __stdcall sub_1006E32(int, LPCWSTR lpFileName); // idb
    int __stdcall sub_1006F5C(int a1, const WCHAR *lpFileName);
    LRESULT __stdcall sub_1006FB9(int a1);
    const WCHAR *__stdcall sub_1007008(LPCWSTR lpsz);
    int __stdcall sub_1007051(HWND hWnd, LPCWSTR lpCaption, LPCWSTR lpText, LPCWSTR lpString, UINT uType); // idb
    __int32 __stdcall sub_10070D3(int a1);
    int __stdcall sub_10071C2(const void *lpv, int iSize);
    int __stdcall sub_100722E(HWND hWndParent, int, HWND hWnd, int); // idb
    signed int __stdcall sub_100739B(DWORD hDlg, int a2, HWND hWnd, int a4);
    signed int __stdcall DialogFunc(HWND hWnd, int a2, unsigned __int16 a3, int a4);
    signed int __stdcall sub_10077F3(int a1);
    signed int __stdcall sub_1007823(int a1, int *a2);
    signed int __stdcall sub_10078D3(int a1, int a2, LPWSTR *a3);
    // signed int __usercall sub_1007985<eax>(int a1<ebp>);
    void __stdcall sub_10079E3(HDROP hDrop, HWND hWnd);
    int __stdcall Proc(int a1, int a2, int a3, int a4);
    // int __userpurge sub_1007A58<eax>(int result<eax>, int a2, int a3, int a4);
    int __stdcall sub_1007A90(HANDLE hFile, UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar); // idb
    LRESULT __cdecl sub_1007B40();
    LRESULT __cdecl sub_1007BA2();
    int __stdcall sub_1007BF6(LPCWSTR lpString); // idb
    // signed int __userpurge sub_1007C80<eax>(int a1<eax>, int a2<edx>, int a3<ecx>, int a4, int a5);
    int __stdcall sub_1007CD7(HWND hWnd, LPCWSTR lpString1, LPCWSTR lpBuffer); // idb
    signed int __stdcall sub_1007F99(int a1, unsigned int a2, int a3);
    signed int __stdcall sub_100800F(int a1);
    int __stdcall sub_10080E4(int lpString, unsigned int a2);
    int __stdcall sub_1008143(int a1, int a2, int a3, int a4, int a5);
    int __stdcall sub_100818F(int a1, int a2, int a3, int a4, int a5);
    signed int __stdcall sub_10081DB(int a1);
    int __stdcall sub_1008383(DWORD hWnd); // idb
    int __stdcall sub_10085E5(int a1, int a2, int a3, int a4);
    size_t __cdecl sub_1008639();
    bool __stdcall proc(int a1, int a2);
    int __stdcall sub_100882E(HDC hdc); // idb
    BOOL __cdecl sub_100888F();
    signed int __cdecl sub_10088B6();
    signed int __cdecl sub_1008987();
    signed int __stdcall sub_1008A63(HWND hWnd, int a2, int a3, int a4);
    signed int __stdcall sub_1008AEF(int a1, int a2, int a3, int a4);
    int *__stdcall sub_1008B3E(int a1);
    int __stdcall sub_1008EF2(HDC hdc, int y); // idb
    signed int __stdcall sub_100900D(HDC a1);
    bool __stdcall sub_10096AE(LCID Locale);
    bool __stdcall sub_10096F8(int a1);
    bool __stdcall sub_100973A(bool a1);
    LRESULT __stdcall sub_100978A(int a1);
    signed int __stdcall sub_10098C7(int a1, int a2);
    BOOL __stdcall sub_100991D(const void *lpv, int iSize);
    // signed int __usercall sub_1009952<eax>(int a1<eax>, int a2<edx>, int a3<edi>);
    int __stdcall sub_1009989(HWND hwnd, int, __int16, int); // idb
    void __stdcall StartAddress(int a1);
    signed int __stdcall sub_1009CDF(int a1, int a2, int a3);
    signed int __stdcall sub_1009D19(int a1, int a2, int a3);
    int __cdecl sub_1009D73(int a1, int a2, int a3, int a4);
    int __stdcall sub_1009D9D(int a1);
    // int __cdecl XcptFilter(_DWORD, _DWORD); weak
    bool __cdecl sub_1009DF0(int a1);
    int __cdecl sub_1009E2A(int a1, unsigned int a2);
    // int __usercall sub_1009E73<eax>(int a1<ebp>);
    // int __cdecl amsg_exit(_DWORD); weak
    // BOOL __usercall sub_1009F07<eax>(char _CF<cf>, char _ZF<zf>, char _SF<sf>, char _OF<of>, int a5<eax>, int a6<edx>, int a7<ecx>, int a8<ebx>, int a9<edi>, int a10<esi>, char a11);
    // int __cdecl except_handler4_common(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD); weak
    // BOOL __stdcall ClosePrinter(HANDLE hPrinter);
    // BOOL __stdcall GetPrinterDriverW(HANDLE hPrinter, LPWSTR pEnvironment, DWORD Level, LPBYTE pDriverInfo, DWORD cbBuf, LPDWORD pcbNeeded);
    // BOOL __stdcall OpenPrinterW(LPWSTR pPrinterName, LPHANDLE phPrinter, LPPRINTER_DEFAULTSW pDefault);
    // int __stdcall WinSqmIncrementDWORD(_DWORD, _DWORD, _DWORD); weak
    // BOOL __stdcall VerQueryValueW(LPCVOID pBlock, LPCWSTR lpSubBlock, LPVOID *lplpBuffer, PUINT puLen);
    // BOOL __stdcall GetFileVersionInfoExW(DWORD dwFlags, LPCWSTR lpwstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData);
    // DWORD __stdcall GetFileVersionInfoSizeExW(DWORD dwFlags, LPCWSTR lpwstrFilename, LPDWORD lpdwHandle);
    
    
    //----- (01001405) --------------------------------------------------------
    WPARAM __cdecl sub_1001405(HINSTANCE hInstance)
    {
      const WCHAR *v1; // edi@1
      int v2; // eax@2
      int v3; // ST18_4@2
      HWINEVENTHOOK v4; // ebx@3
      DWORD v5; // eax@3
      struct tagMSG Msg; // [sp+8h] [bp-1Ch]@1
    
      Msg.hwnd = 0;
      memset(&Msg.message, 0, 0x18u);
      v1 = GetCommandLineW();
      HeapSetInformation(0, HeapEnableTerminationOnCorruption, 0, 0);
      if ( CoInitializeEx(0, 2u) >= 0 )
      {
        v2 = (int)sub_100360C(v1);
        if ( sub_1001E66(hInstance, v2, v3) )
        {
          v5 = GetCurrentProcessId();
          v4 = SetWinEventHook(0x800Bu, 0x800Bu, 0, (WINEVENTPROC)pfnWinEventProc, v5, 0, 0);
          while ( GetMessageW(&Msg, 0, 0, 0) )
          {
            if ( Msg.message == 80 )
              PostMessageW(hWnd, 0x8001u, 0, 0);
            if ( !dword_100CCE8 || !IsDialogMessageW(dword_100CCE8, &Msg) )
            {
              if ( !TranslateAcceleratorW(hWnd, hAccTable, &Msg) )
              {
                TranslateMessage(&Msg);
                DispatchMessageW(&Msg);
              }
            }
          }
          sub_1001A1C();
          if ( v4 )
            UnhookWinEvent(v4);
        }
        else
        {
          Msg.wParam = 0;
        }
        CoUninitialize();
      }
      return Msg.wParam;
    }
    // 1001405: could not find valid save-restore pair for ebx
    
    //----- (010014DE) --------------------------------------------------------
    signed int __userpurge sub_10014DE<eax>(void *a1<ecx>, int a2<ebx>, HWND hWnd, signed int Msg, WPARAM hDrop, unsigned int lParam)
    {
      WPARAM v7; // eax@25
      LPARAM v8; // ecx@25
      WPARAM v9; // eax@29
      LRESULT (__stdcall *v10)(HWND, UINT, WPARAM, LPARAM); // edi@56
      unsigned int v11; // eax@66
      int v12; // ecx@66
      int v13; // edx@66
      HCURSOR (__stdcall *v14)(HCURSOR); // esi@67
      signed int v15; // esi@79
      unsigned int v16; // eax@87
      UINT v17; // [sp-Ch] [bp-14h]@11
      UINT v18; // [sp-Ch] [bp-14h]@33
      const WCHAR *v19; // [sp-Ch] [bp-14h]@59
      WPARAM v20; // [sp-8h] [bp-10h]@11
      WPARAM v21; // [sp-8h] [bp-10h]@33
      const WCHAR *v22; // [sp-8h] [bp-10h]@59
      LPARAM v23; // [sp-4h] [bp-Ch]@10
      LPARAM v24; // [sp-4h] [bp-Ch]@33
      HWND v25; // [sp-4h] [bp-Ch]@36
      UINT v26; // [sp-4h] [bp-Ch]@59
    
      if ( (unsigned int)Msg > 0x1C )
      {
        if ( Msg != 273 )
        {
          if ( Msg == 274 )
          {
            if ( !dword_100CCEC || (v16 = hDrop & 0xFFF0, v16 != 61472) && v16 != 61504 && v16 != 61520 )
              DefWindowProcW(hWnd, 0x112u, hDrop, lParam);
            return 0;
          }
          if ( Msg == 278 )
          {
            sub_1001AA5(hWnd);
            return 0;
          }
          if ( Msg == 279 )
          {
            if ( dword_100CCEC )
            {
              if ( lParam >> 16 )
                EnableMenuItem(hMenu, 0xF020u, 3u);
            }
            return 0;
          }
          if ( Msg == 563 )
          {
            sub_10079E3((HDROP)hDrop, hWnd);
            return 0;
          }
          if ( Msg != 793 )
          {
            if ( Msg != 32769 )
            {
    LABEL_9:
              if ( Msg != dword_100C07C )
              {
                v23 = lParam;
    LABEL_11:
                v20 = hDrop;
                v17 = Msg;
                return DefWindowProcW(hWnd, v17, v20, v23);
              }
              v12 = *(_DWORD *)(lParam + 12);
              v11 = ~(unsigned __int8)*(_DWORD *)(lParam + 12) & 1;
              v13 = (*(_DWORD *)(lParam + 12) >> 2) & 1;
              dword_100D79C = ~(unsigned __int8)*(_DWORD *)(lParam + 12) & 1;
              dword_100D798 = v13;
              if ( v12 & 8 )
              {
                v14 = SetCursor;
                SetCursor(hCursor);
              }
              else
              {
                if ( !(v12 & 0x10) )
                {
                  if ( v12 & 0x20 )
                  {
                    if ( v11 )
                      dword_100D79C = 0;
                    SetCursor(hCursor);
                    SendMessageW(dword_100C028, 177u, 0, 0);
                    if ( !sub_1008639() )
                    {
                      do
                        sub_10070D3(0);
                      while ( sub_10081DB((int)&word_100C9E0) );
                    }
                    SetCursor(dword_100C094);
                    SendMessageW(dword_100C028, 0xB1u, 0, 0);
                    SendMessageW(dword_100C028, 0xB7u, 0, 0);
                    sub_100170A(1u);
                  }
                  else
                  {
                    if ( v12 & 0x40 )
                      dword_100CCE8 = 0;
                  }
                  return 0;
                }
                v14 = SetCursor;
                SetCursor(hCursor);
                sub_10070D3(1);
              }
              sub_10081DB((int)&word_100C9E0);
              v14(dword_100C094);
              return 0;
            }
            v15 = 0;
            if ( ((unsigned int)GetKeyboardLayout(0) & 0x3FF) == 17 )
              v15 = 1;
            v24 = v15;
            v21 = 1;
            v18 = 216;
    LABEL_34:
            SendMessageW(dword_100C028, v18, v21, v24);
            return 0;
          }
          if ( ((lParam >> 16) & 0xFFF) == 5 )
          {
            sub_1001809(a1, a2, hWnd, 0x15u, 0);
            return 0;
          }
        }
        if ( (HWND)lParam != dword_100C028
          || (v9 = hDrop >> 16, (unsigned __int16)(hDrop >> 16) != 1280) && (a1 = (void *)1281, (_WORD)v9 != 1281) )
        {
          if ( !sub_1001809(a1, a2, hWnd, hDrop, lParam) )
          {
            v23 = lParam;
            goto LABEL_11;
          }
          return 0;
        }
        if ( dword_100C030 == 1 )
        {
          dword_100C030 = 2;
          return 0;
        }
        v26 = 4112;
        v22 = szApp;
        v19 = lpText;
    LABEL_60:
        MessageBoxW(::hWnd, v19, v22, v26);
        return 0;
      }
      if ( Msg == 28 )
      {
        if ( hDrop )
        {
          v7 = dword_100C044;
          v8 = ::lParam;
          if ( !dword_100C044 && !::lParam )
            return 0;
          v10 = SendMessageW;
        }
        else
        {
          v10 = SendMessageW;
          SendMessageW(dword_100C028, 176u, (WPARAM)&dword_100C044, (LPARAM)&::lParam);
          v7 = dword_100C044;
          v8 = ::lParam;
          if ( dword_100C044 == ::lParam )
          {
            dword_100C044 = 0;
            ::lParam = 0;
            return 0;
          }
        }
        v10(dword_100C028, 177u, v7, v8);
        v10(dword_100C028, 183u, 0, 0);
        return 0;
      }
      if ( Msg == 2 )
      {
        PostQuitMessage(0);
        return 0;
      }
      if ( Msg == 5 )
      {
        if ( !hDrop )
          goto LABEL_96;
        if ( hDrop == 1 )
        {
          v23 = lParam;
          v20 = 1;
          v17 = 5;
          return DefWindowProcW(hWnd, v17, v20, v23);
        }
        if ( hDrop == 2 )
    LABEL_96:
          sub_1002409((signed __int16)lParam, SHIWORD(lParam));
        return 0;
      }
      if ( Msg == 6 )
      {
        if ( (_WORD)hDrop != 1 && (_WORD)hDrop != 2 || IsIconic(::hWnd) || GetForegroundWindow() != ::hWnd )
          return 0;
        v25 = GetForegroundWindow();
        goto LABEL_37;
      }
      if ( Msg == 7 )
      {
        if ( IsIconic(::hWnd) )
          return 0;
        v25 = dword_100C028;
    LABEL_37:
        SetFocus(v25);
        return 0;
      }
      if ( Msg == 8 )
      {
        v24 = lParam;
        v21 = hDrop;
        v18 = 8;
        goto LABEL_34;
      }
      if ( Msg == 16 )
      {
        sub_1001963();
        if ( sub_1001664(0) )
        {
          DestroyWindow(dword_100C024);
          DestroyWindow(::hWnd);
          DeleteObject(ho);
        }
        return 0;
      }
      if ( Msg != 17 )
        goto LABEL_9;
      if ( dword_100C038 )
      {
        MessageBeep(0);
        MessageBeep(0);
        v26 = 4096;
        v22 = szApp;
        v19 = dword_100C314;
        goto LABEL_60;
      }
      return sub_1001664(1);
    }
    // 100C030: using guessed type int dword_100C030;
    // 100C038: using guessed type int dword_100C038;
    // 100C07C: using guessed type int dword_100C07C;
    // 100CCEC: using guessed type int dword_100CCEC;
    // 100D798: using guessed type int dword_100D798;
    // 100D79C: using guessed type int dword_100D79C;
    
    //----- (01001564) --------------------------------------------------------
    void __thiscall sub_1001564(void *this)
    {
      JUMPOUT((unsigned int)this, dword_100C010, *(unsigned int *)sub_1009F07);
    }
    // 100C010: using guessed type int dword_100C010;
    
    //----- (010015C3) --------------------------------------------------------
    signed int sub_10015C3(wchar_t *Dest, unsigned int a2, const wchar_t *Format, ...)
    {
      signed int result; // eax@1
      int v4; // eax@4
      signed int v5; // ebx@4
      int v6; // esi@4
      va_list va; // [sp+14h] [bp+14h]@1
    
      va_start(va, Format);
      result = 0;
      if ( !a2 || a2 > 0x7FFFFFFF )
        result = -2147024809;
      if ( result >= 0 )
      {
        v6 = a2 - 1;
        v5 = 0;
        v4 = vsnwprintf(Dest, a2 - 1, Format, va);
        if ( v4 < 0 || v4 > (unsigned int)v6 )
        {
          v5 = -2147024774;
        }
        else
        {
          if ( v4 != v6 )
            return v5;
        }
        Dest[v6] = 0;
        return v5;
      }
      return result;
    }
    
    //----- (01001620) --------------------------------------------------------
    void __userpurge sub_1001620(int a1<ebp>, void (__stdcall *a2)(_DWORD, _DWORD, _DWORD, _DWORD)<esi>, int a3)
    {
      sub_10015C3((wchar_t *)(a1 - 260), 0x80u, Format);
      JUMPOUT((unsigned int)dword_100C024, 0, *(unsigned int *)loc_1001799);
      a2(dword_100C024, 1035, 1, a1 - 260);
      JUMPOUT(*(unsigned int *)loc_1001799);
    }
    // 1001799: using guessed type int __stdcall loc_1001799(int);
    
    //----- (01001664) --------------------------------------------------------
    signed int __stdcall sub_1001664(int a1)
    {
      JUMPOUT(dword_100C008, 0, *(unsigned int *)sub_1001A4D);
      JUMPOUT(SendMessageW(dword_100C028, 0xEu, 0, 0), 0, *(unsigned int *)sub_1001A4D);
      return 1;
    }
    // 100C008: using guessed type int dword_100C008;
    
    //----- (0100170A) --------------------------------------------------------
    LRESULT __stdcall sub_100170A(unsigned int a1)
    {
      LRESULT result; // eax@1
      WPARAM v2; // eax@1
      unsigned int v3; // edi@1
      LPARAM lParam; // [sp+Ch] [bp-10Ch]@1
      WPARAM wParam; // [sp+10h] [bp-108h]@1
      unsigned int v6; // [sp+114h] [bp-4h]@1
      int v7; // [sp+118h] [bp+0h]@1
    
      v6 = (unsigned int)&v7 ^ dword_100C010;
      SendMessageW(dword_100C028, 176u, (WPARAM)&wParam, (LPARAM)&lParam);
      v2 = SendMessageW(dword_100C028, 0xC9u, wParam, 0);
      v3 = v2 + 1;
      result = SendMessageW(dword_100C028, 0xBBu, v2, 0);
      JUMPOUT(a1, 0, *(unsigned int *)sub_1001620);
      JUMPOUT(wParam - result + 1, dword_100C01C, *(unsigned int *)sub_1001620);
      JUMPOUT(v3, dword_100C018, *(unsigned int *)sub_1001620);
      dword_100C018 = v3;
      dword_100C01C = wParam - result + 1;
      return result;
    }
    // 100C010: using guessed type int dword_100C010;
    // 100C018: using guessed type int dword_100C018;
    // 100C01C: using guessed type int dword_100C01C;
    
    //----- (010017BB) --------------------------------------------------------
    LRESULT __stdcall pfnWinEventProc(int a1, int a2, int a3, int a4, int a5, int a6, int a7)
    {
      return sub_100170A(0);
    }
    
    //----- (01001809) --------------------------------------------------------
    signed int __userpurge sub_1001809<eax>(void *a1<ecx>, int a2<ebx>, HWND a3, unsigned __int16 a4, int a5)
    {
      int ebp0; // ebp@0
      HMENU v7; // eax@15
      HMENU v8; // ebx@15
      LPARAM v9; // eax@15
      HDC v10; // ebx@20
      int v11; // eax@21
      HFONT v12; // esi@22
      const WCHAR *v13; // eax@30
      int v14; // esi@30
      signed int v15; // eax@31
      int v16; // eax@37
      signed int v17; // esi@37
      DWORD v18; // eax@42
      HANDLE v19; // ebx@68
      HWND v20; // eax@78
      HWND v21; // eax@80
      int v22; // eax@86
      HMENU v23; // eax@92
      HMENU v24; // ebx@92
      HMENU v25; // eax@92
      HMENU v26; // eax@93
      HMENU v27; // eax@93
      signed int v28; // esi@96
      HWND v29; // [sp-10h] [bp-78h]@74
      UINT v30; // [sp-Ch] [bp-74h]@74
      UINT v31; // [sp-8h] [bp-70h]@15
      WPARAM v32; // [sp-8h] [bp-70h]@74
      UINT v33; // [sp-4h] [bp-6Ch]@15
      int v34; // [sp-4h] [bp-6Ch]@34
      LPARAM v35; // [sp-4h] [bp-6Ch]@74
      CHOOSEFONTW v36; // [sp+Ch] [bp-5Ch]@20
      struct tagRECT Rect; // [sp+48h] [bp-20h]@95
      int v38; // [sp+58h] [bp-10h]@30
      HWND hWnd; // [sp+5Ch] [bp-Ch]@1
      LPVOID lpFileName; // [sp+60h] [bp-8h]@30
      unsigned int v41; // [sp+64h] [bp-4h]@1
      int v42; // [sp+68h] [bp+0h]@1
    
      v41 = (unsigned int)&v42 ^ dword_100C010;
      hWnd = a3;
      JUMPOUT(a4, 0x40u, *(unsigned int *)loc_1001C23);
      if ( a4 == 64 )
      {
        sub_100449D(a1);
        return 1;
      }
      if ( (signed int)a4 > 21 )
      {
        if ( (signed int)a4 > 26 )
        {
          if ( a4 == 27 )
          {
            GetClientRect(::hWnd, &Rect);
            if ( *(_DWORD *)&dword_100C02C )
            {
              *(_DWORD *)&dword_100C02C = 0;
              ShowWindow(dword_100C024, 0);
              sub_1002409(Rect.right - Rect.left, Rect.bottom - Rect.top);
              v28 = 1;
            }
            else
            {
              v28 = 1;
              *(_DWORD *)&dword_100C02C = 1;
              sub_1002409(Rect.right - Rect.left, Rect.bottom - Rect.top);
              sub_100170A(1u);
              ShowWindow(dword_100C024, 5);
            }
            dword_100CCF0 = v28;
            return 1;
          }
          if ( a4 != 32 )
          {
            if ( a4 == 33 )
            {
              v36.lStructSize = 0;
              memset(&v36.hwndOwner, 0, 0x38u);
              v10 = GetDC(0);
              if ( v10 )
              {
                v36.lStructSize = 60;
                v36.hwndOwner = hWnd;
                v36.lpLogFont = &lf;
                v11 = GetDeviceCaps(v10, 90);
                lf.lfHeight = -MulDiv(*(int *)&Data, v11, 720);
                v36.Flags = 16777281;
                v36.nFontType = 8192;
                ReleaseDC(0, v10);
                if ( ChooseFontW(&v36) )
                {
                  SetCursor(hCursor);
                  v12 = CreateFontIndirectW(&lf);
                  if ( v12 )
                  {
                    DeleteObject(ho);
                    ho = v12;
                    SendMessageW(dword_100C028, 0x30u, (WPARAM)v12, 1);
                    *(_DWORD *)&Data = v36.iPointSize;
                  }
                  SetCursor(dword_100C094);
                  dword_100C03C = 1;
                }
              }
              return 1;
            }
            return 0;
          }
          v22 = -(wParam != 0);
          if ( sub_1008383((v22 & 0x100000) + 1344274692) )
          {
            dword_100CCF0 = 1;
            wParam = wParam == 0;
          }
          else
          {
            MessageBoxW(::hWnd, dword_100C2EC, szApp, 0x30u);
          }
          if ( !wParam )
          {
            v26 = GetMenu(::hWnd);
            v27 = GetSubMenu(v26, 3);
            EnableMenuItem(v27, 0x1Bu, 0);
            if ( !dword_100D580 )
              return 1;
            v35 = 0;
            v32 = 27;
            v30 = 273;
            v29 = hWnd;
            goto LABEL_75;
          }
          dword_100D580 = *(_DWORD *)&dword_100C02C;
          if ( *(_DWORD *)&dword_100C02C )
            SendMessageW(hWnd, 0x111u, 0x1Bu, 0);
          v23 = GetMenu(::hWnd);
          v24 = v23;
          v25 = GetSubMenu(v23, 3);
          CheckMenuItem(v25, 0x1Bu, 0);
          v33 = 1;
          v31 = 27;
          v7 = GetSubMenu(v24, 3);
        }
        else
        {
          if ( a4 == 26 )
          {
            sub_100978A(0);
            return 1;
          }
          if ( a4 == 22 )
          {
            if ( word_100C9E0 )
            {
              sub_10081DB((int)&word_100C9E0);
              return 1;
            }
    LABEL_84:
            v20 = dword_100CCE8;
            if ( !dword_100CCE8 )
            {
              stru_100C0C0.wReplaceWithLen = 0;
              stru_100C0C0.Flags = 65537;
              stru_100C0C0.lpstrReplaceWith = 0;
              stru_100C0C0.lpstrFindWhat = (LPWSTR)&word_100C9E0;
              stru_100C0C0.wFindWhatLen = 128;
              v21 = FindTextW(&stru_100C0C0);
              goto LABEL_81;
            }
            goto LABEL_79;
          }
          if ( a4 == 23 )
          {
            v20 = dword_100CCE8;
            if ( !dword_100CCE8 )
            {
              stru_100C0C0.Flags = 65552;
              stru_100C0C0.lpstrReplaceWith = (LPWSTR)&unk_100E060;
              stru_100C0C0.wReplaceWithLen = 128;
              stru_100C0C0.lpstrFindWhat = (LPWSTR)&word_100C9E0;
              stru_100C0C0.wFindWhatLen = 128;
              v21 = ReplaceTextW(&stru_100C0C0);
    LABEL_81:
              dword_100CCE8 = v21;
              return 1;
            }
    LABEL_79:
            SetFocus(v20);
            return 1;
          }
          if ( a4 == 24 )
          {
            if ( !DialogBoxParamW(hInstance, (LPCWSTR)0xE, ::hWnd, (DLGPROC)DialogFunc, 0) )
              sub_1006FB9(dword_100E160);
            return 1;
          }
          if ( a4 != 25 )
            return 0;
          v8 = GetMenu(::hWnd);
          v9 = SendMessageW(dword_100C028, 14u, 0, 0);
          SendMessageW(dword_100C028, 0xB1u, 0, v9);
          SendMessageW(dword_100C028, 0xB7u, 0, 0);
          v33 = 1;
          v31 = 25;
          v7 = GetSubMenu(v8, 1);
        }
        EnableMenuItem(v7, v31, v33);
        return 1;
      }
      if ( a4 == 21 )
        goto LABEL_84;
      if ( (signed int)a4 <= 5 )
      {
        if ( a4 == 5 )
        {
          if ( PageSetupDlgW(&stru_100C140) )
          {
    LABEL_72:
            sub_1002558((int)&word_100C740, 0x28u, (int)&word_100C6A0);
            sub_1002558((int)&Dst, 0x28u, (int)&unk_100C6F0);
            dword_100CCF4 = 1;
          }
          else
          {
            while ( 1 )
            {
              v18 = CommDlgExtendedError();
              if ( v18 != 4107 )
              {
                if ( v18 != 4105 && v18 != 4108 )
                  break;
              }
              sub_1001A1C();
              stru_100C140.hDevNames = 0;
              stru_100C140.hDevMode = 0;
              if ( PageSetupDlgW(&stru_100C140) )
                goto LABEL_72;
            }
            sub_100432B();
          }
          return 1;
        }
        if ( a4 == 1 )
        {
          sub_100800F(1);
        }
        else
        {
          if ( a4 == 2 )
          {
            if ( !sub_1001664(0) )
              return 1;
            v38 = dword_100C00C;
            v16 = sub_1003F21(a2, (int)hWnd, (int)&lpFileName);
            v17 = v16;
            if ( v16 >= 0 )
              goto LABEL_101;
            if ( v16 != -2147023673 )
              v17 = sub_1007823((int)hWnd, (int *)&lpFileName);
            if ( v17 >= 0 )
            {
    LABEL_101:
              v19 = hFile;
              hFile = CreateFileW((LPCWSTR)lpFileName, 0x80000000u, 3u, 0, 3u, 0x80u, 0);
              if ( !sub_1002820(ebp0, (int)lpFileName, dword_100C00C) )
              {
                hFile = v19;
                v17 = -2147467259;
              }
              CoTaskMemFree(lpFileName);
              if ( v17 >= 0 )
                return 1;
            }
            dword_100C00C = v38;
            v34 = v17;
          }
          else
          {
            if ( a4 == 3 )
            {
              dword_100E040 = dword_100C00C;
              if ( !dword_100C008 && sub_1007CD7(::hWnd, &FileName, 0) )
                return 1;
            }
            else
            {
              if ( a4 != 4 )
                return 0;
            }
            v14 = (int)L"*.txt";
            v38 = 0;
            lpFileName = 0;
            v13 = L"*.txt";
            if ( !dword_100C008 )
              v13 = &FileName;
            v15 = sub_1003D6D((int)hWnd, v13, (int)&lpFileName, (int)&v38);
            if ( v15 >= 0 )
              goto LABEL_102;
            if ( v15 != -2147023673 )
            {
              if ( !dword_100C008 )
                v14 = (int)&FileName;
              v15 = sub_10078D3((int)hWnd, v14, (LPWSTR *)&lpFileName);
            }
            if ( v15 >= 0 )
            {
    LABEL_102:
              if ( sub_1007CD7(hWnd, (LPCWSTR)lpFileName, (LPCWSTR)1) )
                sub_1002558((int)&FileName, 0x104u, (int)lpFileName);
              if ( v38 )
                (*(void (__stdcall **)(int))(*(_DWORD *)v38 + 8))(v38);
              CoTaskMemFree(lpFileName);
              return 1;
            }
            v34 = v15;
          }
          sub_1003C46(v34);
        }
        return 1;
      }
      JUMPOUT(a4 - 6, 0, *(unsigned int *)loc_1004280);
      if ( a4 == 7 )
        JUMPOUT(*(unsigned int *)loc_1001C66);
      if ( a4 == 15 )
        return 1;
      if ( a4 == 16 )
      {
        v35 = 0;
        v32 = 0;
        v30 = 199;
        v29 = dword_100C028;
    LABEL_75:
        SendMessageW(v29, v30, v32, v35);
        return 1;
      }
      return 0;
    }
    // 1001C23: using guessed type int __stdcall loc_1001C23(HWND hWndNewOwner);
    // 1001C66: using guessed type int __stdcall loc_1001C66(HWND hWndNewOwner);
    // 1004280: using guessed type int __stdcall loc_1004280(HWND hDlg, int, int, int);
    // 100C008: using guessed type int dword_100C008;
    // 100C00C: using guessed type int dword_100C00C;
    // 100C010: using guessed type int dword_100C010;
    // 100C03C: using guessed type int dword_100C03C;
    // 100CCF0: using guessed type int dword_100CCF0;
    // 100CCF4: using guessed type int dword_100CCF4;
    // 100D580: using guessed type int dword_100D580;
    // 100E040: using guessed type int dword_100E040;
    // 100E160: using guessed type int dword_100E160;
    
    //----- (01001963) --------------------------------------------------------
    __int32 __cdecl sub_1001963()
    {
      __int32 result; // eax@1
      char v1; // zf@2
      signed int v2; // ecx@2
      char *v3; // edi@2
      char *v4; // esi@2
      WINDOWPLACEMENT wndpl; // [sp+4h] [bp-34h]@1
      int v6; // [sp+30h] [bp-8h]@1
      HKEY hKey; // [sp+34h] [bp-4h]@11
    
      v6 = 0;
      wndpl.length = 44;
      result = GetWindowPlacement(hWnd, &wndpl);
      if ( result )
      {
        v2 = 4;
        v3 = (char *)&wndpl.rcNormalPosition;
        v4 = (char *)&::wndpl.rcNormalPosition;
        result = 0;
        v1 = 1;
        do
        {
          if ( !v2 )
            break;
          v1 = *(_DWORD *)v4 == *(_DWORD *)v3;
          v4 += 4;
          v3 += 4;
          --v2;
        }
        while ( v1 );
        if ( !v1 )
        {
          v6 = 1;
    LABEL_11:
          result = RegCreateKeyW(HKEY_CURRENT_USER, L"Software\Microsoft\Notepad", &hKey);
          if ( !result )
          {
            if ( dword_100C03C )
            {
              sub_100498E(hKey, L"lfEscapement", LOBYTE(lf.lfEscapement));
              sub_100498E(hKey, L"lfOrientation", LOBYTE(lf.lfOrientation));
              sub_100498E(hKey, L"lfWeight", LOBYTE(lf.lfWeight));
              sub_100498E(hKey, L"lfItalic", lf.lfItalic);
              sub_100498E(hKey, L"lfUnderline", lf.lfUnderline);
              sub_100498E(hKey, L"lfStrikeOut", lf.lfStrikeOut);
              sub_100498E(hKey, L"lfCharSet", lf.lfCharSet);
              sub_100498E(hKey, L"lfOutPrecision", lf.lfOutPrecision);
              sub_100498E(hKey, L"lfClipPrecision", lf.lfClipPrecision);
              sub_100498E(hKey, L"lfQuality", lf.lfQuality);
              sub_100498E(hKey, L"lfPitchAndFamily", lf.lfPitchAndFamily);
              sub_100478B(hKey, L"lfFaceName", lf.lfFaceName);
              sub_100498E(hKey, L"iPointSize", Data);
            }
            if ( dword_100CCF0 )
            {
              sub_100498E(hKey, L"fWrap", wParam);
              sub_100498E(hKey, L"StatusBar", dword_100C02C);
            }
            if ( dword_100CCF4 )
            {
              sub_100478B(hKey, L"szHeader", &word_100C740);
              sub_100478B(hKey, L"szTrailer", (LPCWSTR)&Dst);
              sub_100498E(hKey, L"iMarginTop", LOBYTE(stru_100C140.rtMargin.top));
              sub_100498E(hKey, L"iMarginBottom", LOBYTE(stru_100C140.rtMargin.bottom));
              sub_100498E(hKey, L"iMarginLeft", LOBYTE(stru_100C140.rtMargin.left));
              sub_100498E(hKey, L"iMarginRight", LOBYTE(stru_100C140.rtMargin.right));
            }
            if ( v6 )
            {
              sub_100498E(hKey, L"iWindowPosX", LOBYTE(wndpl.rcNormalPosition.left));
              sub_100498E(hKey, L"iWindowPosY", LOBYTE(wndpl.rcNormalPosition.top));
              sub_100498E(hKey, L"iWindowPosDX", LOBYTE(wndpl.rcNormalPosition.right) - LOBYTE(wndpl.rcNormalPosition.left));
              sub_100498E(hKey, L"iWindowPosDY", LOBYTE(wndpl.rcNormalPosition.bottom) - LOBYTE(wndpl.rcNormalPosition.top));
            }
            result = RegCloseKey(hKey);
          }
          return result;
        }
      }
      if ( dword_100CCF4 || dword_100CCF0 || dword_100C03C )
        goto LABEL_11;
      return result;
    }
    // 100C03C: using guessed type int dword_100C03C;
    // 100CCF0: using guessed type int dword_100CCF0;
    // 100CCF4: using guessed type int dword_100CCF4;
    
    //----- (01001A1C) --------------------------------------------------------
    HGLOBAL __cdecl sub_1001A1C()
    {
      HGLOBAL result; // eax@2
    
      if ( stru_100C140.hDevMode )
        GlobalFree(stru_100C140.hDevMode);
      result = stru_100C140.hDevNames;
      if ( stru_100C140.hDevNames )
        result = GlobalFree(stru_100C140.hDevNames);
      stru_100C140.hDevMode = 0;
      stru_100C140.hDevNames = 0;
      return result;
    }
    
    //----- (01001A4D) --------------------------------------------------------
    void __userpurge sub_1001A4D(const WCHAR *a1<ebx>, int a2<ebp>, int (__stdcall *a3)(_DWORD, _DWORD, _DWORD, _DWORD)<esi>, int a4)
    {
      int v4; // ST10_4@1
      const WCHAR *v5; // eax@3
      const WCHAR *v6; // edi@3
      bool v7; // esi@4
      int v8; // eax@4
      int v9; // eax@8
      signed int v10; // edi@11
      int v11; // eax@13
      const WCHAR *v12; // ST08_4@13
      const WCHAR *v13; // eax@20
    
      if ( a3(dword_100C028, 184, a1, v4) )
      {
        v5 = lpString2;
        v6 = &FileName;
        if ( (const WCHAR *)dword_100C008 == a1 )
          v5 = &FileName;
        v7 = 1;
        dword_100C038 = 1;
        v8 = sub_1004628(v5);
        *(_DWORD *)(a2 - 12) = v8;
        dword_100C038 = (int)a1;
        if ( v8 == 6 )
        {
          if ( (const WCHAR *)dword_100C008 != a1 )
            goto LABEL_28;
          dword_100E040 = dword_100C00C;
          v9 = sub_1007CD7(hWnd, &FileName, a1);
          v7 = v9 == 0;
          if ( !(v9 == 0) )
            goto LABEL_2;
          if ( (const WCHAR *)dword_100C008 != a1 )
    LABEL_28:
            v6 = L"*.txt";
          v10 = SHStrDupW(v6, a2 - 8);
          if ( v10 < (signed int)a1 )
            goto LABEL_24;
          while ( (const WCHAR *)v7 != a1 )
          {
            v12 = *(const WCHAR **)(a2 - 8);
            *(_DWORD *)(a2 - 16) = a1;
            v11 = sub_1003D6D((int)hWnd, v12, a2 - 4, a2 - 16);
            v10 = v11;
            if ( v11 < (signed int)a1 )
            {
              if ( v11 != -2147023673 )
                v10 = sub_10078D3((int)hWnd, *(_DWORD *)(a2 - 8), (LPWSTR *)(a2 - 4));
            }
            CoTaskMemFree(*(LPVOID *)(a2 - 8));
            if ( v10 < (signed int)a1 )
              goto LABEL_24;
            if ( sub_1007CD7(hWnd, *(LPCWSTR *)(a2 - 4), (LPCWSTR)1) )
            {
              sub_1002558((int)&FileName, 0x104u, *(_DWORD *)(a2 - 4));
              dword_100C00C = dword_100E040;
              v7 = 0;
            }
            else
            {
              v10 = SHStrDupW(*(_DWORD *)(a2 - 4), a2 - 8);
            }
            v13 = *(const WCHAR **)(a2 - 16);
            if ( v13 != a1 )
              (*(void (__cdecl **)(_DWORD))(*(_DWORD *)v13 + 8))(*(_DWORD *)(a2 - 16));
            CoTaskMemFree(*(LPVOID *)(a2 - 4));
            if ( v10 < (signed int)a1 )
              break;
          }
          if ( v10 < (signed int)a1 )
          {
    LABEL_24:
            *(_DWORD *)(a2 - 12) = 2;
            if ( v10 == -2147024882 )
              MessageBoxW(hWnd, lpText, szApp, 0x1010u);
          }
        }
      }
    LABEL_2:
      JUMPOUT(*(unsigned int *)loc_100169F);
    }
    // 10013B4: using guessed type int __stdcall SHStrDupW(_DWORD, _DWORD);
    // 100169F: using guessed type int __stdcall loc_100169F(int);
    // 100C008: using guessed type int dword_100C008;
    // 100C00C: using guessed type int dword_100C00C;
    // 100C038: using guessed type int dword_100C038;
    // 100E040: using guessed type int dword_100E040;
    
    //----- (01001A72) --------------------------------------------------------
    int __usercall sub_1001A72<eax>(int a1<ebp>)
    {
      sub_1001564((void *)(a1 ^ *(_DWORD *)(a1 - 28)));
      return sub_10023D0(a1);
    }
    // 10023D0: using guessed type _DWORD __usercall sub_10023D0<eax>(_DWORD ebp0<ebp>);
    
    //----- (01001AA5) --------------------------------------------------------
    DWORD __stdcall sub_1001AA5(HWND hWndNewOwner)
    {
      int v1; // eax@1
      HMENU v2; // ebx@1
      bool v3; // ST0C_4@1
      HMENU v4; // eax@1
      UINT v5; // ST0C_4@1
      HMENU v6; // eax@1
      UINT v7; // ST0C_4@1
      HMENU v8; // eax@1
      HMENU v9; // eax@1
      bool v10; // ST0C_4@4
      HMENU v11; // eax@4
      UINT v13; // ST0C_4@6
      HMENU v14; // eax@6
      UINT v15; // ST0C_4@6
      HMENU v16; // eax@6
      bool v17; // ST0C_4@6
      HMENU v18; // eax@6
      bool v19; // ST0C_4@6
      HMENU v20; // eax@6
      UINT v21; // ST0C_4@6
      HMENU v22; // eax@6
      UINT v23; // ST0C_4@6
      HMENU v24; // eax@6
      HMENU v25; // eax@8
      LPARAM lParam; // [sp+Ch] [bp-10h]@1
      WPARAM wParam; // [sp+10h] [bp-Ch]@1
      int v28; // [sp+14h] [bp-8h]@1
      UINT uEnable; // [sp+18h] [bp-4h]@1
    
      v28 = 0;
      v2 = GetMenu(hWnd);
      SendMessageW(dword_100C028, 0xB0u, (WPARAM)&wParam, (LPARAM)&lParam);
      v3 = wParam == lParam;
      uEnable = wParam == lParam;
      v4 = GetSubMenu(v2, 1);
      EnableMenuItem(v4, 768u, v3);
      v5 = uEnable;
      v6 = GetSubMenu(v2, 1);
      EnableMenuItem(v6, 0x301u, v5);
      v7 = uEnable;
      v8 = GetSubMenu(v2, 1);
      EnableMenuItem(v8, 0x303u, v7);
      v9 = GetSubMenu(v2, 1);
      v1 = GetMenuState(v9, 0x19u, 0);
      if ( v1 == 1 )
      {
        if ( uEnable == 1 )
        {
          v25 = GetSubMenu(v2, v1);
          EnableMenuItem(v25, 0x19u, 0);
        }
      }
      if ( OpenClipboard(hWndNewOwner) )
      {
        v28 = IsClipboardFormatAvailable(1u);
        CloseClipboard();
      }
      v10 = v28 == 0;
      v11 = GetSubMenu(v2, 1);
      EnableMenuItem(v11, 0x302u, v10);
      uEnable = 1;
      if ( SendMessageW(dword_100C028, 0xEu, 0, 0) )
        uEnable = 0;
      v13 = uEnable;
      v14 = GetSubMenu(v2, 1);
      EnableMenuItem(v14, 0x15u, v13);
      v15 = uEnable;
      v16 = GetSubMenu(v2, 1);
      EnableMenuItem(v16, 0x16u, v15);
      v17 = ::wParam != 0;
      v18 = GetSubMenu(v2, 1);
      EnableMenuItem(v18, 0x18u, v17);
      v19 = SendMessageW(dword_100C028, 0xC6u, 0, 0) == 0;
      v20 = GetSubMenu(v2, 1);
      EnableMenuItem(v20, 0x10u, v19);
      v21 = ::wParam != 0 ? 8 : 0;
      v22 = GetSubMenu(v2, 2);
      CheckMenuItem(v22, 32u, v21);
      v23 = *(_DWORD *)&dword_100C02C != 0 ? 8 : 0;
      v24 = GetSubMenu(v2, 3);
      return CheckMenuItem(v24, 0x1Bu, v23);
    }
    
    //----- (01001E66) --------------------------------------------------------
    signed int __stdcall sub_1001E66(HINSTANCE hInstance, int a2, int nCmdShow)
    {
      int ebp0; // ebp@0
      HACCEL v4; // eax@5
      HWND v5; // esi@7
      void *v6; // ecx@7
      int v7; // eax@16
      int v8; // edi@17
      int v9; // eax@17
      signed int v10; // eax@20
      int v11; // ecx@23
      HMENU v13; // eax@32
      HMENU v14; // eax@32
      int v15; // eax@41
      int Dst; // [sp+Ch] [bp-A8h]@10
      int v17; // [sp+28h] [bp-8Ch]@11
      int v18; // [sp+2Ch] [bp-88h]@11
      int v19; // [sp+30h] [bp-84h]@11
      int v20; // [sp+34h] [bp-80h]@11
      struct tagRECT Rect; // [sp+38h] [bp-7Ch]@13
      int v22; // [sp+48h] [bp-6Ch]@15
      int v23; // [sp+4Ch] [bp-68h]@15
      int v24; // [sp+50h] [bp-64h]@15
      int v25; // [sp+54h] [bp-60h]@15
      LPARAM lParam; // [sp+58h] [bp-5Ch]@15
      int v27; // [sp+5Ch] [bp-58h]@15
      HINSTANCE v28; // [sp+60h] [bp-54h]@1
      __int32 v29; // [sp+64h] [bp-50h]@1
      HGDIOBJ wParam; // [sp+68h] [bp-4Ch]@16
      HDC hdc; // [sp+6Ch] [bp-48h]@3
      WCHAR String1; // [sp+70h] [bp-44h]@16
      unsigned int v33; // [sp+B0h] [bp-4h]@1
      int v34; // [sp+B4h] [bp+0h]@1
    
      v33 = (unsigned int)&v34 ^ dword_100C010;
      v28 = hInstance;
      v29 = a2;
      dword_100C07C = RegisterWindowMessageW(L"commdlg_FindReplace");
      if ( !dword_100C07C )
        return 0;
      dword_100C078 = RegisterWindowMessageW(L"commdlg_help");
      if ( !dword_100C078 )
        return 0;
      hdc = GetDC(0);
      if ( !hdc )
        return 0;
      if ( !sub_1003881(hInstance) )
        return 0;
      dword_100C094 = LoadCursorW(0, (LPCWSTR)32513);
      hCursor = LoadCursorW(0, (LPCWSTR)0x7F02);
      v4 = LoadAcceleratorsW(hInstance, L"MainAcc");
      hAccTable = v4;
      if ( !hCursor )
        return 0;
      if ( !v4 )
        return 0;
      sub_10037EF(hInstance);
      ::hInstance = hInstance;
      stru_100C140.lStructSize = 84;
      stru_100C140.hDevMode = 0;
      stru_100C140.hDevNames = 0;
      stru_100C140.hInstance = hInstance;
      sub_1002F8B(v6);
      sub_10030E2();
      v5 = CreateWindowExW(0, L"Notepad", &szOtherStuff, 0xCF0000u, X, Y, nWidth, nHeight, 0, 0, hInstance, 0);
      hWnd = v5;
      stru_100C140.hwndOwner = v5;
      if ( !v5 )
        return 0;
      if ( Y != -2147483648 )
      {
        if ( X != -2147483648 )
        {
          memset(&Dst, 0, 0x2Cu);
          Dst = 44;
          if ( GetWindowPlacement(v5, (WINDOWPLACEMENT *)&Dst) )
          {
            memset(&wndpl, 0, 0x2Cu);
            wndpl.rcNormalPosition.left = X;
            wndpl.length = 44;
            wndpl.rcNormalPosition.right = v19 + X - v17;
            wndpl.rcNormalPosition.top = Y;
            wndpl.rcNormalPosition.bottom = v20 + Y - v18;
          }
          SetWindowPlacement(hWnd, &wndpl);
          v5 = hWnd;
        }
      }
      DragAcceptFiles(v5, 1);
      GetClientRect(hWnd, &Rect);
      dword_100C028 = CreateWindowExW(
                        0x200u,
                        L"Edit",
                        &szOtherStuff,
                        ::wParam != 0 ? 1344274692 : 1345323268,
                        0,
                        0,
                        Rect.right,
                        Rect.bottom - 100,
                        hWnd,
                        (HMENU)0xF,
                        v28,
                        0);
      if ( !dword_100C028
        || (dword_100C024 = CreateStatusWindowW(
                              (*(_DWORD *)&dword_100C02C != 0 ? 0x10000000 : 0) | 0x44800000,
                              &szOtherStuff,
                              hWnd,
                              0x401u),
            !dword_100C024) )
        return 0;
      sub_100170A(1u);
      GetClientRect(dword_100C024, (LPRECT)&v22);
      dword_100C084 = v25 - v23;
      v27 = -1;
      lParam = 3 * (v24 - v22) / 4;
      SendMessageW(dword_100C024, 1028u, 2u, (LPARAM)&lParam);
      SendMessageW(dword_100C028, 0xC8u, ::wParam, 0);
      if ( ::wParam )
      {
        v13 = GetMenu(hWnd);
        v14 = GetSubMenu(v13, 3);
        EnableMenuItem(v14, 0x1Bu, 1u);
      }
      v7 = GetDeviceCaps(hdc, 90);
      lf.lfHeight = -MulDiv(*(int *)&Data, v7, 720);
      ho = CreateFontIndirectW(&lf);
      wParam = SelectObject(hdc, ho);
      GetTextFaceW(hdc, 32, &String1);
      SelectObject(hdc, wParam);
      if ( lstrcmpiW(&String1, lf.lfFaceName) )
      {
        EnumFontsW(hdc, lf.lfFaceName, (FONTENUMPROCW)Proc, (LPARAM)&lf);
        DeleteObject(ho);
        ho = CreateFontIndirectW(&lf);
      }
      SendMessageW(dword_100C028, 0x30u, (WPARAM)ho, 0);
      ReleaseDC(0, hdc);
      word_100C9E0 = 0;
      hMem = (HLOCAL)SendMessageW(dword_100C028, 0xBDu, 0, 0);
      SendMessageW(dword_100C028, 0xC5u, 0, 0);
      sub_1002456(lpString2);
      ShowWindow(hWnd, nCmdShow);
      SetCursor(dword_100C094);
      v9 = sub_10025CB(v29);
      dword_100C05C = -1;
      v8 = v9;
      if ( !sub_1002689(L"/A", (WCHAR **)v9) )
      {
        dword_100C05C = 0;
    LABEL_36:
        v8 = sub_10025CB(v8 + 4);
        goto LABEL_20;
      }
      if ( !sub_1002689(L"/W", (WCHAR **)v8) )
        dword_100C05C = 1;
      if ( dword_100C05C != -1 )
        goto LABEL_36;
    LABEL_20:
      v10 = sub_10025EF((WCHAR **)v8);
      if ( v10 )
      {
        if ( v10 != 2 )
          goto LABEL_23;
      }
      else
      {
        if ( sub_1002631((WCHAR **)v8, nCmdShow) )
        {
          PostMessageW(hWnd, 0x10u, 0, 0);
          return 1;
        }
        if ( !*(_WORD *)v8 )
        {
    LABEL_23:
          sub_10026D5(&Dest, 0x50u);
          sub_10026D5(&word_100C7E0, 0x50u);
          memset(&stru_100C1A0, 0, 0x58u);
          stru_100C1A0.hInstance = v28;
          stru_100C1A0.lStructSize = 88;
          memset(&stru_100C0C0, 0, sizeof(stru_100C0C0));
          stru_100C1A0.hwndOwner = hWnd;
          stru_100C1A0.nMaxFile = 260;
          stru_100C0C0.lStructSize = 40;
          stru_100C0C0.hwndOwner = stru_100C1A0.hwndOwner;
          SendMessageW(dword_100C028, 0xB0u, (WPARAM)&wParam, (LPARAM)&v29);
          SendMessageW(dword_100C028, 0xB1u, (WPARAM)wParam, v29);
          SendMessageW(dword_100C028, 0xB7u, 0, 0);
          if ( ((unsigned int)GetKeyboardLayout(0) & 0x3FF) == 17 )
            SendMessageW(dword_100C028, 0xD8u, 1u, 1);
          sub_1002733(v11);
          return 1;
        }
        sub_1002C0D((LPWSTR)&FileName, (LPCWSTR)v8, 0x104u);
        hFile = CreateFileW(&FileName, 0x80000000u, 3u, 0, 3u, 0x80u, 0);
        if ( hFile != (HANDLE)-1 )
        {
    LABEL_28:
          sub_1002820(ebp0, (int)&FileName, dword_100C05C);
          goto LABEL_23;
        }
        if ( GetLastError() != 2 )
        {
          sub_1007BF6(&FileName);
          sub_1002456(lpString2);
          sub_1002558((int)&FileName, 0x104u, (int)lpString2);
          goto LABEL_30;
        }
        v15 = sub_1007051(hWnd, szApp, dword_100C2B4, &FileName, 0x33u);
        if ( v15 != 2 )
        {
          if ( v15 == 6 )
            hFile = CreateFileW(&FileName, 0xC0000000u, 3u, 0, 4u, 0x80u, 0);
    LABEL_30:
          if ( hFile == (HANDLE)-1 )
            goto LABEL_23;
          goto LABEL_28;
        }
      }
      return 0;
    }
    // 100236C: using guessed type wchar_t aW[3];
    // 1002374: using guessed type wchar_t aA[3];
    // 100C010: using guessed type int dword_100C010;
    // 100C05C: using guessed type int dword_100C05C;
    // 100C078: using guessed type int dword_100C078;
    // 100C07C: using guessed type int dword_100C07C;
    // 100C084: using guessed type int dword_100C084;
    
    //----- (010023D0) --------------------------------------------------------
    #error "10023DB: positive sp value has been found (funcsize=3)"
    
    //----- (01002409) --------------------------------------------------------
    BOOL __stdcall sub_1002409(int nWidth, int a2)
    {
      int v2; // eax@1
      LPARAM lParam; // [sp+0h] [bp-8h]@3
      int v5; // [sp+4h] [bp-4h]@3
    
      v2 = *(_DWORD *)&dword_100C02C;
      if ( *(_DWORD *)&dword_100C02C )
      {
        v5 = -1;
        lParam = 3 * nWidth / 4;
        SendMessageW(dword_100C024, 1028u, 2u, (LPARAM)&lParam);
        SendMessageW(dword_100C024, 5u, 0, 0);
        v2 = *(_DWORD *)&dword_100C02C;
      }
      return MoveWindow(dword_100C028, 0, 0, nWidth, a2 - (v2 != 0 ? dword_100C084 : 0), 1);
    }
    // 100C084: using guessed type int dword_100C084;
    
    //----- (01002456) --------------------------------------------------------
    BOOL __stdcall sub_1002456(LPCWSTR lpString1)
    {
      WCHAR *v1; // eax@5
      char v2; // zf@5
      HANDLE v4; // edi@7
      va_list Arguments; // [sp+4h] [bp-7CCh]@5
      struct _WIN32_FIND_DATAW FindFileData; // [sp+8h] [bp-7C8h]@7
      WCHAR String; // [sp+258h] [bp-578h]@5
      WCHAR Buf; // [sp+4C4h] [bp-30Ch]@2
      wchar_t Dest[128]; // [sp+6CCh] [bp-104h]@1
      unsigned int v10; // [sp+7CCh] [bp-4h]@1
      int v11; // [sp+7D0h] [bp+0h]@1
    
      v10 = (unsigned int)&v11 ^ dword_100C010;
      Dest[0] = 0;
      memset(&Dest[1], 0, 0xFEu);
      if ( lstrcmpW(lpString1, lpString2) )
      {
        v4 = FindFirstFileW(lpString1, &FindFileData);
        if ( v4 == (HANDLE)-1 )
        {
          GetFileTitleW(lpString1, &Buf, 0x104u);
        }
        else
        {
          GetFileTitleW(FindFileData.cFileName, &Buf, 0x104u);
          FindClose(v4);
        }
      }
      else
      {
        sub_1002558((int)&Buf, 0x104u, (int)lpString2);
      }
      sub_10015C3(Dest, 0x80u, Format, 1, 1);
      if ( dword_100C024 )
        SendMessageW(dword_100C024, 0x40Bu, 1u, (LPARAM)Dest);
      Arguments = (va_list)&Buf;
      v2 = FormatMessageW(0x2400u, lpSource, 0, 0, &String, 0x136u, &Arguments) == 0;
      v1 = &String;
      if ( v2 )
        v1 = &Buf;
      return SetWindowTextW(hWnd, v1);
    }
    // 100C010: using guessed type int dword_100C010;
    
    //----- (01002558) --------------------------------------------------------
    signed int __stdcall sub_1002558(int a1, unsigned int a2, int a3)
    {
      signed int result; // eax@1
      int v4; // eax@4
      signed int v5; // ebx@4
      unsigned int v6; // esi@4
      __int16 v7; // cx@6
    
      result = 0;
      if ( !a2 || a2 > 0x7FFFFFFF )
        result = -2147024809;
      if ( result >= 0 )
      {
        v4 = a1;
        v5 = 0;
        v6 = a2;
        if ( !a2 )
          goto LABEL_15;
        do
        {
          if ( !(2147483646 - a2 + v6) )
            break;
          v7 = *(_WORD *)(a3 - a1 + v4);
          if ( !v7 )
            break;
          *(_WORD *)v4 = v7;
          v4 += 2;
          --v6;
        }
        while ( v6 );
        if ( !v6 )
        {
    LABEL_15:
          v4 -= 2;
          v5 = -2147024774;
        }
        *(_WORD *)v4 = 0;
        result = v5;
      }
      return result;
    }
    
    //----- (010025CB) --------------------------------------------------------
    int __stdcall sub_10025CB(int a1)
    {
      int result; // eax@1
    
      for ( result = a1; *(_WORD *)result == 32 || *(_WORD *)result == 9; result += 2 )
        ;
      return result;
    }
    
    //----- (010025EF) --------------------------------------------------------
    signed int __stdcall sub_10025EF(WCHAR **a1)
    {
      int ebp0; // ebp@0
      signed int result; // eax@2
      const WCHAR *v3; // eax@4
      DWORD v4; // eax@6
      int v5; // eax@7
      const WCHAR *v6; // [sp-Ch] [bp-1Ch]@9
      int v7; // [sp+Ch] [bp-4h]@1
    
      v7 = 0;
      if ( sub_1002689(L"/.SETUP", a1) )
        return 0;
      dword_100CCEC = 1;
      hMenu = GetSystemMenu(hWnd, 0);
      hAccTable = LoadAcceleratorsW(hInstance, L"SlipUpAcc");
      SetWindowLongW(hWnd, -16, 16580608);
      v3 = (const WCHAR *)sub_10025CB((int)((char *)a1 + 14));
      if ( !*v3 )
        goto LABEL_20;
      sub_1002C0D((LPWSTR)&FileName, v3, 0x104u);
      hFile = CreateFileW(&FileName, -2147483648u, 3u, 0, 3u, 128u, 0);
      if ( hFile == (HANDLE)-1 )
      {
        v4 = GetLastError() - 2;
        if ( v4 )
        {
          v5 = v4 - 3;
          if ( v5 )
            v6 = (const WCHAR *)(v5 == 118 ? dword_100C2E0 : dword_100C2B0);
          else
            v6 = dword_100C31C;
          v7 = sub_1007051(hWnd, szApp, v6, &FileName, 0x31u);
        }
        else
        {
          v7 = sub_1007051(hWnd, szApp, dword_100C2B4, &FileName, 0x33u);
          if ( v7 == 6 )
            hFile = CreateFileW(&FileName, 0xC0000000u, 3u, 0, 4u, 0x80u, 0);
        }
        if ( hFile == (HANDLE)-1 )
          return 0;
      }
      sub_1002820(ebp0, (int)&FileName, dword_100C05C);
      result = 2;
      if ( v7 != 2 )
    LABEL_20:
        result = 6;
      return result;
    }
    // 100261C: using guessed type wchar_t a_setup[8];
    // 100C05C: using guessed type int dword_100C05C;
    // 100C2E0: using guessed type int dword_100C2E0;
    // 100CCEC: using guessed type int dword_100CCEC;
    
    //----- (01002631) --------------------------------------------------------
    int __stdcall sub_1002631(WCHAR **a1, int nCmdShow)
    {
      int v3; // eax@4
      const WCHAR *v4; // esi@6
      int v5; // eax@7
      int v6; // eax@8
      int v7; // eax@9
      unsigned int v8; // edx@9
      WCHAR v9; // cx@13
      unsigned int v10; // [sp+8h] [bp-4h]@1
    
      v10 = 1;
      if ( sub_1002689(L"/PT", a1) )
      {
        if ( sub_1002689(L"/P", a1) )
          return 0;
        v3 = sub_10025CB((int)(a1 + 1));
      }
      else
      {
        v3 = sub_10025CB((int)((char *)a1 + 6));
        v10 = 0;
      }
      v4 = (const WCHAR *)v3;
      if ( *(_WORD *)v3 )
      {
        ShowWindow(hWnd, nCmdShow);
        v5 = (int)(sub_1002C0D((LPWSTR)&FileName, v4, 0x104u) + 1);
        JUMPOUT(v10, 0, *(unsigned int *)sub_10056E3);
        if ( *(_WORD *)v5 )
        {
          v6 = sub_10025CB(v5);
          if ( *(_WORD *)v6 == 34 )
          {
            v7 = v6 + 2;
            v8 = 0;
            while ( 1 )
            {
              v9 = *(_WORD *)v7;
              if ( !*(_WORD *)v7 )
                break;
              if ( v9 == 34 || v8 >= 0xFF )
                break;
              *(&pPrinterName + v8++) = v9;
              v7 += 2;
            }
            *(&pPrinterName + v8) = 0;
            JUMPOUT(*(int *)sub_10056E3);
          }
        }
      }
      return 0;
    }
    // 1002674: using guessed type wchar_t aP[3];
    // 100267C: using guessed type wchar_t aPt[4];
    
    //----- (01002689) --------------------------------------------------------
    signed int __userpurge sub_1002689<eax>(unsigned __int16 *a1<eax>, WCHAR **a2)
    {
      unsigned __int16 v2; // ax@1
      unsigned __int16 *v3; // ebx@1
      __int16 v4; // di@2
      WCHAR *v5; // eax@2
      signed int result; // eax@3
    
      v3 = a1;
      v2 = *a1;
      if ( v2 )
      {
        while ( 1 )
        {
          v4 = (unsigned int)CharUpperW((LPWSTR)v2);
          v5 = (WCHAR *)*(_WORD *)a2;
          a2 = (WCHAR **)((char *)a2 + 2);
          ++v3;
          if ( v4 != (unsigned __int16)CharUpperW(v5) )
            break;
          v2 = *v3;
          if ( !*v3 )
            goto LABEL_5;
        }
        result = 1;
      }
      else
      {
    LABEL_5:
        result = 0;
      }
      return result;
    }
    
    //----- (010026D5) --------------------------------------------------------
    signed int __stdcall sub_10026D5(wchar_t *Dest, unsigned int a2)
    {
      return sub_10015C3(Dest, a2, L"%s%c*.txt%c%s%c*.*%c", *(_DWORD *)Args, 0, 0, dword_100C308, 0, 0);
    }
    // 100C308: using guessed type int dword_100C308;
    
    //----- (01002733) --------------------------------------------------------
    int __thiscall sub_1002733(int this)
    {
      int result; // eax@1
      char v2; // [sp+0h] [bp-1304h]@1
      char v3; // [sp+60h] [bp-12A4h]@1
      unsigned int v4; // [sp+6Ch] [bp-1298h]@1
      unsigned int v5; // [sp+70h] [bp-1294h]@1
    
      sub_10027F0(0x1320u, this);
      RtlInitUnicodeString(&v2, L"Security-SPP-GenuineLocalStatus");
      result = NtQueryLicenseValue(&v2, &v5, &v4, 4, &v3);
      if ( result >= 0 )
      {
        JUMPOUT(v5, 4u, *(unsigned int *)sub_1005D2A);
        JUMPOUT(v4, 0, *(unsigned int *)sub_1005D2A);
      }
      return result;
    }
    // 10013E0: using guessed type int __stdcall RtlInitUnicodeString(_DWORD, _DWORD);
    // 10013E4: using guessed type int __stdcall NtQueryLicenseValue(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
    // 10027B0: using guessed type wchar_t aSecuritySppGen[32];
    
    //----- (010027F0) --------------------------------------------------------
    int __usercall sub_10027F0<eax>(unsigned int a1<eax>, int a2<ecx>)
    {
      unsigned int i; // eax@1
      int v3; // ecx@1
      int v5; // [sp-4h] [bp-4h]@1
      void *v6; // [sp+0h] [bp+0h]@1
      int v7; // [sp+0h] [bp+0h]@4
    
      v5 = a2;
      v3 = (unsigned int)&v6 >= a1 ? (int)((char *)&v6 - a1) : 0;
      for ( i = (unsigned int)&v5 & 0xFFFFF000; v3 < i; i -= 4096 )
        ;
      return v7;
    }
    
    //----- (01002820) --------------------------------------------------------
    int __userpurge sub_1002820<eax>(int a1<ebp>, int a2, int a3)
    {
      HANDLE v3; // eax@1
      unsigned int v4; // ebx@1
      unsigned int v5; // edi@1
      unsigned int v6; // eax@1
      int v7; // esi@3
      unsigned int v8; // eax@3
      HLOCAL v9; // eax@3
      void *v10; // eax@3
      unsigned __int16 *v11; // eax@5
      unsigned __int16 *v12; // ecx@6
      int v13; // edx@7
      void *v15; // ebx@10
      int v16; // eax@10
    
      sub_1002B64((int)dword_1002B48, 636);
      *(_DWORD *)(a1 - 568) = *(_DWORD *)(a1 + 8);
      *(_DWORD *)(a1 - 596) = 0;
      *(_DWORD *)(a1 - 580) = 0;
      *(_DWORD *)(a1 - 564) = 0;
      *(_DWORD *)(a1 - 592) = 0;
      *(_DWORD *)(a1 - 560) = 0;
      JUMPOUT((unsigned int)hFile, 0xFFFFFFFFu, *(unsigned int *)sub_10058A7);
      v6 = GetFileInformationByHandle(hFile, (LPBY_HANDLE_FILE_INFORMATION)(a1 - 652));
      v5 = *(_DWORD *)(a1 - 616);
      *(_DWORD *)(a1 - 584) = v5;
      JUMPOUT(v6, 0, *(unsigned int *)loc_10058B2);
      JUMPOUT(v5, 0x40000000u, *(unsigned int *)loc_1005C0C);
      JUMPOUT(*(_DWORD *)(a1 - 620), 0, *(unsigned int *)loc_1005C0C);
      SetCursor(hCursor);
      JUMPOUT(v5, 0, *(unsigned int *)loc_10058BD);
      v4 = 0;
      *(_DWORD *)(a1 - 576) = 0;
      v3 = CreateFileMappingW(hFile, 0, 2u, 0, v5, 0);
      *(_DWORD *)(a1 - 600) = v3;
      if ( v3 )
      {
        v4 = (unsigned int)MapViewOfFile(v3, 4u, 0, 0, v5);
        *(_DWORD *)(a1 - 576) = v4;
        CloseHandle(*(HANDLE *)(a1 - 600));
      }
      CloseHandle(hFile);
      hFile = (HANDLE)-1;
      JUMPOUT(v4, 0, *(unsigned int *)loc_10058D7);
      *(_DWORD *)(a1 - 4) = 0;
      *(_DWORD *)(a1 - 572) = v4;
      JUMPOUT(*(_DWORD *)(a1 + 12), 0xFFFFFFFFu, *(unsigned int *)loc_1005A43);
      v8 = *(_WORD *)v4;
      JUMPOUT(v8, 0xBBEFu, *(unsigned int *)loc_100590F);
      JUMPOUT(v8, 0xFEFFu, *(unsigned int *)loc_10058EB);
      *(_DWORD *)(a1 - 564) = 1;
      *(_DWORD *)(a1 - 556) = 1;
      v7 = (v5 >> 1) - 1;
      *(_DWORD *)(a1 - 552) = v7;
      JUMPOUT(*(_DWORD *)(a1 - 564), 0, *(unsigned int *)loc_1005951);
      SendMessageW(dword_100C028, 11u, 0, 0);
      SendMessageW(dword_100C028, 0xB1u, 0, 0);
      SendMessageW(dword_100C028, 0xB7u, 0, 0);
      v9 = LocalReAlloc(hMem, 2 * v7 + 2, 2u);
      *(_DWORD *)(a1 - 592) = v9;
      JUMPOUT((unsigned int)v9, 0, *(unsigned int *)loc_1005976);
      v10 = LocalLock(v9);
      *(_DWORD *)(a1 - 596) = v10;
      JUMPOUT(*(_DWORD *)(a1 - 564), 0, *(unsigned int *)loc_1005AEB);
      JUMPOUT(*(_WORD *)v4, 0xFEFFu, *(unsigned int *)loc_1005AC7);
      memcpy(v10, (const void *)(v4 + 2), 2 * v7);
      dword_100C00C = *(_DWORD *)(a1 - 556);
      *(_DWORD *)(a1 - 4) = -2;
      if ( v4 != a1 - 588 )
        UnmapViewOfFile((LPCVOID)v4);
      v11 = *(unsigned __int16 **)(a1 - 596);
      if ( v11 )
      {
        v12 = *(unsigned __int16 **)(a1 - 596);
        if ( v5 >> 1 != 1 )
        {
          v13 = (v5 >> 1) - 1;
          do
          {
            JUMPOUT(*v12, 0, *(unsigned int *)loc_1005B5A);
            ++v12;
            --v13;
          }
          while ( v13 );
        }
        v11[v7] = 0;
        JUMPOUT(*v11, 0x2Eu, *(unsigned int *)loc_1005B65);
        *(_DWORD *)(a1 - 580) = 0;
      }
      v15 = *(void **)(a1 - 592);
      LocalUnlock(*(HLOCAL *)(a1 - 592));
      hMem = v15;
      sub_1002558((int)&FileName, 0x104u, *(_DWORD *)(a1 - 568));
      sub_1002456(*(LPCWSTR *)(a1 - 568));
      dword_100C008 = 0;
      dword_100C030 = 1;
      SendMessageW(dword_100C028, 0xBCu, (WPARAM)hMem, 0);
      JUMPOUT(dword_100C030, 2u, *(unsigned int *)loc_1005B9C);
      dword_100C030 = 0;
      PostMessageW(dword_100C028, 0xC5u, 0, 0);
      JUMPOUT(*(_DWORD *)(a1 - 580), 0, *(unsigned int *)loc_1005BE2);
      v16 = SendMessageW(dword_100C028, 0x115u, 0xBEu, 0);
      SetScrollPos(hWnd, 1, v16, 1);
      SendMessageW(dword_100C028, 0xBu, 1u, 0);
      InvalidateRect(dword_100C028, 0, 1);
      UpdateWindow(dword_100C028);
      SetCursor(dword_100C094);
      return sub_1001A72(a1);
    }
    // 1002B48: using guessed type int dword_1002B48[2];
    // 10058B2: using guessed type int __stdcall loc_10058B2(int, int);
    // 10058BD: using guessed type int __stdcall loc_10058BD(int, int);
    // 10058D7: using guessed type int __stdcall loc_10058D7(int, int);
    // 10058EB: using guessed type int __stdcall loc_10058EB(int, int);
    // 100590F: using guessed type int __stdcall loc_100590F(int, int);
    // 1005951: using guessed type int __stdcall loc_1005951(int, int);
    // 1005976: using guessed type int __stdcall loc_1005976(int, int);
    // 1005A43: using guessed type int __stdcall loc_1005A43(int, int);
    // 1005AC7: using guessed type int __stdcall loc_1005AC7(int, int);
    // 1005AEB: using guessed type int __stdcall loc_1005AEB(int, int);
    // 1005B5A: using guessed type int __stdcall loc_1005B5A(int, int);
    // 1005B65: using guessed type int __stdcall loc_1005B65(int, int);
    // 1005B9C: using guessed type int __stdcall loc_1005B9C(int, int);
    // 1005BE2: using guessed type int __stdcall loc_1005BE2(int, int);
    // 1005C0C: using guessed type int __stdcall loc_1005C0C(int, int);
    // 100C008: using guessed type int dword_100C008;
    // 100C00C: using guessed type int dword_100C00C;
    // 100C030: using guessed type int dword_100C030;
    
    //----- (01002B64) --------------------------------------------------------
    char *__cdecl sub_1002B64(int a1, int a2)
    {
      void *v3; // esp@1
      char v4; // [sp-8h] [bp-8h]@1
    
      v3 = alloca(a2);
      return &v4;
    }
    
    //----- (01002C0D) --------------------------------------------------------
    LPCWSTR __stdcall sub_1002C0D(LPWSTR lpBuffer, LPCWSTR lpFileName, DWORD nBufferLength)
    {
      LPCWSTR v3; // ebx@1
      LPCWSTR v4; // esi@1
      HANDLE v5; // eax@5
      const WCHAR v7; // dx@10
      unsigned int i; // ecx@10
      __int16 v9; // ax@14
      struct _WIN32_FIND_DATAW FindFileData; // [sp+Ch] [bp-45Ch]@5
      __int16 v11[260]; // [sp+25Ch] [bp-20Ch]@13
      unsigned int v12; // [sp+464h] [bp-4h]@1
      int v13; // [sp+468h] [bp+0h]@1
    
      v12 = (unsigned int)&v13 ^ dword_100C010;
      v4 = lpFileName;
      v3 = lpFileName;
      if ( *lpFileName == 34 || *lpFileName == 39 )
      {
        v7 = *lpFileName;
        for ( i = 0; ; ++i )
        {
          ++v4;
          v9 = *v4;
          if ( !*v4 )
            break;
          if ( v9 == v7 || i >= 0x103 )
            break;
          v11[i] = v9;
        }
        v3 = v4;
        v11[i] = 0;
        v4 = (LPCWSTR)v11;
      }
      if ( PathIsFileSpecW(v4) )
        sub_1002558((int)lpBuffer, nBufferLength, (int)v4);
      else
        GetFullPathNameW(v4, nBufferLength, lpBuffer, 0);
      v5 = FindFirstFileW(lpBuffer, &FindFileData);
      if ( v5 != (HANDLE)-1
        || (sub_10080E4((int)lpBuffer, nBufferLength), v5 = FindFirstFileW(lpBuffer, &FindFileData), v5 != (HANDLE)-1) )
        FindClose(v5);
      return v3;
    }
    // 100C010: using guessed type int dword_100C010;
    // 1002C0D: using guessed type __int16 var_20C[260];
    
    //----- (01002F8B) --------------------------------------------------------
    LONG __thiscall sub_1002F8B(void *this)
    {
      LONG result; // eax@2
      int LCData; // [sp+0h] [bp-4h]@1
    
      LCData = (int)this;
      stru_100C140.lpfnPageSetupHook = (LPPAGESETUPHOOK)sub_1004240;
      stru_100C140.lpPageSetupTemplateName = (LPCWSTR)12;
      GetLocaleInfoW(0x400u, 0xDu, (LPWSTR)&LCData, 2);
      if ( (_WORD)LCData == 49 )
      {
        stru_100C140.rtMargin.top = 1000;
        stru_100C140.rtMargin.bottom = 1000;
        stru_100C140.Flags = 40966;
        result = 750;
      }
      else
      {
        stru_100C140.rtMargin.top = 2500;
        stru_100C140.rtMargin.bottom = 2500;
        stru_100C140.Flags = 40970;
        result = 2000;
      }
      stru_100C140.rtMargin.right = result;
      stru_100C140.rtMargin.left = result;
      return result;
    }
    
    //----- (0100304B) --------------------------------------------------------
    int __cdecl sub_100304B()
    {
      return 0;
    }
    
    //----- (01003053) --------------------------------------------------------
    DWORD __cdecl sub_1003053()
    {
      DWORD result; // eax@2
      DWORD v1; // esi@2
      DWORD v2; // esi@2
      DWORD v3; // esi@2
      DWORD v4; // esi@2
      LARGE_INTEGER PerformanceCount; // [sp+8h] [bp-10h]@2
      struct _FILETIME SystemTimeAsFileTime; // [sp+10h] [bp-8h]@1
    
      SystemTimeAsFileTime.dwLowDateTime = 0;
      SystemTimeAsFileTime.dwHighDateTime = 0;
      if ( dword_100C010 != -1153374642 && dword_100C010 & 0xFFFF0000 )
      {
        result = ~dword_100C010;
        dword_100C014 = ~dword_100C010;
      }
      else
      {
        GetSystemTimeAsFileTime(&SystemTimeAsFileTime);
        v2 = GetCurrentProcessId() ^ SystemTimeAsFileTime.dwLowDateTime ^ SystemTimeAsFileTime.dwHighDateTime;
        v3 = GetCurrentThreadId() ^ v2;
        v4 = GetTickCount() ^ v3;
        QueryPerformanceCounter(&PerformanceCount);
        result = PerformanceCount.LowPart ^ PerformanceCount.HighPart;
        v1 = PerformanceCount.LowPart ^ PerformanceCount.HighPart ^ v4;
        if ( v1 == -1153374642 || !(dword_100C010 & 0xFFFF0000) )
          v1 = -1153374641;
        dword_100C010 = v1;
        dword_100C014 = ~v1;
      }
      return result;
    }
    // 100C010: using guessed type int dword_100C010;
    // 100C014: using guessed type int dword_100C014;
    
    //----- (010030E2) --------------------------------------------------------
    LSTATUS __cdecl sub_10030E2()
    {
      LSTATUS result; // eax@4
      int v1; // [sp+Ch] [bp-B0h]@1
      HKEY Type; // [sp+10h] [bp-ACh]@2
      HKEY hKey; // [sp+14h] [bp-A8h]@1
      char Dst; // [sp+1Ch] [bp-A0h]@1
      int v5; // [sp+20h] [bp-9Ch]@2
      int v6; // [sp+24h] [bp-98h]@2
      int v7; // [sp+28h] [bp-94h]@2
      unsigned __int8 v8; // [sp+2Ch] [bp-90h]@2
      unsigned __int8 v9; // [sp+2Dh] [bp-8Fh]@2
      unsigned __int8 v10; // [sp+2Eh] [bp-8Eh]@2
      unsigned __int8 v11; // [sp+2Fh] [bp-8Dh]@2
      unsigned __int8 v12; // [sp+30h] [bp-8Ch]@2
      unsigned __int8 v13; // [sp+31h] [bp-8Bh]@2
      unsigned __int8 v14; // [sp+32h] [bp-8Ah]@2
      unsigned __int8 v15; // [sp+33h] [bp-89h]@2
      char Src; // [sp+74h] [bp-48h]@1
      wchar_t v17; // [sp+90h] [bp-2Ch]@1
      char v18; // [sp+92h] [bp-2Ah]@1
      unsigned int v19; // [sp+B8h] [bp-4h]@1
      int v20; // [sp+BCh] [bp+0h]@1
    
      v19 = (unsigned int)&v20 ^ dword_100C010;
      memset(&Dst, 0, 0x58u);
      memcpy(&Src, L"Lucida Console", 0x1Cu);
      v17 = aLucidaConsole[14];
      memset(&v18, 0, 0x24u);
      v1 = 100;
      if ( RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\Microsoft\Notepad", 0, 0x20019u, &hKey) )
        hKey = 0;
      lf.lfWidth = 0;
      lf.lfEscapement = sub_100355B(hKey, L"lfEscapement", v5);
      lf.lfOrientation = sub_100355B(hKey, L"lfOrientation", v6);
      lf.lfWeight = sub_100355B(hKey, L"lfWeight", v7);
      lf.lfItalic = sub_100355B(hKey, L"lfItalic", v8);
      lf.lfUnderline = sub_100355B(hKey, L"lfUnderline", v9);
      lf.lfStrikeOut = sub_100355B(hKey, L"lfStrikeOut", v10);
      lf.lfCharSet = sub_100355B(hKey, L"lfCharSet", v11);
      lf.lfOutPrecision = sub_100355B(hKey, L"lfOutPrecision", v12);
      lf.lfClipPrecision = sub_100355B(hKey, L"lfClipPrecision", v13);
      lf.lfQuality = sub_100355B(hKey, L"lfQuality", v14);
      lf.lfPitchAndFamily = sub_100355B(hKey, L"lfPitchAndFamily", v15);
      if ( !RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\Microsoft\Notepad\DefaultFonts", 0, 0x20019u, &Type) )
      {
        sub_10035B0(Type, L"lfFaceName", L"Lucida Console", &Src, 0x20u);
        v1 = sub_100355B(Type, L"iPointSize", 100);
        RegCloseKey(Type);
      }
      sub_10035B0(hKey, L"lfFaceName", &Src, lf.lfFaceName, 0x20u);
      *(_DWORD *)&Data = sub_100355B(hKey, L"iPointSize", v1);
      wParam = sub_100355B(hKey, L"fWrap", 0);
      *(_DWORD *)&dword_100C02C = sub_100355B(hKey, L"StatusBar", 0);
      dword_100C060 = sub_100355B(hKey, L"fSaveWindowPositions", 0);
      sub_10035B0(hKey, L"szHeader", &word_100C740, (void *)&word_100C740, 0x28u);
      sub_10035B0(hKey, L"szTrailer", &::Dst, &::Dst, 0x28u);
      stru_100C140.rtMargin.top = sub_100355B(hKey, L"iMarginTop", stru_100C140.rtMargin.top);
      stru_100C140.rtMargin.bottom = sub_100355B(hKey, L"iMarginBottom", stru_100C140.rtMargin.bottom);
      stru_100C140.rtMargin.left = sub_100355B(hKey, L"iMarginLeft", stru_100C140.rtMargin.left);
      stru_100C140.rtMargin.right = sub_100355B(hKey, L"iMarginRight", stru_100C140.rtMargin.right);
      Y = sub_100355B(hKey, L"iWindowPosY", -2147483648);
      X = sub_100355B(hKey, L"iWindowPosX", -2147483648);
      nWidth = sub_100355B(hKey, L"iWindowPosDX", -2147483648);
      nHeight = sub_100355B(hKey, L"iWindowPosDY", -2147483648);
      result = sub_100355B(hKey, L"fMLE_is_broken", 0);
      dword_100C040 = result;
      if ( hKey )
        result = RegCloseKey(hKey);
      return result;
    }
    // 1003538: using guessed type wchar_t aLucidaConsole[15];
    // 100C010: using guessed type int dword_100C010;
    // 100C040: using guessed type int dword_100C040;
    // 100C060: using guessed type int dword_100C060;
    
    //----- (0100355B) --------------------------------------------------------
    int __stdcall sub_100355B(HKEY hKey, LPCWSTR lpValueName, int a3)
    {
      int result; // eax@4
      DWORD cbData; // [sp+0h] [bp-Ch]@1
      BYTE Data[4]; // [sp+4h] [bp-8h]@1
      DWORD Type; // [sp+8h] [bp-4h]@1
    
      Type = 0;
      *(_DWORD *)Data = 1;
      cbData = 4;
      if ( !hKey || RegQueryValueExW(hKey, lpValueName, 0, &Type, Data, &cbData) || Type != 4 )
        result = a3;
      else
        result = *(_DWORD *)Data;
      return result;
    }
    
    //----- (010035B0) --------------------------------------------------------
    __int32 __stdcall sub_10035B0(HKEY Type, LPCWSTR lpValueName, const void *Src, void *Dst, DWORD cbData)
    {
      size_t v5; // esi@1
      __int32 result; // eax@2
    
      v5 = 2 * cbData;
      cbData *= 2;
      if ( !Type
        || (result = RegQueryValueExW(Type, lpValueName, 0, (LPDWORD)&Type, (LPBYTE)Dst, &cbData)) != 0
        || Type != (HKEY)1 )
        result = (__int32)memcpy(Dst, Src, v5);
      return result;
    }
    
    //----- (0100360C) --------------------------------------------------------
    const WCHAR *__cdecl sub_100360C(LPCWSTR lpsz)
    {
      const WCHAR *result; // eax@1
      const WCHAR v2; // cx@1
      bool i; // esi@1
    
      result = lpsz;
      v2 = *lpsz;
      for ( i = 0; *result; v2 = *result )
      {
        if ( (v2 == 32 || v2 == 9) && !i )
          break;
        if ( v2 == 34 )
          i = i == 0;
        result = CharNextW(result);
      }
      while ( *result == 32 || *result == 9 )
        ++result;
      return result;
    }
    
    //----- (01003660) --------------------------------------------------------
    int __cdecl sub_1003660(unsigned int a1, unsigned int a2)
    {
      int result; // eax@1
      unsigned int v3; // esi@1
    
      v3 = a1;
      result = 0;
      while ( v3 < a2 && !result )
      {
        if ( *(_DWORD *)v3 )
          result = (*(int (**)(void))v3)();
        v3 += 4;
      }
      return result;
    }
    
    //----- (01003689) --------------------------------------------------------
    int __usercall start<eax>(int a1<ebp>)
    {
      int v1; // eax@23
      signed int v2; // ebx@1
      LONG v3; // esi@1
      LONG v4; // eax@2
      signed int v5; // esi@3
      void *i; // esi@12
      unsigned __int8 v7; // al@13
    
      sub_1003053();
      sub_1003B0C((int)dword_10037A0, 88);
      v2 = 0;
      *(_DWORD *)(a1 - 28) = 0;
      *(_DWORD *)(a1 - 4) = 0;
      GetStartupInfoA((LPSTARTUPINFOA)(a1 - 104));
      *(_DWORD *)(a1 - 4) = -2;
      *(_DWORD *)(a1 - 4) = 1;
      v3 = *(_DWORD *)(*MK_FP(__FS__, 24) + 4);
      while ( 1 )
      {
        v4 = InterlockedCompareExchange(&Destination, v3, 0);
        if ( !v4 )
        {
          v5 = 1;
          goto LABEL_4;
        }
        if ( v4 == v3 )
          break;
        Sleep(0x3E8u);
      }
      v5 = 1;
      v2 = 1;
    LABEL_4:
      if ( dword_100C0A4 == v5 )
      {
        amsg_exit(31);
      }
      else
      {
        if ( dword_100C0A4 )
        {
          dword_100D7A8 = v5;
        }
        else
        {
          dword_100C0A4 = v5;
          if ( sub_1003660((unsigned int)dword_1003790, (unsigned int)dword_100379C) )
          {
            *(_DWORD *)(a1 - 4) = -2;
            return sub_10023D0(a1);
          }
        }
      }
      if ( dword_100C0A4 == v5 )
      {
        initterm(dword_1003784, dword_100378C);
        dword_100C0A4 = 2;
      }
      if ( !v2 )
        InterlockedExchange(&Destination, 0);
      if ( dword_100CD0C )
      {
        if ( sub_1009E73(a1) )
          dword_100CD0C(&dword_100CD0C);
      }
      for ( i = acmdln; ; i = (char *)i + 1 )
      {
        *(_DWORD *)(a1 - 32) = i;
        v7 = *(_BYTE *)i;
        if ( *(_BYTE *)i <= 0x20u )
        {
          if ( !v7 || !*(_DWORD *)(a1 - 28) )
            break;
        }
        if ( v7 == 34 )
          *(_DWORD *)(a1 - 28) = *(_DWORD *)(a1 - 28) == 0;
        if ( ismbblead(v7) )
        {
          i = (char *)i + 1;
          *(_DWORD *)(a1 - 32) = i;
        }
      }
      while ( *(_BYTE *)i && *(_BYTE *)i <= 0x20u )
      {
        i = (char *)i + 1;
        *(_DWORD *)(a1 - 32) = i;
      }
      *(_BYTE *)(a1 - 60) & 1;
      v1 = sub_1001405((HINSTANCE)0x1000000);
      dword_100C070 = v1;
      if ( !dword_100C064 )
        exit(v1);
      if ( !dword_100D7A8 )
        cexit();
      *(_DWORD *)(a1 - 4) = -2;
      return sub_10023D0(a1);
    }
    // 1001310: using guessed type void *acmdln;
    // 1001318: using guessed type int __cdecl ismbblead(_DWORD);
    // 1001324: using guessed type int cexit(void);
    // 10023D0: using guessed type _DWORD __usercall sub_10023D0<eax>(_DWORD ebp0<ebp>);
    // 1003040: using guessed type int __cdecl initterm(_DWORD, _DWORD);
    // 1003784: using guessed type int dword_1003784();
    // 100378C: using guessed type int dword_100378C();
    // 1003790: using guessed type int dword_1003790();
    // 100379C: using guessed type int dword_100379C();
    // 10037A0: using guessed type int dword_10037A0();
    // 1009F01: using guessed type int __cdecl amsg_exit(_DWORD);
    // 100C064: using guessed type int dword_100C064;
    // 100C070: using guessed type int dword_100C070;
    // 100C0A4: using guessed type int dword_100C0A4;
    // 100CD0C: using guessed type int (__thiscall *dword_100CD0C)(_DWORD);
    // 100D7A8: using guessed type int dword_100D7A8;
    
    //----- (010037EF) --------------------------------------------------------
    ATOM __usercall sub_10037EF<ax>(HINSTANCE a1<esi>)
    {
      WNDCLASSEXW v2; // [sp+0h] [bp-30h]@1
    
      memset(&v2.style, 0, 0x2Cu);
      v2.cbSize = 48;
      v2.hCursor = LoadCursorW(0, (LPCWSTR)0x7F01);
      v2.hIcon = LoadIconW(a1, (LPCWSTR)2);
      v2.hIconSm = LoadImageW(a1, (LPCWSTR)2, 1u, 16, 16, 0);
      v2.lpszMenuName = (LPCWSTR)1;
      v2.hInstance = a1;
      v2.lpszClassName = L"Notepad";
      v2.lpfnWndProc = (WNDPROC)sub_10014DE;
      v2.hbrBackground = (HBRUSH)6;
      return RegisterClassExW(&v2);
    }
    
    //----- (01003881) --------------------------------------------------------
    HLOCAL __stdcall sub_1003881(HINSTANCE hInstance)
    {
      HLOCAL result; // eax@1
      WCHAR *v2; // esi@2
      int v3; // ebx@3
      UINT **v4; // edi@4
      int v5; // eax@5
    
      result = (HLOCAL)sub_100392D(hInstance);
      if ( result )
      {
        result = LocalAlloc(0x40u, 2 * (_DWORD)result);
        v2 = (WCHAR *)result;
        if ( result )
        {
          v3 = LocalSize(result) >> 1;
          if ( v3 )
          {
            v4 = (UINT **)off_100C920;
            while ( 1 )
            {
              v5 = LoadStringW(hInstance, **v4, v2, v3) + 1;
              **v4 = (UINT)v2;
              v2 += v5;
              if ( v5 > v3 )
                break;
              ++v4;
              v3 -= v5;
              if ( (signed int)v4 >= (signed int)&unk_100C9DC )
              {
                sub_1002558((int)&word_100C740, 0x28u, dword_100C2F8);
                sub_1002558((int)&Dst, 0x28u, dword_100C2FC);
                word_100C000 = *(_WORD *)dword_100C2F0;
                return (HLOCAL)1;
              }
            }
            result = 0;
          }
          else
          {
            result = 0;
          }
        }
      }
      return result;
    }
    // 100C000: using guessed type __int16 word_100C000;
    // 100C2F0: using guessed type int dword_100C2F0;
    // 100C2F8: using guessed type int dword_100C2F8;
    // 100C2FC: using guessed type int dword_100C2FC;
    // 100C920: using guessed type int off_100C920[2];
    
    //----- (0100392D) --------------------------------------------------------
    int __stdcall sub_100392D(HINSTANCE hInstance)
    {
      int v1; // esi@1
      int v2; // ebx@3
      signed int v3; // edi@3
      int v4; // eax@4
      SIZE_T i; // [sp-4h] [bp-14h]@1
      WCHAR *v7; // [sp+Ch] [bp-4h]@2
    
      v1 = 280;
      for ( i = 560; ; i = 2 * v1 )
      {
        v7 = (WCHAR *)LocalAlloc(0x40u, i);
        if ( !v7 )
          break;
        v3 = 0;
        v2 = 0;
        do
        {
          v4 = LoadStringW(hInstance, *(_DWORD *)off_100C920[v3], v7, v1);
          if ( v4 >= v1 - 1 )
            break;
          ++v3;
          v2 += v4 + 1;
        }
        while ( v3 < 47 );
        LocalFree(v7);
        if ( v3 >= 47 )
          return v2;
        v1 *= 2;
      }
      return 0;
    }
    // 100C920: using guessed type int off_100C920[2];
    
    //----- (01003A48) --------------------------------------------------------
    unsigned int __cdecl sub_1003A48()
    {
      return controlfp(0x10000u, 0x30000u);
    }
    
    //----- (01003A60) --------------------------------------------------------
    signed int __cdecl sub_1003A60(signed int a1)
    {
      int v1; // eax@1
      int ebp0; // ebp@0
      int v3; // eax@2
      __int16 v4; // ax@3
      signed int result; // eax@4
    
      v1 = (int)GetModuleHandleA(0);
      if ( !v1 || (v3 = sub_1003A98(ebp0, v1), !v3) )
        goto LABEL_10;
      v4 = *(_WORD *)(v3 + 92);
      if ( v4 == 2 )
        return 2;
      if ( v4 == 3 )
        result = 1;
      else
    LABEL_10:
        result = a1;
      return result;
    }
    
    //----- (01003A98) --------------------------------------------------------
    int __userpurge sub_1003A98<eax>(int a1<ebp>, int a2)
    {
      int v2; // ecx@1
      unsigned int v3; // edx@4
    
      sub_1003B0C((int)dword_1003AF0, 12);
      v2 = *(_DWORD *)(a1 + 8);
      if ( v2 )
      {
        if ( v2 != -1 )
        {
          *(_DWORD *)(a1 - 4) = 0;
          if ( *(_WORD *)v2 == 23117 )
          {
            v3 = *(_DWORD *)(v2 + 60);
            if ( (signed int)v3 >= 0 )
            {
              if ( v3 < 0x10000000 )
              {
                *(_DWORD *)(a1 - 28) = v3 + v2;
                if ( *(_DWORD *)(v3 + v2) != 17744 )
                  *(_DWORD *)(a1 - 28) = 0;
              }
            }
          }
          *(_DWORD *)(a1 - 4) = -2;
        }
      }
      return sub_10023D0(a1);
    }
    // 10023D0: using guessed type _DWORD __usercall sub_10023D0<eax>(_DWORD ebp0<ebp>);
    // 1003AF0: using guessed type int dword_1003AF0[2];
    
    //----- (01003B0C) --------------------------------------------------------
    char *__cdecl sub_1003B0C(int a1, int a2)
    {
      void *v3; // esp@1
      char v4; // [sp-8h] [bp-8h]@1
    
      v3 = alloca(a2);
      return &v4;
    }
    
    //----- (01003BCD) --------------------------------------------------------
    int __stdcall sub_1003BCD(int a1, int a2, int a3, int a4)
    {
      int v4; // edi@1
      int v5; // esi@1
    
      v5 = a2;
      v4 = (*(int (__stdcall **)(int, int))(*(_DWORD *)a2 + 68))(a2, a3);
      if ( v4 >= 0 )
      {
        v4 = (*(int (__stdcall **)(int, _DWORD))(*(_DWORD *)v5 + 88))(v5, L"txt");
        if ( v4 >= 0 )
        {
          v4 = sub_1003D1B(v5);
          if ( v4 >= 0 )
          {
            v4 = (*(int (__stdcall **)(int, int *))(*(_DWORD *)v5 + 40))(v5, &a3);
            if ( v4 >= 0 )
            {
              v4 = (*(int (__stdcall **)(int, int))(*(_DWORD *)v5 + 36))(v5, a3 | 0x40);
              if ( v4 >= 0 )
              {
                v4 = (*(int (__stdcall **)(int, int))(*(_DWORD *)v5 + 12))(v5, a1);
                if ( v4 >= 0 )
                {
                  v4 = (*(int (__stdcall **)(int, int *))(*(_DWORD *)v5 + 80))(v5, &a2);
                  if ( v4 >= 0 )
                  {
                    v4 = (*(int (__stdcall **)(int, signed int, int))(*(_DWORD *)a2 + 20))(a2, -2147123200, a4);
                    (*(void (__stdcall **)(int))(*(_DWORD *)a2 + 8))(a2);
                  }
                }
              }
            }
          }
        }
      }
      return v4;
    }
    // 1003C6C: using guessed type wchar_t aTxt[4];
    
    //----- (01003C46) --------------------------------------------------------
    int __stdcall sub_1003C46(int a1)
    {
      int result; // eax@3
    
      if ( a1 == -2147024882 )
        result = MessageBoxW(hWnd, lpText, szApp, 0x1010u);
      return result;
    }
    
    //----- (01003C61) --------------------------------------------------------
    signed int __stdcall sub_1003C61(int a1, int a2)
    {
      return -2147467263;
    }
    
    //----- (01003C89) --------------------------------------------------------
    int __userpurge sub_1003C89<eax>(int a1<ebx>, int a2)
    {
      int v2; // edi@1
    
      v2 = (*(int (__stdcall **)(int, signed int, int))(*(_DWORD *)a2 + 104))(a2, 2, dword_100C368);
      if ( v2 >= 0 )
      {
        v2 = (*(int (__stdcall **)(int, signed int, int))(*(_DWORD *)a2 + 24))(a2, 1, a1);
        if ( v2 >= 0 )
        {
          v2 = (*(int (__stdcall **)(int, signed int, _DWORD, LPARAM))(*(_DWORD *)a2 + 76))(a2, 1, 0, dword_100C334);
          if ( v2 >= 0 )
          {
            v2 = (*(int (__stdcall **)(int, signed int, signed int, LPARAM))(*(_DWORD *)a2 + 76))(a2, 1, 1, dword_100C338);
            if ( v2 >= 0 )
            {
              v2 = (*(int (__stdcall **)(_DWORD, _DWORD, signed int, LPARAM))(*(_DWORD *)a2 + 76))(a2, 1, 2, dword_100C33C);
              if ( v2 >= 0 )
                v2 = (*(int (__stdcall **)(_DWORD, _DWORD, signed int, LPARAM))(*(_DWORD *)a2 + 76))(
                       a2,
                       1,
                       3,
                       dword_100C340);
            }
          }
        }
        (*(void (__cdecl **)(int))(*(_DWORD *)a2 + 108))(a2);
      }
      return v2;
    }
    // 1003C89: could not find valid save-restore pair for ebx
    // 100C368: using guessed type int dword_100C368;
    
    //----- (01003D1B) --------------------------------------------------------
    int __stdcall sub_1003D1B(int a1)
    {
      int v2; // ecx@1
      int v3; // [sp+0h] [bp-10h]@1
      int v4; // [sp+4h] [bp-Ch]@1
      int v5; // [sp+8h] [bp-8h]@1
      int v6; // [sp+Ch] [bp-4h]@1
    
      v3 = *(_DWORD *)Args;
      v5 = dword_100C308;
      v2 = *(_DWORD *)a1;
      v4 = (int)L"*.txt";
      v6 = (int)L"*.*";
      return (*(int (__stdcall **)(int, signed int, int *))(v2 + 16))(a1, 2, &v3);
    }
    // 1003D54: using guessed type wchar_t a_[4];
    // 100C308: using guessed type int dword_100C308;
    
    //----- (01003D6D) --------------------------------------------------------
    int __stdcall sub_1003D6D(int a1, LPCWSTR pszPath, int a3, int a4)
    {
      int v4; // esi@1
      LPVOID v6; // eax@12
      int v7; // [sp+Ch] [bp-8h]@2
      LPVOID ppv; // [sp+10h] [bp-4h]@1
    
      ppv = 0;
      v4 = CoCreateInstance(&rclsid, 0, 1u, &riid, &ppv);
      if ( v4 >= 0 )
      {
        *(_DWORD *)a3 = 0;
        v7 = 0;
        dword_100C038 = 1;
        (*(void (__stdcall **)(LPVOID, _DWORD, _DWORD))(*(_DWORD *)ppv + 116))(ppv, 0, 0);
        v4 = (**(int (__stdcall ***)(LPVOID, _DWORD, int *))ppv)(ppv, dword_1003C74, &v7);
        if ( v4 >= 0 )
        {
          v4 = sub_1003C89(1, v7);
          if ( v4 >= 0 )
          {
            v4 = (*(int (__stdcall **)(int, signed int, int))(*(_DWORD *)v7 + 100))(
                   v7,
                   1,
                   dword_100C00C != -1 ? dword_100C00C : 0);
            if ( v4 >= 0 )
            {
              sub_1003E75((int)ppv, pszPath);
              v4 = sub_1003BCD(a1, (int)ppv, dword_100C310, a3);
              if ( v4 >= 0 )
              {
                v4 = (*(int (__stdcall **)(int, signed int, int *))(*(_DWORD *)v7 + 96))(v7, 1, &a3);
                if ( v4 >= 0 )
                  dword_100E040 = a3;
              }
            }
          }
          (*(void (__stdcall **)(int))(*(_DWORD *)v7 + 8))(v7);
          if ( v4 >= 0 )
          {
            if ( a4 )
            {
              v6 = ppv;
              *(_DWORD *)a4 = ppv;
              (*(void (__stdcall **)(LPVOID))(*(_DWORD *)v6 + 4))(v6);
            }
          }
        }
        (*(void (__stdcall **)(LPVOID))(*(_DWORD *)ppv + 8))(ppv);
        dword_100C038 = 0;
      }
      return v4;
    }
    // 1003C74: using guessed type int dword_1003C74[5];
    // 100C00C: using guessed type int dword_100C00C;
    // 100C038: using guessed type int dword_100C038;
    // 100C310: using guessed type int dword_100C310;
    // 100E040: using guessed type int dword_100E040;
    
    //----- (01003E75) --------------------------------------------------------
    int __stdcall sub_1003E75(int a1, LPCWSTR pszPath)
    {
      int v2; // esi@2
    
      if ( PathIsFileSpecW(pszPath) )
      {
        v2 = (*(int (__stdcall **)(int, LPCWSTR))(*(_DWORD *)a1 + 60))(a1, pszPath);
      }
      else
      {
        v2 = SHCreateItemFromParsingName(pszPath, 0, dword_1004AF0, &pszPath);
        if ( v2 >= 0 )
        {
          v2 = (*(int (__stdcall **)(int, LPCWSTR))(*(_DWORD *)a1 + 108))(a1, pszPath);
          (*(void (__stdcall **)(LPCWSTR))(*(_DWORD *)pszPath + 8))(pszPath);
        }
      }
      return v2;
    }
    // 100136C: using guessed type int __stdcall SHCreateItemFromParsingName(_DWORD, _DWORD, _DWORD, _DWORD);
    // 1004AF0: using guessed type int dword_1004AF0[4];
    
    //----- (01003EA6) --------------------------------------------------------
    LONG __stdcall sub_1003EA6(int a1)
    {
      LONG v1; // edi@1
    
      v1 = InterlockedDecrement((volatile LONG *)(a1 + 8));
      if ( !v1 )
        LocalFree((HLOCAL)a1);
      return v1;
    }
    
    //----- (01003F21) --------------------------------------------------------
    int __userpurge sub_1003F21<eax>(int a1<ebx>, int a2, int a3)
    {
      int v3; // esi@1
      int v5; // [sp+4h] [bp-10h]@6
      int v6; // [sp+8h] [bp-Ch]@5
      int v7; // [sp+Ch] [bp-8h]@2
      LPVOID ppv; // [sp+10h] [bp-4h]@1
    
      ppv = 0;
      v3 = CoCreateInstance(&stru_100401C, 0, 1u, &stru_100400C, &ppv);
      if ( v3 >= 0 )
      {
        v7 = 0;
        v3 = (**(int (__stdcall ***)(LPVOID, _DWORD, int *))ppv)(ppv, dword_1003C74, &v7);
        if ( v3 >= 0 )
        {
          v3 = sub_1003C89(a1, v7);
          if ( v3 >= 0 )
          {
            v3 = (*(int (__stdcall **)(int, signed int, int))(*(_DWORD *)v7 + 100))(
                   v7,
                   1,
                   dword_100C00C != -1 ? dword_100C00C : 0);
            if ( v3 >= 0 )
            {
              v3 = sub_100405A((int)sub_1004038, (int)&v6);
              if ( v3 >= 0 )
              {
                v3 = (*(int (__stdcall **)(LPVOID, int, int *))(*(_DWORD *)ppv + 28))(ppv, v6, &v5);
                if ( v3 >= 0 )
                {
                  v3 = sub_1003BCD(a2, (int)ppv, dword_100C30C, a3);
                  (*(void (__stdcall **)(LPVOID, int))(*(_DWORD *)ppv + 32))(ppv, v5);
                }
                (*(void (__stdcall **)(int))(*(_DWORD *)v6 + 8))(v6);
              }
            }
          }
          (*(void (__stdcall **)(int))(*(_DWORD *)v7 + 8))(v7);
        }
        (*(void (__stdcall **)(LPVOID))(*(_DWORD *)ppv + 8))(ppv);
      }
      return v3;
    }
    // 1003C74: using guessed type int dword_1003C74[5];
    // 100C00C: using guessed type int dword_100C00C;
    // 100C30C: using guessed type int dword_100C30C;
    
    //----- (01004038) --------------------------------------------------------
    double __userpurge sub_1004038<st0>(int a1<eax>, int a2<ebp>, int a3<esi>, double result<st0>, int a5, int a6, int a7)
    {
      *(_DWORD *)a1 = (signed int)result;
      *(_DWORD *)(a2 + 117) = a3;
      return result;
    }
    
    //----- (0100405A) --------------------------------------------------------
    signed int __stdcall sub_100405A(int a1, int a2)
    {
      return sub_1004073(a2, a1);
    }
    
    //----- (01004073) --------------------------------------------------------
    signed int __stdcall sub_1004073(int a1, int a2)
    {
      int v2; // eax@1
      signed int v3; // edi@1
      int v4; // esi@1
    
      v3 = -2147024882;
      v2 = (int)LocalAlloc(0x40u, 0xCu);
      v4 = v2;
      if ( v2 )
      {
        *(_DWORD *)v2 = &off_100C288;
        *(_DWORD *)(v2 + 4) = &off_100C26C;
        *(_DWORD *)(v2 + 8) = 1;
        v3 = sub_10040C4(v2, a2, a1);
        sub_1003EA6(v4);
      }
      return v3;
    }
    // 100C26C: using guessed type int (__stdcall *off_100C26C)(int, int, int);
    // 100C288: using guessed type int (__stdcall *off_100C288)(int, int, int);
    
    //----- (010040C4) --------------------------------------------------------
    signed int __stdcall sub_10040C4(int a1, int a2, int a3)
    {
      char v3; // zf@1
      signed int v4; // ecx@1
      double (__userpurge *v5)<st0>(int<eax>, int<ebp>, int<esi>, double<st0>, int, int, int); // edi@1
      int v6; // esi@1
      int v7; // eax@6
      char v9; // zf@9
      signed int v10; // ecx@9
      int v11; // edi@9
      int v12; // esi@9
      char v13; // zf@14
      signed int v14; // ecx@14
      int v15; // edi@14
      int v16; // esi@14
    
      v6 = a2;
      v4 = 4;
      v5 = sub_1004038;
      v3 = 1;
      do
      {
        if ( !v4 )
          break;
        v3 = *(_DWORD *)v6 == *(_DWORD *)v5;
        v6 += 4;
        v5 = (double (__userpurge *)<st0>(int<eax>, int<ebp>, int<esi>, double<st0>, int, int, int))((char *)v5 + 4);
        --v4;
      }
      while ( v3 );
      if ( v3 )
        goto LABEL_23;
      v12 = a2;
      v10 = 4;
      v11 = (int)dword_1004A04;
      v9 = 1;
      do
      {
        if ( !v10 )
          break;
        v9 = *(_DWORD *)v12 == *(_DWORD *)v11;
        v12 += 4;
        v11 += 4;
        --v10;
      }
      while ( v9 );
      if ( v9 )
      {
    LABEL_23:
        v7 = a1;
        *(_DWORD *)a3 = a1;
    LABEL_7:
        sub_10040FB(v7);
        return 0;
      }
      v16 = a2;
      v14 = 4;
      v15 = (int)dword_10049F4;
      v13 = 1;
      do
      {
        if ( !v14 )
          break;
        v13 = *(_DWORD *)v16 == *(_DWORD *)v15;
        v16 += 4;
        v15 += 4;
        --v14;
      }
      while ( v13 );
      if ( v13 )
      {
        v7 = a1;
        *(_DWORD *)a3 = a1 + 4;
        goto LABEL_7;
      }
      *(_DWORD *)a3 = 0;
      return -2147467262;
    }
    // 10049F4: using guessed type int dword_10049F4[4];
    // 1004A04: using guessed type int dword_1004A04[2];
    
    //----- (010040FB) --------------------------------------------------------
    LONG __stdcall sub_10040FB(int a1)
    {
      return InterlockedIncrement((volatile LONG *)(a1 + 8));
    }
    
    //----- (01004116) --------------------------------------------------------
    int __stdcall sub_1004116(int a1)
    {
      int result; // eax@1
      WCHAR *v2; // ecx@12
      DWORD v3; // eax@12
      const WCHAR *v4; // eax@14
      WCHAR Buffer; // [sp+0h] [bp-324h]@12
      unsigned int v6; // [sp+320h] [bp-4h]@1
      int v7; // [sp+324h] [bp+0h]@1
    
      v6 = (unsigned int)&v7 ^ dword_100C010;
      result = sub_100414E(a1);
      if ( result )
      {
        if ( result != -2 )
        {
          if ( result != -3 )
          {
            if ( result == -4 )
              result = 112;
            if ( result == -5 )
              result = 14;
            if ( result == -1 )
              result = GetLastError();
            if ( result )
            {
              v3 = FormatMessageW(0x1200u, 0, result, 0, &Buffer, 0x190u, 0);
              v2 = (WCHAR *)dword_100C2DC;
              if ( v3 )
                v2 = &Buffer;
              v4 = lpString2;
              if ( !dword_100C008 )
                v4 = &FileName;
              result = sub_1007051(hWnd, szApp, v2, v4, 0x30u);
            }
          }
        }
      }
      return result;
    }
    // 100C008: using guessed type int dword_100C008;
    // 100C010: using guessed type int dword_100C010;
    
    //----- (0100414E) --------------------------------------------------------
    signed int __stdcall sub_100414E(int a1)
    {
      signed int v1; // eax@2
      signed int result; // eax@4
    
      SetCursor(hCursor);
      if ( a1 )
      {
        if ( a1 == 2 )
          v1 = sub_1008987();
        else
          v1 = sub_10088B6();
      }
      else
      {
        v1 = sub_1004194();
      }
      if ( v1 == -1 )
      {
        SetCursor(dword_100C094);
        result = 0;
      }
      else
      {
        result = sub_100900D((HDC)v1);
      }
      return result;
    }
    
    //----- (01004194) --------------------------------------------------------
    int __cdecl sub_1004194()
    {
      int Dst; // [sp+Ch] [bp-58h]@3
      HWND v2; // [sp+10h] [bp-54h]@3
      HGLOBAL v3; // [sp+14h] [bp-50h]@4
      HGLOBAL v4; // [sp+18h] [bp-4Ch]@6
      int v5; // [sp+1Ch] [bp-48h]@11
      int v6; // [sp+20h] [bp-44h]@3
      int v7; // [sp+58h] [bp-Ch]@3
      int v8; // [sp+5Ch] [bp-8h]@8
      int v9; // [sp+60h] [bp-4h]@7
    
      if ( !stru_100C140.hDevNames )
      {
        stru_100C140.Flags |= 0x480u;
        PageSetupDlgW(&stru_100C140);
        stru_100C140.Flags &= 0xFFFFFB7Fu;
      }
      memset(&Dst, 0, 0x54u);
      v7 = -1;
      v2 = hWnd;
      Dst = 84;
      v6 = 8651020;
      if ( stru_100C140.hDevMode )
        v3 = stru_100C140.hDevMode;
      if ( stru_100C140.hDevNames )
        v4 = stru_100C140.hDevNames;
      v9 = -1;
      if ( !PrintDlgExW((LPPRINTDLGEXW)&Dst) )
      {
        if ( v8 == 1 )
        {
          v9 = v5;
        }
        else
        {
          if ( v8 != 2 )
            return v9;
        }
        if ( !stru_100C140.hDevMode )
        {
          stru_100C140.Flags |= 0x480u;
          PageSetupDlgW(&stru_100C140);
          stru_100C140.Flags &= 0xFFFFFB7Fu;
        }
        stru_100C140.hDevMode = v3;
        stru_100C140.hDevNames = v4;
      }
      return v9;
    }
    
    //----- (01004240) --------------------------------------------------------
    signed int __stdcall sub_1004240(HWND hDlg, int a2, int a3, int a4)
    {
      int v5; // edi@5
      WCHAR *v6; // esi@5
      const WCHAR *v7; // ebx@8
      int v8; // edi@8
    
      if ( a2 == 2 )
      {
        v5 = 30;
        v6 = &word_100C6A0;
        do
        {
          GetDlgItemTextW(hDlg, v5, v6, 40);
          v6 += 40;
          ++v5;
        }
        while ( (signed int)v6 <= (signed int)&unk_100C6F0 );
        return 0;
      }
      if ( a2 != 272 )
        return 0;
      v8 = 30;
      v7 = &word_100C740;
      do
      {
        SendDlgItemMessageW(hDlg, v8, 0xC5u, 0x27u, 0);
        SetDlgItemTextW(hDlg, v8, v7);
        v7 += 40;
        ++v8;
      }
      while ( (signed int)v7 <= (signed int)&Dst );
      SendDlgItemMessageW(hDlg, 30, 0xB1u, 0, 2555904);
      return 1;
    }
    
    //----- (0100432B) --------------------------------------------------------
    DWORD __cdecl sub_100432B()
    {
      DWORD result; // eax@1
      unsigned int v1; // edx@3
      wchar_t *v2; // ecx@3
      wchar_t Dest; // [sp+0h] [bp-194h]@8
      unsigned int v4; // [sp+190h] [bp-4h]@1
      int v5; // [sp+194h] [bp+0h]@1
    
      v4 = (unsigned int)&v5 ^ dword_100C010;
      result = CommDlgExtendedError();
      if ( result )
      {
        v2 = 0;
        v1 = 0;
        do
        {
          if ( result == *(int *)((char *)&dword_100CD10 + v1) )
            v2 = (wchar_t *)**(int **)((char *)&off_100CD14 + v1);
          v1 += 8;
        }
        while ( v1 < 0x40 );
        if ( !v2 )
        {
          sub_10015C3(&Dest, 0xC8u, dword_100C328, result);
          v2 = &Dest;
        }
        if ( *v2 )
          MessageBoxW(hWnd, v2, szApp, 0x1010u);
        result = 1;
      }
      return result;
    }
    // 100C010: using guessed type int dword_100C010;
    // 100CD10: using guessed type int dword_100CD10;
    // 100CD14: using guessed type int *off_100CD14;
    
    //----- (010043F5) --------------------------------------------------------
    int __stdcall sub_10043F5(int a1, int a2)
    {
      int v2; // ecx@2
      int result; // eax@3
    
      if ( !a2 || (v2 = a2, !*(_WORD *)a2) )
        v2 = (int)L"(null)";
      result = a1;
      *(_DWORD *)(a1 + 4) = v2;
      *(_DWORD *)a1 = 2;
      return result;
    }
    // 1004420: using guessed type wchar_t aNull[7];
    
    //----- (0100449D) --------------------------------------------------------
    HRESULT __thiscall sub_100449D(void *this)
    {
      HRESULT result; // eax@1
      OLECHAR *v2; // esi@2
      LPVOID ppv; // [sp+0h] [bp-4h]@1
    
      ppv = this;
      result = CoCreateInstance(&stru_10043E0, 0, 0x17u, &stru_10043D0, &ppv);
      if ( result >= 0 )
      {
        sub_10045A7((int)L"HELP_ENTRY_ID_NOTEPAD_HELP");
        v2 = SysAllocString(L"mshelp://windows/?id=5d18d5fb-e737-4a73-b6cc-dccc63720231");
        if ( v2 )
        {
          (*(void (__stdcall **)(_DWORD, _DWORD))(*(_DWORD *)ppv + 12))(ppv, v2);
          SysFreeString(v2);
        }
        result = (*(int (__stdcall **)(_DWORD))(*(_DWORD *)ppv + 8))(ppv);
      }
      return result;
    }
    // 100456C: using guessed type wchar_t aHelp_entry_id_[27];
    
    //----- (010045A7) --------------------------------------------------------
    int __stdcall sub_10045A7(int a1)
    {
      int v2; // [sp+4h] [bp-8h]@1
      int v3; // [sp+8h] [bp-4h]@1
    
      v2 = 0;
      v3 = 0;
      sub_10043F5((int)&v2, a1);
      return WinSqmAddToStream(0, 911, 1, &v2);
    }
    // 10045E1: using guessed type int __stdcall WinSqmAddToStream(_DWORD, _DWORD, _DWORD, _DWORD);
    
    //----- (01004628) --------------------------------------------------------
    int __stdcall sub_1004628(LPCWSTR lpString)
    {
      int v1; // edi@1
      int v2; // eax@4
      void *v3; // edi@4
      int v4; // esi@4
      int v6; // [sp+Ch] [bp-868h]@1
      HWND Dst; // [sp+10h] [bp-864h]@1
      HINSTANCE v8; // [sp+14h] [bp-860h]@1
      int v9; // [sp+1Ch] [bp-858h]@1
      int v10; // [sp+20h] [bp-854h]@1
      void *v11; // [sp+28h] [bp-84Ch]@5
      int v12; // [sp+30h] [bp-844h]@1
      int v13; // [sp+34h] [bp-840h]@1
      int v14; // [sp+6Ch] [bp-808h]@5
      WCHAR String; // [sp+70h] [bp-804h]@1
      unsigned int v16; // [sp+870h] [bp-4h]@1
      int v17; // [sp+874h] [bp+0h]@1
    
      v16 = (unsigned int)&v17 ^ dword_100C010;
      v1 = 0;
      memset(&Dst, 0, 0x5Cu);
      Dst = hWnd;
      v6 = 96;
      v8 = hInstance;
      v9 = 8;
      v10 = 3000;
      v12 = 2;
      v13 = (int)dword_1004748;
      if ( !LoadStringW(hInstance, 0xBB9u, &String, 1024) )
        goto LABEL_12;
      if ( lpString )
        v1 = lstrlenW(lpString);
      v4 = lstrlenW(&String) + v1 + 1;
      v2 = (int)LocalAlloc(0x40u, 2 * v4);
      v3 = (void *)v2;
      if ( v2 )
      {
        sub_10047BA((int)&String, (int)lpString, v2, v4);
        v11 = v3;
        if ( COMCTL32_345(&v6, &v14, 0, 0) < 0 )
          v14 = 6;
        LocalFree(v3);
      }
      else
      {
    LABEL_12:
        v14 = 6;
      }
      return v14;
    }
    // 10013C8: using guessed type int __stdcall COMCTL32_345(_DWORD, _DWORD, _DWORD, _DWORD);
    // 1004748: using guessed type int dword_1004748[4];
    // 100C010: using guessed type int dword_100C010;
    
    //----- (0100478B) --------------------------------------------------------
    LSTATUS __stdcall sub_100478B(HKEY hKey, LPCWSTR lpValueName, LPCWSTR lpData)
    {
      int v4; // eax@1
    
      v4 = lstrlenW(lpData);
      return RegSetValueExW(hKey, lpValueName, 0, 1u, (const BYTE *)lpData, 2 * v4 + 2);
    }
    
    //----- (010047BA) --------------------------------------------------------
    signed int __stdcall sub_10047BA(int a1, int a2, int a3, int a4)
    {
      int v4; // eax@1
      int v5; // ecx@1
      int v6; // ebx@1
      unsigned int v7; // edi@1
      __int16 v8; // dx@4
      int v10; // esi@6
      int v11; // ecx@7
    
      v5 = a1;
      v4 = a3;
      v7 = 0;
      v6 = a4 - 1;
      while ( *(_WORD *)v5 != word_100C000 && v7 < v6 )
      {
        *(_WORD *)v4 = *(_WORD *)v5;
        v8 = *(_WORD *)v5;
        v4 += 2;
        ++v7;
        v5 += 2;
        if ( !v8 )
          return 0;
      }
      v10 = a2;
      if ( a2 )
      {
        while ( *(_WORD *)v10 && v7 < v6 )
        {
          *(_WORD *)v4 = *(_WORD *)v10;
          v4 += 2;
          v10 += 2;
          ++v7;
        }
      }
      v11 = v5 + 4;
      while ( *(_WORD *)v11 && v7 < v6 )
      {
        *(_WORD *)v4 = *(_WORD *)v11;
        v4 += 2;
        v11 += 2;
        ++v7;
      }
      *(_WORD *)v4 = 0;
      return 1;
    }
    // 100C000: using guessed type __int16 word_100C000;
    
    //----- (0100498E) --------------------------------------------------------
    LSTATUS __stdcall sub_100498E(HKEY hKey, LPCWSTR lpValueName, BYTE Data)
    {
      return RegSetValueExW(hKey, lpValueName, 0, 4u, &Data, 4u);
    }
    
    //----- (010056E3) --------------------------------------------------------
    void __usercall sub_10056E3(struct _SECURITY_ATTRIBUTES *a1<ebx>, int a2<ebp>, int a3<esi>)
    {
      HANDLE v3; // ST18_4@1
      DWORD v4; // eax@2
      int v5; // eax@3
      int v6; // eax@4
      const WCHAR *v7; // eax@6
      int v8; // [sp+0h] [bp-4h]@13
    
      hFile = CreateFileW((LPCWSTR)a3, 0x80000000u, 3u, a1, 3u, 0x80u, v3);
      if ( hFile == (HANDLE)-1 )
      {
        v4 = GetLastError() - 2;
        if ( v4 )
        {
          v5 = v4 - 3;
          if ( v5 && (v6 = v5 - 60) != 0 )
          {
            if ( v6 == 58 )
              v7 = (const WCHAR *)dword_100C2E0;
            else
              v7 = dword_100C2B0;
          }
          else
          {
            v7 = dword_100C31C;
          }
        }
        else
        {
          v7 = dword_100C2B4;
        }
        sub_1007051(hWnd, szApp, v7, (LPCWSTR)a3, 0x30u);
      }
      else
      {
        sub_1002820(a2, a3, dword_100C05C);
        if ( *(struct _SECURITY_ATTRIBUTES **)(a2 - 4) == a1 )
          v8 = 2;
        else
          v8 = 1;
        sub_1004116(v8);
      }
      JUMPOUT(*(unsigned int *)loc_100266D);
    }
    // 100266D: using guessed type int __stdcall loc_100266D(int, int nCmdShow);
    // 100C05C: using guessed type int dword_100C05C;
    // 100C2E0: using guessed type int dword_100C2E0;
    
    //----- (010058A7) --------------------------------------------------------
    void __stdcall sub_10058A7(int a1, int a2)
    {
      LPCWSTR v2; // ST14_4@1
    
      sub_1007BF6(v2);
      JUMPOUT(*(unsigned int *)loc_1002B3F);
    }
    // 1002B3F: using guessed type int __stdcall loc_1002B3F(int, int);
    
    //----- (01005D2A) --------------------------------------------------------
    void __usercall sub_1005D2A(int a1<ebp>, HWND a2<edi>)
    {
      signed int v2; // ebx@1
      HANDLE v3; // eax@1
      SC_HANDLE v4; // eax@4
      SC_HANDLE v5; // eax@5
      SIZE_T v6; // ST14_4@8
      HANDLE v7; // eax@8
      LPVOID v8; // eax@8
      void *v9; // ST14_4@13
      HANDLE v10; // eax@13
      SC_HANDLE v11; // eax@16
      SC_HANDLE v12; // eax@17
      struct _QUERY_SERVICE_CONFIGW *v13; // eax@20
      SIZE_T v14; // ST14_4@20
      HANDLE v15; // eax@20
      void *v16; // ST14_4@25
      HANDLE v17; // eax@25
      DWORD v18; // eax@32
      void *v19; // eax@33
      const void *v20; // ebx@33
      SIZE_T v21; // ST14_4@33
      HANDLE v22; // eax@33
      size_t v23; // ST14_4@39
      const wchar_t *v24; // ST10_4@39
      wchar_t *v25; // eax@39
      HANDLE v26; // eax@41
      DWORD v27; // eax@45
      DWORD v28; // ebx@45
      void *v29; // eax@46
      SIZE_T v30; // ST14_4@46
      HANDLE v31; // eax@46
      size_t v32; // ST14_4@52
      const wchar_t *v33; // ST10_4@52
      wchar_t *v34; // eax@52
      void *v35; // ST14_4@54
      HANDLE v36; // eax@54
      DWORD v37; // eax@58
      DWORD v38; // ebx@58
      void *v39; // eax@59
      SIZE_T v40; // ST14_4@59
      HANDLE v41; // eax@59
      size_t v42; // ST14_4@65
      const wchar_t *v43; // ST10_4@65
      wchar_t *v44; // eax@65
      void *v45; // ST14_4@67
      HANDLE v46; // eax@67
      signed int v47; // esi@68
      SC_HANDLE v48; // eax@71
      SC_HANDLE v49; // eax@72
      SIZE_T v50; // ST14_4@75
      HANDLE v51; // eax@75
      LPVOID v52; // eax@75
      void *v53; // ST14_4@80
      HANDLE v54; // eax@80
      SC_HANDLE v55; // eax@83
      SC_HANDLE v56; // eax@84
      struct _QUERY_SERVICE_CONFIGW *v57; // eax@87
      SIZE_T v58; // ST14_4@87
      HANDLE v59; // eax@87
      void *v60; // ST14_4@92
      HANDLE v61; // eax@92
      DWORD v62; // eax@99
      void *v63; // eax@100
      const void *v64; // ebx@100
      SIZE_T v65; // ST14_4@100
      HANDLE v66; // eax@100
      size_t v67; // ST14_4@106
      const wchar_t *v68; // ST10_4@106
      wchar_t *v69; // eax@106
      HANDLE v70; // eax@108
      DWORD v71; // eax@112
      DWORD v72; // ebx@112
      void *v73; // eax@113
      SIZE_T v74; // ST14_4@113
      HANDLE v75; // eax@113
      size_t v76; // ST14_4@119
      const wchar_t *v77; // ST10_4@119
      wchar_t *v78; // eax@119
      void *v79; // ST14_4@121
      HANDLE v80; // eax@121
      DWORD v81; // eax@125
      DWORD v82; // ebx@125
      void *v83; // eax@126
      SIZE_T v84; // ST14_4@126
      HANDLE v85; // eax@126
      size_t v86; // ST14_4@132
      const wchar_t *v87; // ST10_4@132
      wchar_t *v88; // eax@132
      void *v89; // ST14_4@134
      HANDLE v90; // eax@134
      LONG v91; // eax@139
      HWND v92; // eax@141
      DWORD v93; // eax@143
      HANDLE v94; // eax@147
      WCHAR *v95; // [sp-8h] [bp-10h]@139
    
      v3 = GetCurrentProcess();
      v2 = 260;
      if ( IsWow64Process(v3, (PBOOL)(a1 - 4792)) )
      {
        if ( *(HWND *)(a1 - 4792) == a2 )
        {
          *(_DWORD *)(a1 - 4748) = a2;
          v48 = OpenSCManagerW((LPCWSTR)a2, (LPCWSTR)a2, 1u);
          *(_DWORD *)(a1 - 4760) = v48;
          if ( v48 != a2 )
          {
            v49 = OpenServiceW(v48, L"sppuinotify", 1u);
            *(_DWORD *)(a1 - 4752) = v49;
            if ( v49 != a2 )
            {
              if ( !QueryServiceConfigW(
                      *(SC_HANDLE *)(a1 - 4752),
                      (LPQUERY_SERVICE_CONFIGW)a2,
                      (DWORD)a2,
                      (LPDWORD)(a1 - 4764)) )
              {
                if ( GetLastError() == 122 )
                {
                  v50 = *(_DWORD *)(a1 - 4764);
                  v51 = GetProcessHeap();
                  v52 = HeapAlloc(v51, (DWORD)a2, v50);
                  *(_DWORD *)(a1 - 4744) = v52;
                  if ( v52 == a2 )
                  {
                    *(_DWORD *)(a1 - 4748) = 1;
                  }
                  else
                  {
                    if ( QueryServiceConfigW(
                           *(SC_HANDLE *)(a1 - 4752),
                           *(LPQUERY_SERVICE_CONFIGW *)(a1 - 4744),
                           *(_DWORD *)(a1 - 4764),
                           (LPDWORD)(a1 - 4764)) )
                    {
                      if ( *(_DWORD *)(*(_DWORD *)(a1 - 4744) + 4) != 4 )
                        *(_DWORD *)(a1 - 4748) = 1;
                    }
                    v53 = *(void **)(a1 - 4744);
                    v54 = GetProcessHeap();
                    HeapFree(v54, (DWORD)a2, v53);
                  }
                }
              }
              CloseServiceHandle(*(SC_HANDLE *)(a1 - 4752));
            }
            CloseServiceHandle(*(SC_HANDLE *)(a1 - 4760));
            if ( *(HWND *)(a1 - 4748) != a2 )
            {
              *(_DWORD *)(a1 - 4752) = a2;
              v55 = OpenSCManagerW((LPCWSTR)a2, (LPCWSTR)a2, 1u);
              *(_DWORD *)(a1 - 4756) = v55;
              if ( v55 != a2 )
              {
                v56 = OpenServiceW(v55, L"sppsvc", 1u);
                *(_DWORD *)(a1 - 4744) = v56;
                if ( v56 != a2 )
                {
                  if ( !QueryServiceConfigW(v56, (LPQUERY_SERVICE_CONFIGW)a2, (DWORD)a2, (LPDWORD)(a1 - 4748)) )
                  {
                    if ( GetLastError() == 122 )
                    {
                      v58 = *(_DWORD *)(a1 - 4748);
                      v59 = GetProcessHeap();
                      v57 = (struct _QUERY_SERVICE_CONFIGW *)HeapAlloc(v59, (DWORD)a2, v58);
                      *(_DWORD *)(a1 - 4760) = v57;
                      if ( v57 == a2 )
                      {
                        *(_DWORD *)(a1 - 4752) = 1;
                      }
                      else
                      {
                        if ( QueryServiceConfigW(
                               *(SC_HANDLE *)(a1 - 4744),
                               v57,
                               *(_DWORD *)(a1 - 4748),
                               (LPDWORD)(a1 - 4748)) )
                        {
                          if ( *(_DWORD *)(*(_DWORD *)(a1 - 4760) + 4) != 4 )
                            *(_DWORD *)(a1 - 4752) = 1;
                        }
                        v60 = *(void **)(a1 - 4760);
                        v61 = GetProcessHeap();
                        HeapFree(v61, (DWORD)a2, v60);
                      }
                    }
                  }
                  CloseServiceHandle(*(SC_HANDLE *)(a1 - 4744));
                }
                CloseServiceHandle(*(SC_HANDLE *)(a1 - 4756));
                if ( *(HWND *)(a1 - 4752) != a2 )
                {
                  if ( SHGetFolderPathW(a2, 37, a2, (DWORD)a2, (LPWSTR)(a1 - 1100)) >= 0 )
                  {
                    if ( sub_1009CDF(a1 - 3700, 260, a1 - 1100) >= 0 )
                    {
                      if ( sub_1009D19(a1 - 3700, 260, (int)L"\sppuinotify.dll") >= 0 )
                      {
                        if ( GetFileAttributesW((LPCWSTR)(a1 - 3700)) != -1 )
                        {
                          *(_DWORD *)(a1 - 4760) = a2;
                          v62 = GetFileVersionInfoSizeExW((DWORD)a2, (LPCWSTR)(a1 - 3700), (LPDWORD)(a1 - 4752));
                          *(_DWORD *)(a1 - 4756) = v62;
                          if ( v62 > (unsigned int)a2 )
                          {
                            v65 = v62;
                            v66 = GetProcessHeap();
                            v63 = HeapAlloc(v66, (DWORD)a2, v65);
                            v64 = v63;
                            if ( v63 == a2 )
                              goto LABEL_153;
                            if ( GetFileVersionInfoExW(
                                   (DWORD)a2,
                                   (LPCWSTR)(a1 - 3700),
                                   *(_DWORD *)(a1 - 4752),
                                   *(_DWORD *)(a1 - 4756),
                                   v63) )
                            {
                              if ( VerQueryValueW(
                                     v64,
                                     L"\VarFileInfo\Translation",
                                     (LPVOID *)(a1 - 4884),
                                     (PUINT)(a1 - 4780)) )
                              {
                                if ( *(_DWORD *)(a1 - 4780) >= 4u )
                                {
                                  if ( sub_10015C3(
                                         (wchar_t *)(a1 - 388),
                                         0x30u,
                                         L"\StringFileInfo\%04x%04x\OriginalFilename",
                                         **(_WORD **)(a1 - 4884),
                                         *(_WORD *)(*(_DWORD *)(a1 - 4884) + 2)) >= 0 )
                                  {
                                    if ( VerQueryValueW(v64, (LPCWSTR)(a1 - 388), (LPVOID *)(a1 - 4848), (PUINT)(a1 - 4800)) )
                                    {
                                      v67 = *(_DWORD *)(a1 - 4800);
                                      v68 = *(const wchar_t **)(a1 - 4848);
                                      v69 = wcsrchr((const wchar_t *)(a1 - 3700), 0x5Cu);
                                      if ( !wcsncmp(v69 + 1, v68, v67) )
                                        *(_DWORD *)(a1 - 4760) = 1;
                                    }
                                  }
                                }
                              }
                            }
                            v70 = GetProcessHeap();
                            HeapFree(v70, (DWORD)a2, (LPVOID)v64);
                            if ( *(HWND *)(a1 - 4760) != a2 )
                            {
    LABEL_153:
                              if ( sub_1009CDF(a1 - 4220, 260, a1 - 1100) >= 0 )
                              {
                                if ( sub_1009D19(a1 - 4220, 260, (int)L"\slui.exe") >= 0 )
                                {
                                  if ( GetFileAttributesW((LPCWSTR)(a1 - 4220)) != -1 )
                                  {
                                    *(_DWORD *)(a1 - 4756) = a2;
                                    v71 = GetFileVersionInfoSizeExW((DWORD)a2, (LPCWSTR)(a1 - 4220), (LPDWORD)(a1 - 4760));
                                    v72 = v71;
                                    if ( v71 > (unsigned int)a2 )
                                    {
                                      v74 = v71;
                                      v75 = GetProcessHeap();
                                      v73 = HeapAlloc(v75, (DWORD)a2, v74);
                                      *(_DWORD *)(a1 - 4744) = v73;
                                      if ( v73 == a2 )
                                        goto LABEL_154;
                                      if ( GetFileVersionInfoExW(
                                             (DWORD)a2,
                                             (LPCWSTR)(a1 - 4220),
                                             *(_DWORD *)(a1 - 4760),
                                             v72,
                                             v73) )
                                      {
                                        if ( VerQueryValueW(
                                               *(LPCVOID *)(a1 - 4744),
                                               L"\VarFileInfo\Translation",
                                               (LPVOID *)(a1 - 4876),
                                               (PUINT)(a1 - 4808)) )
                                        {
                                          if ( *(_DWORD *)(a1 - 4808) >= 4u )
                                          {
                                            if ( sub_10015C3(
                                                   (wchar_t *)(a1 - 580),
                                                   0x30u,
                                                   L"\StringFileInfo\%04x%04x\OriginalFilename",
                                                   **(_WORD **)(a1 - 4876),
                                                   *(_WORD *)(*(_DWORD *)(a1 - 4876) + 2)) >= 0 )
                                            {
                                              if ( VerQueryValueW(
                                                     *(LPCVOID *)(a1 - 4744),
                                                     (LPCWSTR)(a1 - 580),
                                                     (LPVOID *)(a1 - 4856),
                                                     (PUINT)(a1 - 4816)) )
                                              {
                                                v76 = *(_DWORD *)(a1 - 4816);
                                                v77 = *(const wchar_t **)(a1 - 4856);
                                                v78 = wcsrchr((const wchar_t *)(a1 - 4220), 0x5Cu);
                                                if ( !wcsncmp(v78 + 1, v77, v76) )
                                                  *(_DWORD *)(a1 - 4756) = 1;
                                              }
                                            }
                                          }
                                        }
                                      }
                                      v79 = *(void **)(a1 - 4744);
                                      v80 = GetProcessHeap();
                                      HeapFree(v80, (DWORD)a2, v79);
                                      if ( *(HWND *)(a1 - 4756) != a2 )
                                      {
    LABEL_154:
                                        if ( sub_1009CDF(a1 - 3180, 260, a1 - 1100) >= 0 )
                                        {
                                          if ( sub_1009D19(a1 - 3180, 260, (int)L"\sppsvc.exe") >= 0 )
                                          {
                                            if ( GetFileAttributesW((LPCWSTR)(a1 - 3180)) != -1 )
                                            {
                                              *(_DWORD *)(a1 - 4756) = a2;
                                              v81 = GetFileVersionInfoSizeExW(
                                                      (DWORD)a2,
                                                      (LPCWSTR)(a1 - 3180),
                                                      (LPDWORD)(a1 - 4824));
                                              v82 = v81;
                                              if ( v81 > (unsigned int)a2 )
                                              {
                                                v84 = v81;
                                                v85 = GetProcessHeap();
                                                v83 = HeapAlloc(v85, (DWORD)a2, v84);
                                                *(_DWORD *)(a1 - 4744) = v83;
                                                if ( v83 == a2 )
                                                  goto LABEL_150;
                                                if ( GetFileVersionInfoExW(
                                                       (DWORD)a2,
                                                       (LPCWSTR)(a1 - 3180),
                                                       *(_DWORD *)(a1 - 4824),
                                                       v82,
                                                       v83) )
                                                {
                                                  if ( VerQueryValueW(
                                                         *(LPCVOID *)(a1 - 4744),
                                                         L"\VarFileInfo\Translation",
                                                         (LPVOID *)(a1 - 4832),
                                                         (PUINT)(a1 - 4892)) )
                                                  {
                                                    if ( *(_DWORD *)(a1 - 4892) >= 4u )
                                                    {
                                                      if ( sub_10015C3(
                                                             (wchar_t *)(a1 - 292),
                                                             0x30u,
                                                             L"\StringFileInfo\%04x%04x\OriginalFilename",
                                                             **(_WORD **)(a1 - 4832),
                                                             *(_WORD *)(*(_DWORD *)(a1 - 4832) + 2)) >= 0 )
                                                      {
                                                        if ( VerQueryValueW(
                                                               *(LPCVOID *)(a1 - 4744),
                                                               (LPCWSTR)(a1 - 292),
                                                               (LPVOID *)(a1 - 4772),
                                                               (PUINT)(a1 - 4864)) )
                                                        {
                                                          v86 = *(_DWORD *)(a1 - 4864);
                                                          v87 = *(const wchar_t **)(a1 - 4772);
                                                          v88 = wcsrchr((const wchar_t *)(a1 - 3180), 0x5Cu);
                                                          if ( !wcsncmp(v88 + 1, v87, v86) )
                                                            *(_DWORD *)(a1 - 4756) = 1;
                                                        }
                                                      }
                                                    }
                                                  }
                                                }
                                                v89 = *(void **)(a1 - 4744);
                                                v90 = GetProcessHeap();
                                                HeapFree(v90, (DWORD)a2, v89);
                                                if ( *(HWND *)(a1 - 4756) != a2 )
    LABEL_150:
                                                  JUMPOUT(*(unsigned int *)loc_10027A2);
                                              }
                                            }
                                          }
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
          v47 = 0;
          goto LABEL_136;
        }
        if ( Wow64DisableWow64FsRedirection((PVOID *)(a1 - 4840)) )
        {
          *(_DWORD *)(a1 - 4768) = a2;
          v4 = OpenSCManagerW((LPCWSTR)a2, (LPCWSTR)a2, 1u);
          *(_DWORD *)(a1 - 4748) = v4;
          if ( v4 == a2 )
            goto LABEL_155;
          v5 = OpenServiceW(v4, L"sppuinotify", 1u);
          *(_DWORD *)(a1 - 4764) = v5;
          if ( v5 != a2 )
          {
            if ( !QueryServiceConfigW(
                    *(SC_HANDLE *)(a1 - 4764),
                    (LPQUERY_SERVICE_CONFIGW)a2,
                    (DWORD)a2,
                    (LPDWORD)(a1 - 4776)) )
            {
              if ( GetLastError() == 122 )
              {
                v6 = *(_DWORD *)(a1 - 4776);
                v7 = GetProcessHeap();
                v8 = HeapAlloc(v7, (DWORD)a2, v6);
                *(_DWORD *)(a1 - 4744) = v8;
                if ( v8 == a2 )
                {
                  *(_DWORD *)(a1 - 4768) = 1;
                }
                else
                {
                  if ( QueryServiceConfigW(
                         *(SC_HANDLE *)(a1 - 4764),
                         *(LPQUERY_SERVICE_CONFIGW *)(a1 - 4744),
                         *(_DWORD *)(a1 - 4776),
                         (LPDWORD)(a1 - 4776)) )
                  {
                    if ( *(_DWORD *)(*(_DWORD *)(a1 - 4744) + 4) != 4 )
                      *(_DWORD *)(a1 - 4768) = 1;
                  }
                  v9 = *(void **)(a1 - 4744);
                  v10 = GetProcessHeap();
                  HeapFree(v10, (DWORD)a2, v9);
                }
              }
            }
            CloseServiceHandle(*(SC_HANDLE *)(a1 - 4764));
          }
          CloseServiceHandle(*(SC_HANDLE *)(a1 - 4748));
          if ( *(HWND *)(a1 - 4768) == a2 )
            goto LABEL_155;
          *(_DWORD *)(a1 - 4764) = a2;
          v11 = OpenSCManagerW((LPCWSTR)a2, (LPCWSTR)a2, 1u);
          *(_DWORD *)(a1 - 4744) = v11;
          if ( v11 == a2 )
            goto LABEL_155;
          v12 = OpenServiceW(v11, L"sppsvc", 1u);
          *(_DWORD *)(a1 - 4752) = v12;
          if ( v12 != a2 )
          {
            if ( !QueryServiceConfigW(v12, (LPQUERY_SERVICE_CONFIGW)a2, (DWORD)a2, (LPDWORD)(a1 - 4768)) )
            {
              if ( GetLastError() == 122 )
              {
                v14 = *(_DWORD *)(a1 - 4768);
                v15 = GetProcessHeap();
                v13 = (struct _QUERY_SERVICE_CONFIGW *)HeapAlloc(v15, (DWORD)a2, v14);
                *(_DWORD *)(a1 - 4748) = v13;
                if ( v13 == a2 )
                {
                  *(_DWORD *)(a1 - 4764) = 1;
                }
                else
                {
                  if ( QueryServiceConfigW(*(SC_HANDLE *)(a1 - 4752), v13, *(_DWORD *)(a1 - 4768), (LPDWORD)(a1 - 4768)) )
                  {
                    if ( *(_DWORD *)(*(_DWORD *)(a1 - 4748) + 4) != 4 )
                      *(_DWORD *)(a1 - 4764) = 1;
                  }
                  v16 = *(void **)(a1 - 4748);
                  v17 = GetProcessHeap();
                  HeapFree(v17, (DWORD)a2, v16);
                }
              }
            }
            CloseServiceHandle(*(SC_HANDLE *)(a1 - 4752));
          }
          CloseServiceHandle(*(SC_HANDLE *)(a1 - 4744));
          if ( *(HWND *)(a1 - 4764) == a2 )
            goto LABEL_155;
          if ( SHGetFolderPathW(a2, 37, a2, (DWORD)a2, (LPWSTR)(a1 - 4740)) < 0 )
            goto LABEL_155;
          if ( sub_1009CDF(a1 - 2660, 260, a1 - 4740) < 0 )
            goto LABEL_155;
          if ( sub_1009D19(a1 - 2660, 260, (int)L"\sppuinotify.dll") < 0 )
            goto LABEL_155;
          if ( GetFileAttributesW((LPCWSTR)(a1 - 2660)) == -1 )
            goto LABEL_155;
          *(_DWORD *)(a1 - 4752) = a2;
          v18 = GetFileVersionInfoSizeExW((DWORD)a2, (LPCWSTR)(a1 - 2660), (LPDWORD)(a1 - 4784));
          *(_DWORD *)(a1 - 4748) = v18;
          if ( v18 <= (unsigned int)a2 )
            goto LABEL_155;
          v21 = v18;
          v22 = GetProcessHeap();
          v19 = HeapAlloc(v22, (DWORD)a2, v21);
          v20 = v19;
          if ( v19 != a2 )
          {
            if ( GetFileVersionInfoExW((DWORD)a2, (LPCWSTR)(a1 - 2660), *(_DWORD *)(a1 - 4784), *(_DWORD *)(a1 - 4748), v19) )
            {
              if ( VerQueryValueW(v20, L"\VarFileInfo\Translation", (LPVOID *)(a1 - 4796), (PUINT)(a1 - 4788)) )
              {
                if ( *(_DWORD *)(a1 - 4788) >= 4u )
                {
                  if ( sub_10015C3(
                         (wchar_t *)(a1 - 484),
                         0x30u,
                         L"\StringFileInfo\%04x%04x\OriginalFilename",
                         **(_WORD **)(a1 - 4796),
                         *(_WORD *)(*(_DWORD *)(a1 - 4796) + 2)) >= 0 )
                  {
                    if ( VerQueryValueW(v20, (LPCWSTR)(a1 - 484), (LPVOID *)(a1 - 4812), (PUINT)(a1 - 4804)) )
                    {
                      v23 = *(_DWORD *)(a1 - 4804);
                      v24 = *(const wchar_t **)(a1 - 4812);
                      v25 = wcsrchr((const wchar_t *)(a1 - 2660), 0x5Cu);
                      if ( !wcsncmp(v25 + 1, v24, v23) )
                        *(_DWORD *)(a1 - 4752) = 1;
                    }
                  }
                }
              }
            }
            v26 = GetProcessHeap();
            HeapFree(v26, (DWORD)a2, (LPVOID)v20);
            if ( *(HWND *)(a1 - 4752) == a2 )
              goto LABEL_155;
          }
          if ( sub_1009CDF(a1 - 1620, 260, a1 - 4740) < 0 )
            goto LABEL_155;
          if ( sub_1009D19(a1 - 1620, 260, (int)L"\slui.exe") < 0 )
            goto LABEL_155;
          if ( GetFileAttributesW((LPCWSTR)(a1 - 1620)) == -1 )
            goto LABEL_155;
          *(_DWORD *)(a1 - 4748) = a2;
          v27 = GetFileVersionInfoSizeExW((DWORD)a2, (LPCWSTR)(a1 - 1620), (LPDWORD)(a1 - 4820));
          v28 = v27;
          if ( v27 <= (unsigned int)a2 )
            goto LABEL_155;
          v30 = v27;
          v31 = GetProcessHeap();
          v29 = HeapAlloc(v31, (DWORD)a2, v30);
          *(_DWORD *)(a1 - 4744) = v29;
          if ( v29 != a2 )
          {
            if ( GetFileVersionInfoExW((DWORD)a2, (LPCWSTR)(a1 - 1620), *(_DWORD *)(a1 - 4820), v28, v29) )
            {
              if ( VerQueryValueW(
                     *(LPCVOID *)(a1 - 4744),
                     L"\VarFileInfo\Translation",
                     (LPVOID *)(a1 - 4836),
                     (PUINT)(a1 - 4828)) )
              {
                if ( *(_DWORD *)(a1 - 4828) >= 4u )
                {
                  if ( sub_10015C3(
                         (wchar_t *)(a1 - 100),
                         0x30u,
                         L"\StringFileInfo\%04x%04x\OriginalFilename",
                         **(_WORD **)(a1 - 4836),
                         *(_WORD *)(*(_DWORD *)(a1 - 4836) + 2)) >= 0 )
                  {
                    if ( VerQueryValueW(
                           *(LPCVOID *)(a1 - 4744),
                           (LPCWSTR)(a1 - 100),
                           (LPVOID *)(a1 - 4852),
                           (PUINT)(a1 - 4844)) )
                    {
                      v32 = *(_DWORD *)(a1 - 4844);
                      v33 = *(const wchar_t **)(a1 - 4852);
                      v34 = wcsrchr((const wchar_t *)(a1 - 1620), 0x5Cu);
                      if ( !wcsncmp(v34 + 1, v33, v32) )
                        *(_DWORD *)(a1 - 4748) = 1;
                    }
                  }
                }
              }
            }
            v35 = *(void **)(a1 - 4744);
            v36 = GetProcessHeap();
            HeapFree(v36, (DWORD)a2, v35);
            if ( *(HWND *)(a1 - 4748) == a2 )
              goto LABEL_155;
          }
          if ( sub_1009CDF(a1 - 2140, 260, a1 - 4740) < 0 )
            goto LABEL_155;
          if ( sub_1009D19(a1 - 2140, 260, (int)L"\sppsvc.exe") < 0 )
            goto LABEL_155;
          if ( GetFileAttributesW((LPCWSTR)(a1 - 2140)) == -1 )
            goto LABEL_155;
          *(_DWORD *)(a1 - 4748) = a2;
          v37 = GetFileVersionInfoSizeExW((DWORD)a2, (LPCWSTR)(a1 - 2140), (LPDWORD)(a1 - 4860));
          v38 = v37;
          if ( v37 <= (unsigned int)a2 )
            goto LABEL_155;
          v40 = v37;
          v41 = GetProcessHeap();
          v39 = HeapAlloc(v41, (DWORD)a2, v40);
          *(_DWORD *)(a1 - 4744) = v39;
          if ( v39 == a2 )
            goto LABEL_156;
          if ( GetFileVersionInfoExW((DWORD)a2, (LPCWSTR)(a1 - 2140), *(_DWORD *)(a1 - 4860), v38, v39) )
          {
            if ( VerQueryValueW(
                   *(LPCVOID *)(a1 - 4744),
                   L"\VarFileInfo\Translation",
                   (LPVOID *)(a1 - 4880),
                   (PUINT)(a1 - 4872)) )
            {
              if ( *(_DWORD *)(a1 - 4872) >= 4u )
              {
                if ( sub_10015C3(
                       (wchar_t *)(a1 - 196),
                       0x30u,
                       L"\StringFileInfo\%04x%04x\OriginalFilename",
                       **(_WORD **)(a1 - 4880),
                       *(_WORD *)(*(_DWORD *)(a1 - 4880) + 2)) >= 0 )
                {
                  if ( VerQueryValueW(
                         *(LPCVOID *)(a1 - 4744),
                         (LPCWSTR)(a1 - 196),
                         (LPVOID *)(a1 - 4896),
                         (PUINT)(a1 - 4888)) )
                  {
                    v42 = *(_DWORD *)(a1 - 4888);
                    v43 = *(const wchar_t **)(a1 - 4896);
                    v44 = wcsrchr((const wchar_t *)(a1 - 2140), 0x5Cu);
                    if ( !wcsncmp(v44 + 1, v43, v42) )
                      *(_DWORD *)(a1 - 4748) = 1;
                  }
                }
              }
            }
          }
          v45 = *(void **)(a1 - 4744);
          v46 = GetProcessHeap();
          HeapFree(v46, (DWORD)a2, v45);
          if ( *(HWND *)(a1 - 4748) == a2 )
    LABEL_155:
            v47 = 0;
          else
    LABEL_156:
            v47 = 1;
          Wow64RevertWow64FsRedirection(*(PVOID *)(a1 - 4840));
    LABEL_136:
          if ( (HWND)v47 != a2 )
            goto LABEL_150;
          v2 = 260;
          goto LABEL_138;
        }
      }
    LABEL_138:
      if ( !GetSystemMetrics(67) )
      {
        WinSqmIncrementDWORD(a2, 6859, 1);
        v91 = InterlockedExchange(&Target, 1);
        v95 = (WCHAR *)(a1 - 1100);
        if ( v91 )
        {
          if ( LoadStringW((HINSTANCE)0x1000000, 0xC804u, v95, v2) )
          {
            v92 = FindWindowW((LPCWSTR)a2, (LPCWSTR)(a1 - 1100));
            if ( v92 != a2 )
              SetForegroundWindow(v92);
          }
        }
        else
        {
          v93 = GetModuleFileNameW((HMODULE)0x1000000, v95, v2);
          if ( (HWND)v93 != a2 )
          {
            if ( v93 != v2 || GetLastError() != 122 )
            {
              if ( LoadLibraryW((LPCWSTR)(a1 - 1100)) )
              {
                v94 = CreateThread(
                        (LPSECURITY_ATTRIBUTES)a2,
                        (SIZE_T)a2,
                        (LPTHREAD_START_ROUTINE)StartAddress,
                        a2,
                        (DWORD)a2,
                        (LPDWORD)(a1 - 4772));
                if ( v94 == a2 )
                  InterlockedExchange(&Target, (LONG)a2);
                else
                  CloseHandle(v94);
              }
            }
          }
        }
      }
      goto LABEL_150;
    }
    // 10027A2: using guessed type int loc_10027A2();
    // 1006B98: using guessed type wchar_t aSppsvc_exe[12];
    // 1006BB0: using guessed type wchar_t aSlui_exe[10];
    // 1006BC4: using guessed type wchar_t aSppuinotify_dl[17];
    // 100A020: using guessed type int __stdcall WinSqmIncrementDWORD(_DWORD, _DWORD, _DWORD);
    
    //----- (01006C68) --------------------------------------------------------
    int __usercall sub_1006C68<eax>(int a1<ebp>)
    {
      int v1; // eax@1
      int v3; // ecx@1
    
      v1 = *(_DWORD *)(a1 - 20);
      v3 = **(_DWORD **)v1;
      *(_DWORD *)(a1 - 36) = v3;
      return XcptFilter(v3, v1);
    }
    // 1009DE5: using guessed type int __cdecl XcptFilter(_DWORD, _DWORD);
    
    //----- (01006C7C) --------------------------------------------------------
    void __usercall sub_1006C7C(int a1<ebp>)
    {
      int v1; // eax@1
    
      v1 = *(_DWORD *)(a1 - 36);
      dword_100C070 = *(_DWORD *)(a1 - 36);
      JUMPOUT(dword_100C064, 0, *(unsigned int *)loc_1006C97);
      exit(v1);
    }
    // 1006C97: using guessed type int loc_1006C97();
    // 100C064: using guessed type int dword_100C064;
    // 100C070: using guessed type int dword_100C070;
    
    //----- (01006CB4) --------------------------------------------------------
    signed int __cdecl sub_1006CB4()
    {
      return 1;
    }
    
    //----- (01006DC0) --------------------------------------------------------
    LONG __stdcall sub_1006DC0(int a1)
    {
      return sub_10040FB(a1 - 4);
    }
    
    //----- (01006DDA) --------------------------------------------------------
    LONG __stdcall sub_1006DDA(int a1)
    {
      return sub_1003EA6(a1 - 4);
    }
    
    //----- (01006DF4) --------------------------------------------------------
    int __stdcall sub_1006DF4(int a1, int a2, int a3, int a4)
    {
      if ( a3 == 1 )
        dword_100C00C = a4;
      return 0;
    }
    // 100C00C: using guessed type int dword_100C00C;
    
    //----- (01006E12) --------------------------------------------------------
    signed int __stdcall sub_1006E12(int a1, int a2, int a3)
    {
      return sub_10040C4(a1 - 4, a2, a3);
    }
    
    //----- (01006E32) --------------------------------------------------------
    int __stdcall sub_1006E32(int a1, LPCWSTR lpFileName)
    {
      HANDLE v2; // eax@2
      UINT v4; // [sp+4h] [bp-414h]@2
      void *v5; // [sp+8h] [bp-410h]@2
      DWORD iSize; // [sp+Ch] [bp-40Ch]@3
      int v7; // [sp+10h] [bp-408h]@1
      char Buffer; // [sp+14h] [bp-404h]@3
      unsigned int v9; // [sp+414h] [bp-4h]@1
      int v10; // [sp+418h] [bp+0h]@1
    
      v9 = (unsigned int)&v10 ^ dword_100C010;
      v7 = a1;
      if ( lstrcmpiW(lpFileName, &String2) )
      {
        v4 = SetErrorMode(1u);
        v2 = CreateFileW(lpFileName, 0x80000000u, 1u, 0, 3u, 0x80u, 0);
        v5 = v2;
        if ( v2 != (HANDLE)-1 )
        {
          if ( ReadFile(v2, &Buffer, 0x400u, &iSize, 0) > 0 )
          {
            if ( iSize )
            {
              dword_100C00C = sub_10071C2(&Buffer, iSize);
              if ( dword_100C00C != -1 )
              {
                if ( (**(int (__stdcall ***)(int, _DWORD, int *))v7)(v7, dword_1003C74, &v7) >= 0 )
                {
                  (*(void (__stdcall **)(int, signed int, int))(*(_DWORD *)v7 + 100))(v7, 1, dword_100C00C);
                  (*(void (__stdcall **)(int))(*(_DWORD *)v7 + 8))(v7);
                }
              }
              sub_1002558((int)&String2, 0x104u, (int)lpFileName);
            }
          }
          CloseHandle(v5);
        }
        SetErrorMode(v4);
      }
      return 0;
    }
    // 1003C74: using guessed type int dword_1003C74[5];
    // 100C00C: using guessed type int dword_100C00C;
    // 100C010: using guessed type int dword_100C010;
    
    //----- (01006F5C) --------------------------------------------------------
    int __stdcall sub_1006F5C(int a1, const WCHAR *lpFileName)
    {
      int v2; // edi@1
      int v3; // esi@1
      int v5; // [sp+8h] [bp-4h]@1
    
      v2 = (int)lpFileName;
      v3 = (*(int (__stdcall **)(const WCHAR *, int *))(*(_DWORD *)lpFileName + 56))(lpFileName, &v5);
      if ( v3 >= 0 )
      {
        v3 = (*(int (__stdcall **)(int, signed int, const WCHAR **))(*(_DWORD *)v5 + 20))(v5, -2147123200, &lpFileName);
        if ( v3 >= 0 )
        {
          v3 = sub_1006E32(v2, lpFileName);
          CoTaskMemFree((LPVOID)lpFileName);
        }
        (*(void (__stdcall **)(int))(*(_DWORD *)v5 + 8))(v5);
      }
      return v3;
    }
    
    //----- (01006FB9) --------------------------------------------------------
    LRESULT __stdcall sub_1006FB9(int a1)
    {
      LRESULT result; // eax@1
    
      result = SendMessageW(dword_100C028, 187u, a1 - 1, 0);
      if ( result != -1 )
      {
        SendMessageW(dword_100C028, 0xB1u, result, result);
        result = SendMessageW(dword_100C028, 0xB7u, 0, 0);
      }
      return result;
    }
    
    //----- (01007008) --------------------------------------------------------
    const WCHAR *__stdcall sub_1007008(LPCWSTR lpsz)
    {
      const WCHAR *v1; // eax@1
      const WCHAR v2; // cx@1
      const WCHAR *v3; // edi@1
    
      v2 = *lpsz;
      v3 = lpsz;
      v1 = lpsz;
      if ( *lpsz )
      {
        do
        {
          if ( v2 == 58 || v2 == 92 )
            v3 = v1;
          v1 = CharNextW(v1);
          v2 = *v1;
        }
        while ( *v1 );
        if ( v3 != lpsz )
          ++v3;
      }
      return v3;
    }
    
    //----- (01007051) --------------------------------------------------------
    int __stdcall sub_1007051(HWND hWnd, LPCWSTR lpCaption, LPCWSTR lpText, LPCWSTR lpString, UINT uType)
    {
      int v5; // edi@2
      int v6; // eax@4
      const WCHAR *v7; // edi@4
      int v8; // esi@4
      int v9; // esi@5
    
      if ( lpString )
        v5 = lstrlenW(lpString);
      else
        v5 = 0;
      v8 = lstrlenW(lpText) + v5 + 1;
      v6 = (int)LocalAlloc(0x40u, 2 * v8);
      v7 = (const WCHAR *)v6;
      if ( v6 )
      {
        sub_10047BA((int)lpText, (int)lpString, v6, v8);
        v9 = MessageBoxW(hWnd, v7, lpCaption, uType);
        LocalFree((HLOCAL)v7);
      }
      else
      {
        v9 = MessageBoxW(hWnd, lpText, lpCaption, uType);
      }
      return v9;
    }
    
    //----- (010070D3) --------------------------------------------------------
    __int32 __stdcall sub_10070D3(int a1)
    {
      __int32 result; // eax@1
      __int32 v2; // edi@2
      int v3; // eax@3
      void *v4; // [sp+8h] [bp-14h]@1
      int v5; // [sp+Ch] [bp-10h]@1
      int v6; // [sp+10h] [bp-Ch]@3
      LPARAM lParam; // [sp+14h] [bp-8h]@1
      WPARAM wParam; // [sp+18h] [bp-4h]@1
    
      wParam = 0;
      lParam = 0;
      v5 = lstrlenW(stru_100C0C0.lpstrReplaceWith);
      SendMessageW(dword_100C028, 176u, (WPARAM)&wParam, (LPARAM)&lParam);
      result = SendMessageW(dword_100C028, 0xBDu, 0, 0);
      v4 = (void *)result;
      if ( result )
      {
        result = (__int32)LocalLock((HLOCAL)result);
        v2 = result;
        if ( result )
        {
          v3 = sub_100818F(result + 2 * wParam, lParam - wParam, (int)stru_100C0C0.lpstrFindWhat, dword_100D798, (int)&v6);
          if ( v3 == v2 + 2 * wParam )
          {
            if ( v6 == lParam - wParam )
            {
              SendMessageW(dword_100C028, 0xC2u, 1u, (LPARAM)stru_100C0C0.lpstrReplaceWith);
              SendMessageW(dword_100C028, 0xB1u, wParam, wParam + v5);
              if ( a1 )
                SendMessageW(dword_100C028, 0xB7u, 0, 0);
            }
          }
          result = LocalUnlock(v4);
        }
      }
      return result;
    }
    // 100D798: using guessed type int dword_100D798;
    
    //----- (010071C2) --------------------------------------------------------
    int __stdcall sub_10071C2(const void *lpv, int iSize)
    {
      int result; // eax@1
      int v3; // ecx@2
    
      result = 0;
      if ( (unsigned int)iSize > 1 )
      {
        v3 = *(_WORD *)lpv;
        if ( v3 != 48111 )
        {
          if ( v3 == 65279 )
            return 1;
          if ( v3 != 65534 )
          {
            if ( !sub_100991D(lpv, iSize) )
              return sub_10098C7((int)lpv, iSize) != 0 ? 3 : 0;
            return 1;
          }
          return 2;
        }
        if ( (unsigned int)iSize > 2 && *((_BYTE *)lpv + 2) == -65 )
          return 3;
      }
      return result;
    }
    
    //----- (0100722E) --------------------------------------------------------
    signed int __stdcall sub_100722E(HWND hWndParent, int a2, HWND hWnd, int a4)
    {
      LPARAM v4; // ecx@6
      HWND v5; // esi@13
      int v6; // eax@15
      int v7; // eax@18
      HWND v9; // [sp-10h] [bp-1Ch]@17
      const WCHAR *v10; // [sp-Ch] [bp-18h]@17
      UINT v11; // [sp-8h] [bp-14h]@17
      ULONG_PTR v12; // [sp-4h] [bp-10h]@17
      struct tagPOINT Point; // [sp+4h] [bp-8h]@14
    
      if ( a2 == 83 )
      {
        v7 = GetDlgCtrlID(*(HWND *)(a4 + 12));
        if ( v7 != 257 && v7 != 259 )
          return 0;
        v12 = (ULONG_PTR)dword_1006D38;
        v11 = 12;
        v10 = lpszHelp;
        v9 = *(HWND *)(a4 + 12);
      }
      else
      {
        if ( a2 != 123 )
        {
          if ( a2 == 272 )
          {
            SendDlgItemMessageW(hWndParent, 257, 323u, 0, dword_100C334);
            SendDlgItemMessageW(hWndParent, 257, 0x143u, 0, dword_100C338);
            SendDlgItemMessageW(hWndParent, 257, 0x143u, 0, dword_100C33C);
            SendDlgItemMessageW(hWndParent, 257, 0x143u, 0, dword_100C340);
            v4 = dword_100C334;
            dword_100E040 = dword_100C00C;
            switch ( dword_100C00C )
            {
              case 1:
                v4 = dword_100C338;
                break;
              case 2:
                v4 = dword_100C33C;
                break;
              case 3:
                v4 = dword_100C340;
                break;
            }
            SendDlgItemMessageW(hWndParent, 257, 0x14Du, 0xFFFFFFFFu, v4);
          }
          else
          {
            if ( a2 == 273 )
              dword_100E040 = SendDlgItemMessageW(hWndParent, 257, 0x147u, 0, 0);
          }
          return 0;
        }
        v5 = hWnd;
        if ( hWndParent == hWnd )
        {
          GetCursorPos(&Point);
          ScreenToClient(hWndParent, &Point);
          v5 = ChildWindowFromPoint(hWndParent, Point);
        }
        v6 = GetDlgCtrlID(v5);
        if ( v6 != 257 && v6 != 259 )
          return 0;
        v12 = (ULONG_PTR)dword_1006D38;
        v11 = 10;
        v10 = lpszHelp;
        v9 = v5;
      }
      WinHelpW(v9, v10, v11, v12);
      return 1;
    }
    // 1006D38: using guessed type int dword_1006D38[6];
    // 100C00C: using guessed type int dword_100C00C;
    // 100E040: using guessed type int dword_100E040;
    
    //----- (0100739B) --------------------------------------------------------
    signed int __stdcall sub_100739B(DWORD hDlg, int a2, HWND hWnd, int a4)
    {
      HWND v4; // ebx@1
      LPARAM v5; // ecx@7
      int v6; // eax@16
      int v7; // eax@19
      HWND v9; // eax@24
      HANDLE v10; // eax@26
      int v11; // eax@29
      LPARAM v12; // ecx@29
      int v13; // eax@29
      int v14; // eax@30
      HWND v15; // [sp-10h] [bp-638h]@18
      const WCHAR *v16; // [sp-Ch] [bp-634h]@18
      UINT v17; // [sp-8h] [bp-630h]@18
      ULONG_PTR v18; // [sp-4h] [bp-62Ch]@18
      struct tagPOINT Point; // [sp+Ch] [bp-61Ch]@15
      HANDLE hObject; // [sp+14h] [bp-614h]@26
      DWORD iSize; // [sp+18h] [bp-610h]@1
      char Buffer; // [sp+1Ch] [bp-60Ch]@27
      LPARAM String1; // [sp+41Ch] [bp-20Ch]@24
      unsigned int v24; // [sp+624h] [bp-4h]@1
      int v25; // [sp+628h] [bp+0h]@1
    
      v24 = (unsigned int)&v25 ^ dword_100C010;
      v4 = hWnd;
      iSize = hDlg;
      if ( a2 == 78 )
      {
        if ( *(_DWORD *)(a4 + 8) == -602 )
        {
          v9 = GetParent((HWND)hDlg);
          if ( SendMessageW(v9, 0x465u, 0x104u, (LPARAM)&String1) > 0 )
          {
            if ( lstrcmpiW((LPCWSTR)&String1, &word_100D588) )
            {
              v10 = CreateFileW((LPCWSTR)&String1, 0x80000000u, 1u, 0, 3u, 0x80u, 0);
              hObject = v10;
              if ( v10 != (HANDLE)-1 )
              {
                if ( ReadFile(v10, &Buffer, 0x400u, &iSize, 0) > 0 )
                {
                  if ( iSize )
                  {
                    v13 = sub_10071C2(&Buffer, iSize);
                    v12 = dword_100C334;
                    dword_100C00C = v13;
                    v11 = v13 - 1;
                    if ( v11 )
                    {
                      v14 = v11 - 1;
                      if ( v14 )
                      {
                        if ( v14 == 1 )
                          v12 = dword_100C340;
                      }
                      else
                      {
                        v12 = dword_100C33C;
                      }
                    }
                    else
                    {
                      v12 = dword_100C338;
                    }
                    SendDlgItemMessageW((HWND)hDlg, 257, 0x14Du, 0xFFFFFFFFu, v12);
                    sub_1002558((int)&word_100D588, 0x104u, (int)&String1);
                  }
                }
                CloseHandle(hObject);
              }
            }
          }
        }
        return 0;
      }
      if ( a2 == 83 )
      {
        v7 = GetDlgCtrlID(*(HWND *)(a4 + 12));
        if ( v7 != 257 && v7 != 259 )
          return 0;
        v18 = (ULONG_PTR)dword_1006D38;
        v17 = 12;
        v16 = lpszHelp;
        v15 = *(HWND *)(a4 + 12);
        goto LABEL_22;
      }
      if ( a2 == 123 )
      {
        if ( (HWND)hDlg == hWnd )
        {
          GetCursorPos(&Point);
          ScreenToClient((HWND)hDlg, &Point);
          v4 = ChildWindowFromPoint((HWND)hDlg, Point);
        }
        v6 = GetDlgCtrlID(v4);
        if ( v6 != 257 && v6 != 259 )
          return 0;
        v18 = (ULONG_PTR)dword_1006D38;
        v17 = 10;
        v16 = lpszHelp;
        v15 = v4;
    LABEL_22:
        WinHelpW(v15, v16, v17, v18);
        return 1;
      }
      if ( a2 == 272 )
      {
        SendDlgItemMessageW((HWND)hDlg, 257, 323u, 0, dword_100C334);
        SendDlgItemMessageW((HWND)iSize, 257, 0x143u, 0, dword_100C338);
        SendDlgItemMessageW((HWND)iSize, 257, 0x143u, 0, dword_100C33C);
        SendDlgItemMessageW((HWND)iSize, 257, 0x143u, 0, dword_100C340);
        v5 = dword_100C334;
        switch ( dword_100C00C )
        {
          case 1:
            v5 = dword_100C338;
            break;
          case 2:
            v5 = dword_100C33C;
            break;
          case 3:
            v5 = dword_100C340;
            break;
        }
        SendDlgItemMessageW((HWND)iSize, 257, 0x14Du, 0xFFFFFFFFu, v5);
      }
      else
      {
        if ( a2 == 273 )
          dword_100C00C = SendDlgItemMessageW((HWND)hDlg, 257, 0x147u, 0, 0);
      }
      return 0;
    }
    // 1006D38: using guessed type int dword_1006D38[6];
    // 100C00C: using guessed type int dword_100C00C;
    // 100C010: using guessed type int dword_100C010;
    
    //----- (0100765B) --------------------------------------------------------
    signed int __stdcall DialogFunc(HWND hWnd, int a2, unsigned __int16 a3, int a4)
    {
      int v4; // eax@9
      int v5; // ST10_4@9
      LRESULT v6; // eax@12
      LRESULT v8; // eax@14
      INT_PTR v9; // [sp-4h] [bp-E4h]@7
      LPARAM lParam; // [sp+Ch] [bp-D4h]@14
      WPARAM wParam; // [sp+10h] [bp-D0h]@14
      WCHAR SrcStr; // [sp+14h] [bp-CCh]@9
      unsigned int v13; // [sp+DCh] [bp-4h]@1
      int v14; // [sp+E0h] [bp+0h]@1
    
      v13 = (unsigned int)&v14 ^ dword_100C010;
      if ( a2 == 272 )
      {
        SendMessageW(dword_100C028, 176u, (WPARAM)&wParam, (LPARAM)&lParam);
        v8 = SendMessageW(dword_100C028, 0xC9u, wParam, 0);
        sub_10015C3(&SrcStr, 0x64u, L"%d", v8 + 1);
        SetDlgItemTextW(hWnd, 258, &SrcStr);
        SetFocus(hWnd);
        return 1;
      }
      if ( a2 != 273 )
        return 0;
      if ( a3 == 1 )
      {
        GetDlgItemTextW(hWnd, 258, &SrcStr, 100);
        FoldStringW(0x80u, &SrcStr, -1, &SrcStr, 100);
        dword_100E160 = wtol(&SrcStr);
        v4 = ((int (__thiscall *)(int, HWND, signed int, int, _DWORD))SendMessageW)(
               v5,
               dword_100C028,
               187,
               dword_100E160 - 1,
               0);
        if ( dword_100E160 && v4 != -1 )
        {
          v9 = 0;
          goto LABEL_8;
        }
        MessageBoxW(hWnd, dword_100C330, lpCaption, 0);
        v6 = SendMessageW(dword_100C028, 0xBAu, 0, 0);
        sub_10015C3(&SrcStr, 0x64u, L"%d", v6);
        SetDlgItemTextW(hWnd, 258, &SrcStr);
        SetFocus(hWnd);
        return 0;
      }
      if ( a3 == 2 )
      {
        v9 = 1;
    LABEL_8:
        EndDialog(hWnd, v9);
        return 1;
      }
      if ( a3 != 258 )
        return 0;
      return 1;
    }
    // 100C010: using guessed type int dword_100C010;
    // 100E160: using guessed type int dword_100E160;
    
    //----- (010077F3) --------------------------------------------------------
    signed int __stdcall sub_10077F3(int a1)
    {
      signed int result; // eax@1
    
      result = 0;
      if ( !a1 )
      {
        if ( CommDlgExtendedError() )
        {
          sub_100432B();
          result = -2147467259;
        }
        else
        {
          result = -2147023673;
        }
      }
      return result;
    }
    
    //----- (01007823) --------------------------------------------------------
    signed int __stdcall sub_1007823(int a1, int *a2)
    {
      signed int v2; // edi@1
      WCHAR *v3; // eax@2
      int v4; // eax@3
    
      v2 = -2147467259;
      if ( a2 )
      {
        v3 = (WCHAR *)CoTaskMemAlloc(0x208u);
        *a2 = (int)v3;
        if ( v3 )
        {
          stru_100C1A0.lpstrFile = v3;
          sub_1002558(*a2, 0x104u, (int)L"*.txt");
          stru_100C1A0.lpstrTitle = (LPCWSTR)dword_100C30C;
          stru_100C1A0.lpstrFilter = &Dest;
          stru_100C1A0.lpstrDefExt = L"txt";
          stru_100C1A0.Flags = 8917092;
          stru_100C1A0.nFilterIndex = 1;
          stru_100C1A0.lpTemplateName = (LPCWSTR)15;
          stru_100C1A0.lpfnHook = (LPOFNHOOKPROC)sub_100739B;
          v4 = GetOpenFileNameW(&stru_100C1A0);
          v2 = sub_10077F3(v4);
          if ( v2 < 0 )
            CoTaskMemFree((LPVOID)*a2);
        }
      }
      return v2;
    }
    // 1003C6C: using guessed type wchar_t aTxt[4];
    // 100C30C: using guessed type int dword_100C30C;
    
    //----- (010078D3) --------------------------------------------------------
    signed int __stdcall sub_10078D3(int a1, int a2, LPWSTR *a3)
    {
      signed int v3; // edi@1
      int v4; // eax@2
      int v5; // eax@3
    
      v3 = -2147467259;
      if ( a3 )
      {
        v4 = (int)CoTaskMemAlloc(0x208u);
        *a3 = (LPWSTR)v4;
        if ( v4 )
        {
          sub_1002558(v4, 0x104u, a2);
          stru_100C1A0.lpstrFile = *a3;
          stru_100C1A0.lpstrTitle = (LPCWSTR)dword_100C310;
          stru_100C1A0.Flags = 8947814;
          stru_100C1A0.lpTemplateName = (LPCWSTR)15;
          stru_100C1A0.lpfnHook = (LPOFNHOOKPROC)sub_100722E;
          stru_100C1A0.lpstrFilter = &word_100C7E0;
          stru_100C1A0.lpstrDefExt = L"txt";
          dword_100C038 = 1;
          stru_100C1A0.nFilterIndex = 1;
          v5 = GetSaveFileNameW(&stru_100C1A0);
          v3 = sub_10077F3(v5);
          if ( v3 < 0 )
            CoTaskMemFree(*a3);
        }
      }
      return v3;
    }
    // 1003C6C: using guessed type wchar_t aTxt[4];
    // 100C038: using guessed type int dword_100C038;
    // 100C310: using guessed type int dword_100C310;
    
    //----- (01007985) --------------------------------------------------------
    signed int __usercall sub_1007985<eax>(int a1<ebp>)
    {
      signed int result; // eax@1
      HANDLE v2; // edi@1
    
      v2 = hFile;
      result = sub_1001664(0);
      if ( result )
      {
        hFile = CreateFileW(&word_100D378, 0x80000000u, 3u, 0, 3u, 0x80u, 0);
        if ( hFile == (HANDLE)-1 )
        {
          result = sub_1007BF6(&word_100D378);
        }
        else
        {
          result = sub_1002820(a1, (int)&word_100D378, -1);
          if ( result )
            return result;
        }
        hFile = v2;
      }
      return result;
    }
    
    //----- (010079E3) --------------------------------------------------------
    void __stdcall sub_10079E3(HDROP hDrop, HWND hWnd)
    {
      int ebp0; // ebp@0
    
      if ( DragQueryFileW(hDrop, -1u, 0, 0) )
      {
        DragQueryFileW(hDrop, 0, (LPWSTR)&word_100D378, 0x104u);
        SetActiveWindow(hWnd);
        sub_1007985(ebp0);
        SHAddToRecentDocs(3u, &word_100D378);
      }
      DragFinish(hDrop);
    }
    
    //----- (01007A3C) --------------------------------------------------------
    int __stdcall Proc(int a1, int a2, int a3, int a4)
    {
      *(_BYTE *)(a4 + 23) = *(_BYTE *)(a1 + 23);
      return 0;
    }
    
    //----- (01007A58) --------------------------------------------------------
    int __userpurge sub_1007A58<eax>(int result<eax>, int a2, int a3, int a4)
    {
      int v4; // edx@1
      int v5; // ecx@2
    
      v4 = a4;
      if ( a4 )
      {
        result = a3;
        v5 = a2;
        do
        {
          *(_WORD *)v5 = (*(_WORD *)result << 8) ^ *(_BYTE *)(result + 1);
          v5 += 2;
          result += 2;
          --v4;
        }
        while ( v4 );
      }
      return result;
    }
    
    //----- (01007A90) --------------------------------------------------------
    signed int __stdcall sub_1007A90(HANDLE hFile, UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar)
    {
      int v6; // edi@5
      HLOCAL v7; // eax@6
      int v8; // esi@9
      DWORD NumberOfBytesWritten; // [sp+4h] [bp-10h]@10
      char v10; // [sp+8h] [bp-Ch]@4
      LPCVOID hMem; // [sp+Ch] [bp-8h]@6
      LPBOOL lpUsedDefaultChar; // [sp+10h] [bp-4h]@3
    
      if ( !cchWideChar )
        return 1;
      lpUsedDefaultChar = 0;
      if ( CodePage != 65001 )
        lpUsedDefaultChar = (LPBOOL)&v10;
      v6 = WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, 0, 0, 0, lpUsedDefaultChar);
      if ( !v6 )
        return 0;
      v7 = LocalAlloc(0x40u, v6 + 1);
      hMem = v7;
      if ( !v7 )
      {
        SetLastError(8u);
        return 0;
      }
      v8 = WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, (LPSTR)v7, v6, 0, lpUsedDefaultChar);
      if ( v8 )
        v8 = WriteFile(hFile, hMem, v6, &NumberOfBytesWritten, 0);
      LocalFree((HLOCAL)hMem);
      return v8;
    }
    
    //----- (01007B40) --------------------------------------------------------
    LRESULT __cdecl sub_1007B40()
    {
      LRESULT result; // eax@5
    
      if ( wParam )
      {
        if ( dword_100C040 )
        {
          sub_1006FB9(1);
        }
        else
        {
          SendMessageW(dword_100C028, 0xB0u, (WPARAM)&dword_100D794, (LPARAM)&dword_100D790);
          SendMessageW(dword_100C028, 0xB1u, 0, 0);
        }
        result = SendMessageW(dword_100C028, 0xC8u, 0, 0);
      }
      return result;
    }
    // 100C040: using guessed type int dword_100C040;
    
    //----- (01007BA2) --------------------------------------------------------
    LRESULT __cdecl sub_1007BA2()
    {
      LRESULT result; // eax@1
    
      result = 0;
      if ( wParam )
      {
        if ( dword_100C040 )
        {
          result = sub_1008383(0x50200104u);
        }
        else
        {
          SendMessageW(dword_100C028, 200u, 1u, 0);
          result = SendMessageW(dword_100C028, 0xB1u, dword_100D794, dword_100D790);
        }
      }
      return result;
    }
    // 100C040: using guessed type int dword_100C040;
    
    //----- (01007BF6) --------------------------------------------------------
    int __stdcall sub_1007BF6(LPCWSTR lpString)
    {
      DWORD v1; // eax@1
      int result; // eax@2
      WCHAR Text; // [sp+4h] [bp-204h]@1
      unsigned int v4; // [sp+204h] [bp-4h]@1
      int v5; // [sp+208h] [bp+0h]@1
    
      v4 = (unsigned int)&v5 ^ dword_100C010;
      v1 = GetLastError();
      if ( FormatMessageW(0x1200u, 0, v1, 0, &Text, 0x100u, 0) )
        result = MessageBoxW(hWnd, &Text, szApp, 0x30u);
      else
        result = sub_1007051(hWnd, szApp, dword_100C2B0, lpString, 0x30u);
      return result;
    }
    // 100C010: using guessed type int dword_100C010;
    
    //----- (01007C80) --------------------------------------------------------
    signed int __userpurge sub_1007C80<eax>(int a1<eax>, int a2<edx>, int a3<ecx>, int a4, int a5)
    {
      signed int result; // eax@1
      int v6; // ebx@1
      int v7; // edi@1
      int v8; // esi@1
    
      v6 = a1;
      v8 = a2;
      result = 0;
      v7 = 0;
      if ( !a2 )
        goto LABEL_11;
      do
      {
        if ( !a5 )
          break;
        if ( !*(_WORD *)v6 )
          break;
        *(_WORD *)a3 = *(_WORD *)v6;
        a3 += 2;
        v6 += 2;
        --v8;
        --a5;
        ++v7;
      }
      while ( v8 );
      if ( !v8 )
      {
    LABEL_11:
        a3 -= 2;
        --v7;
        result = -2147024774;
      }
      *(_WORD *)a3 = 0;
      if ( a4 )
        *(_DWORD *)a4 = v7;
      return result;
    }
    
    //----- (01007CD7) --------------------------------------------------------
    signed int __stdcall sub_1007CD7(HWND hWnd, LPCWSTR lpString1, LPCWSTR lpBuffer)
    {
      DWORD v3; // eax@1
      DWORD v5; // eax@8
      bool v6; // ecx@8
      LRESULT v7; // eax@10
      int v8; // ebx@10
      BOOL *v9; // eax@17
      DWORD v10; // edi@17
      int v11; // eax@19
      BOOL v12; // eax@24
      int v13; // edi@25
      int v14; // eax@25
      bool v15; // [sp+4h] [bp-14h]@8
      BOOL UsedDefaultChar; // [sp+8h] [bp-10h]@1
      HLOCAL hMem; // [sp+Ch] [bp-Ch]@10
      UINT CodePage; // [sp+10h] [bp-8h]@17
      DWORD NumberOfBytesWritten; // [sp+14h] [bp-4h]@15
      const void *v20; // [sp+28h] [bp+10h]@11
    
      v3 = 1;
      UsedDefaultChar = 0;
      if ( lpBuffer )
        v3 = 3;
      hFile = CreateFileW(lpString1, 0xC0000000u, v3, 0, 4u, 0x80u, 0);
      if ( hFile == (HANDLE)-1 )
      {
        if ( lpBuffer || GetLastError() != 5 )
          sub_1007BF6(lpString1);
        return 0;
      }
      v5 = GetLastError();
      v6 = v5 != 183;
      v15 = v5 != 183;
      if ( wParam )
        sub_1007B40();
      v8 = ((int (__thiscall *)(bool, HWND, signed int, _DWORD, _DWORD))SendMessageW)(v6, dword_100C028, 14, 0, 0);
      v7 = SendMessageW(dword_100C028, 0xBDu, 0, 0);
      hMem = (HLOCAL)v7;
      if ( !v7 || (v20 = LocalLock((HLOCAL)v7), !v20) )
        goto LABEL_30;
      if ( dword_100E040 == 1 )
      {
        WriteFile(hFile, &unk_100CD54, 2u, &NumberOfBytesWritten, 0);
        v12 = WriteFile(hFile, v20, 2 * v8, &NumberOfBytesWritten, 0);
      }
      else
      {
        if ( dword_100E040 == 2 )
        {
          v14 = WriteFile(hFile, &unk_100CD58, 2u, &NumberOfBytesWritten, 0);
          sub_1007A58(v14, (int)v20, (int)v20, v8);
          v13 = WriteFile(hFile, v20, 2 * v8, &NumberOfBytesWritten, 0);
          sub_1007A58(v13, (int)v20, (int)v20, v8);
          goto LABEL_28;
        }
        if ( dword_100E040 == 3 )
          WriteFile(hFile, &unk_100CD50, 3u, &NumberOfBytesWritten, 0);
        if ( dword_100E040 == 3 )
        {
          v9 = 0;
          CodePage = 65001;
          v10 = 0;
        }
        else
        {
          CodePage = GetACP();
          v9 = &UsedDefaultChar;
          v10 = 1024;
        }
        v11 = WideCharToMultiByte(CodePage, v10, (LPCWSTR)v20, v8, 0, 0, 0, v9);
        if ( UsedDefaultChar || v8 && !v11 )
        {
          if ( sub_1007051(hWnd, szApp, dword_100C320, lpString1, 0x31u) == 2 )
          {
    LABEL_31:
            SetCursor(dword_100C094);
            CloseHandle(hFile);
            hFile = (HANDLE)-1;
            if ( hMem )
              LocalUnlock(hMem);
            if ( v15 )
              DeleteFileW(lpString1);
            if ( wParam )
              sub_1007BA2();
            return 0;
          }
          v10 = 0;
        }
        v12 = sub_1007A90(hFile, CodePage, v10, (LPCWSTR)v20, v8);
      }
      v13 = v12;
    LABEL_28:
      if ( !v13 )
      {
        SetCursor(dword_100C094);
    LABEL_30:
        sub_1007BF6(lpString1);
        goto LABEL_31;
      }
      SetEndOfFile(hFile);
      dword_100C00C = dword_100E040;
      SendMessageW(dword_100C028, 0xB9u, 0, 0);
      sub_1002456(lpString1);
      dword_100C008 = 0;
      CloseHandle(hFile);
      hFile = (HANDLE)-1;
      LocalUnlock(hMem);
      if ( wParam )
        sub_1007BA2();
      SetCursor(dword_100C094);
      return 1;
    }
    // 100C008: using guessed type int dword_100C008;
    // 100C00C: using guessed type int dword_100C00C;
    // 100E040: using guessed type int dword_100E040;
    
    //----- (01007F99) --------------------------------------------------------
    signed int __stdcall sub_1007F99(int a1, unsigned int a2, int a3)
    {
      signed int result; // eax@1
      unsigned int v4; // edx@1
      int v5; // eax@5
      int v6; // ecx@5
      unsigned int v7; // esi@5
      signed int v8; // [sp+14h] [bp+Ch]@5
    
      v4 = a2;
      result = 0;
      if ( !a2 || a2 > 0x7FFFFFFF )
        result = -2147024809;
      if ( result < 0 )
      {
        v6 = 0;
      }
      else
      {
        v8 = 0;
        v6 = 0;
        v7 = v4;
        v5 = a1;
        if ( !v4 )
          goto LABEL_17;
        do
        {
          if ( !*(_WORD *)v5 )
            break;
          v5 += 2;
          --v7;
        }
        while ( v7 );
        if ( v7 )
          v6 = v4 - v7;
        else
    LABEL_17:
          v8 = -2147024809;
        result = v8;
      }
      if ( result >= 0 )
        result = sub_1007C80(a3, v4 - v6, a1 + 2 * v6, 0, 2147483647);
      return result;
    }
    
    //----- (0100800F) --------------------------------------------------------
    signed int __stdcall sub_100800F(int a1)
    {
      signed int result; // eax@2
      HLOCAL v2; // eax@3
    
      if ( !a1 || (result = sub_1001664(0)) != 0 )
      {
        SendMessageW(dword_100C028, 12u, 0, (LPARAM)&szOtherStuff);
        dword_100C008 = 1;
        sub_1002558((int)&FileName, 0x104u, (int)lpString2);
        sub_1002456(&FileName);
        SendMessageW(dword_100C028, 0xB1u, 0, 0);
        SendMessageW(dword_100C028, 0xB7u, 0, 0);
        v2 = LocalReAlloc(hMem, 2u, 2u);
        if ( v2 )
          hMem = v2;
        *(_WORD *)LocalLock(hMem) = 0;
        LocalUnlock(hMem);
        SendMessageW(dword_100C028, 0xBCu, (WPARAM)hMem, 0);
        result = 0;
        word_100C9E0 = 0;
      }
      return result;
    }
    // 100C008: using guessed type int dword_100C008;
    
    //----- (010080E4) --------------------------------------------------------
    int __stdcall sub_10080E4(int lpString, unsigned int a2)
    {
      int result; // eax@1
      unsigned int i; // ecx@1
      int v4; // edx@6
    
      result = lstrlenW((LPCWSTR)lpString);
      for ( i = lpString + 2 * result; ; i -= 2 )
      {
        v4 = *(_WORD *)i;
        if ( v4 == 46 )
          break;
        if ( v4 == 92 || v4 == 58 || i <= lpString )
          break;
      }
      if ( *(_WORD *)i != 46 )
      {
        result += 5;
        if ( (unsigned int)result <= 0x104 )
          result = sub_1007F99(lpString, a2, (int)L".txt");
      }
      return result;
    }
    // 1008134: using guessed type wchar_t a_txt_0[5];
    
    //----- (01008143) --------------------------------------------------------
    int __stdcall sub_1008143(int a1, int a2, int a3, int a4, int a5)
    {
      int v5; // eax@1
      int result; // eax@3
    
      v5 = FindNLSString(1024, a4 == 0 | 0x800000, a1, a2, a3, -1, a5);
      if ( v5 == -1 || *(_DWORD *)a5 < 1 )
        result = 0;
      else
        result = a1 + 2 * v5;
      return result;
    }
    // 100102C: using guessed type int __stdcall FindNLSString(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
    
    //----- (0100818F) --------------------------------------------------------
    int __stdcall sub_100818F(int a1, int a2, int a3, int a4, int a5)
    {
      int v5; // eax@1
      int result; // eax@3
    
      v5 = FindNLSString(1024, a4 == 0 | 0x400000, a1, a2, a3, -1, a5);
      if ( v5 == -1 || *(_DWORD *)a5 < 1 )
        result = 0;
      else
        result = a1 + 2 * v5;
      return result;
    }
    // 100102C: using guessed type int __stdcall FindNLSString(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
    
    //----- (010081DB) --------------------------------------------------------
    signed int __stdcall sub_10081DB(int a1)
    {
      signed int result; // eax@2
      HMENU v2; // eax@3
      HMENU v3; // eax@3
      LRESULT v4; // eax@5
      int v5; // ebx@6
      int v6; // eax@9
      int v7; // eax@11
      int v8; // eax@12
      int v9; // esi@13
      HWND v10; // eax@15
      HCURSOR v11; // edi@15
      HMENU v12; // eax@19
      HMENU v13; // [sp+4h] [bp-1Ch]@3
      void *v14; // [sp+8h] [bp-18h]@5
      signed int v15; // [sp+Ch] [bp-14h]@1
      signed int v16; // [sp+10h] [bp-10h]@1
      int v17; // [sp+14h] [bp-Ch]@11
      WPARAM wParam; // [sp+18h] [bp-8h]@3
      LPARAM lParam; // [sp+1Ch] [bp-4h]@3
    
      v15 = 0;
      v16 = 0;
      if ( *(_WORD *)a1 )
      {
        SendMessageW(dword_100C028, 176u, (WPARAM)&wParam, (LPARAM)&lParam);
        v2 = GetMenu(hWnd);
        v13 = v2;
        v3 = GetSubMenu(v2, 1);
        if ( GetMenuState(v3, 0x19u, 0) == 1 )
        {
          v16 = 1;
          lParam = 0;
        }
        v4 = SendMessageW(dword_100C028, 0xBDu, 0, 0);
        v14 = (void *)v4;
        if ( v4 && (v5 = (int)LocalLock((HLOCAL)v4)) != 0 )
        {
          if ( dword_100D79C )
          {
            v6 = lParam;
            if ( wParam != lParam )
              v6 = lParam - 1;
            v7 = sub_1008143(v5, v6, a1, dword_100D798, (int)&v17);
          }
          else
          {
            v8 = GetWindowTextLengthW(dword_100C028);
            v7 = sub_100818F(v5 + 2 * lParam, v8 - lParam, a1, dword_100D798, (int)&v17);
          }
          v9 = v7;
          LocalUnlock(v14);
          if ( v9 )
          {
            wParam = (v9 - v5) >> 1;
            SendMessageW(dword_100C028, 0xB1u, wParam, wParam + v17);
            if ( v16 )
            {
              v12 = GetSubMenu(v13, 1);
              EnableMenuItem(v12, 0x19u, 0);
            }
            if ( !(stru_100C0C0.Flags & 0x20) )
            {
              SendMessageW(dword_100C028, 0xB7u, 0, 0);
              sub_100170A(1u);
            }
            v15 = 1;
          }
          else
          {
            if ( !(stru_100C0C0.Flags & 0x20) )
            {
              v11 = SetCursor(dword_100C094);
              v10 = dword_100CCE8;
              if ( !dword_100CCE8 )
                v10 = hWnd;
              sub_1007051(v10, szApp, dword_100C2C4, &word_100C9E0, 0x40u);
              SetCursor(v11);
            }
          }
          result = v15;
        }
        else
        {
          result = 0;
        }
      }
      else
      {
        result = 0;
      }
      return result;
    }
    // 100D798: using guessed type int dword_100D798;
    // 100D79C: using guessed type int dword_100D79C;
    
    //----- (01008383) --------------------------------------------------------
    signed int __stdcall sub_1008383(DWORD hWnd)
    {
      LONG v2; // eax@12
      struct tagRECT Rect; // [sp+Ch] [bp-38h]@8
      int v4; // [sp+1Ch] [bp-28h]@17
      int v5; // [sp+20h] [bp-24h]@17
      int v6; // [sp+24h] [bp-20h]@17
      int v7; // [sp+28h] [bp-1Ch]@17
      WPARAM wParam; // [sp+2Ch] [bp-18h]@3
      LPARAM lParam; // [sp+30h] [bp-14h]@8
      LRESULT v10; // [sp+34h] [bp-10h]@3
      DWORD v11; // [sp+38h] [bp-Ch]@1
      HCURSOR hCursor; // [sp+3Ch] [bp-8h]@1
      HLOCAL hMem; // [sp+40h] [bp-4h]@3
      HWND v14; // [sp+4Ch] [bp+8h]@8
    
      v11 = (hWnd >> 20) & 1;
      hCursor = SetCursor(::hCursor);
      if ( (hWnd >> 20) & 1 )
      {
        sub_1006FB9(1);
        SendMessageW(dword_100C028, 0xC8u, 0, 0);
      }
      wParam = SendMessageW(dword_100C028, 0xB8u, 0, 0) != 0;
      v10 = SendMessageW(dword_100C028, 0xEu, 0, 0);
      hMem = LocalAlloc(2u, 2 * v10 + 2);
      if ( !hMem )
      {
        if ( v11 )
          SendMessageW(dword_100C028, 0xC8u, 1u, 0);
        SetCursor(hCursor);
        return 0;
      }
      GetClientRect(::hWnd, &Rect);
      lParam = (LPARAM)LocalLock(hMem);
      SendMessageW(dword_100C028, 0xDu, v10 + 1, lParam);
      v14 = CreateWindowExW(
              0x200u,
              L"Edit",
              &szOtherStuff,
              hWnd,
              0,
              0,
              Rect.right,
              Rect.bottom,
              ::hWnd,
              (HMENU)0xF,
              hInstance,
              0);
      if ( !v14 )
      {
        SetCursor(hCursor);
        if ( v11 )
          SendMessageW(dword_100C028, 0xC8u, 1u, 0);
    LABEL_11:
        LocalUnlock(hMem);
        LocalFree(hMem);
        return 0;
      }
      v2 = GetWindowLongW(dword_100C028, -20);
      SetWindowLongW(v14, -20, v2 | 0x200);
      SendMessageW(v14, 0x30u, (WPARAM)ho, 1);
      if ( !SendMessageW(v14, 0xCu, 0, lParam) )
      {
        SetCursor(hCursor);
        if ( v11 )
          SendMessageW(dword_100C028, 0xC8u, 1u, 0);
        DestroyWindow(v14);
        goto LABEL_11;
      }
      LocalUnlock(hMem);
      LocalFree(hMem);
      DestroyWindow(dword_100C028);
      dword_100C028 = v14;
      ::hMem = (HLOCAL)SendMessageW(v14, 0xBDu, 0, 0);
      PostMessageW(dword_100C028, 0xC5u, 0, 0);
      ShowWindow(::hWnd, 5);
      SendMessageW(dword_100C028, 0xB9u, wParam, 0);
      SetFocus(dword_100C028);
      SetCursor(hCursor);
      if ( *(_DWORD *)&dword_100C02C )
      {
        GetClientRect(::hWnd, (LPRECT)&v4);
        sub_1002409(v6 - v4, v7 - v5);
        sub_100170A(1u);
        ShowWindow(dword_100C024, 5);
      }
      return 1;
    }
    
    //----- (010085E5) --------------------------------------------------------
    int __stdcall sub_10085E5(int a1, int a2, int a3, int a4)
    {
      int v4; // eax@1
      int v5; // ebx@1
      int v6; // eax@2
      int v7; // ecx@3
      int v9; // [sp+Ch] [bp-4h]@1
    
      v4 = a1;
      v5 = 0;
      v9 = 0;
      *(_DWORD *)a4 = 0;
      while ( 1 )
      {
        v6 = sub_100818F(v4, a2 - ((v4 - a1) >> 1), a3, dword_100D798, (int)&v9);
        if ( !v6 )
          break;
        v7 = v9;
        ++v5;
        *(_DWORD *)a4 += v9;
        v4 = v6 + 2 * v7;
      }
      return v5;
    }
    // 100D798: using guessed type int dword_100D798;
    
    //----- (01008639) --------------------------------------------------------
    size_t __cdecl sub_1008639()
    {
      LRESULT v0; // eax@1
      size_t result; // eax@2
      int v2; // eax@4
      int v3; // ebx@4
      int v4; // edi@4
      int v5; // eax@4
      int v6; // eax@7
      int v7; // esi@7
      int v8; // eax@7
      HGLOBAL v9; // edi@8
      int v10; // eax@11
      int v11; // ebx@11
      int v12; // eax@11
      int v13; // ST2C_4@11
      void *v14; // edi@11
      char v15; // zf@11
      void *v16; // [sp+4h] [bp-24h]@1
      LPARAM v17; // [sp+8h] [bp-20h]@4
      int v18; // [sp+10h] [bp-18h]@4
      int v19; // [sp+14h] [bp-14h]@7
      size_t Size; // [sp+18h] [bp-10h]@1
      HGLOBAL hMem; // [sp+1Ch] [bp-Ch]@8
      int v22; // [sp+20h] [bp-8h]@7
      void *Src; // [sp+24h] [bp-4h]@3
    
      Size = 0;
      v0 = SendMessageW(dword_100C028, 0xBDu, 0, 0);
      v16 = (void *)v0;
      if ( v0 && (Src = LocalLock((HLOCAL)v0)) != 0 )
      {
        v5 = GetWindowTextLengthW(dword_100C028);
        v4 = v5;
        v17 = v5;
        v2 = sub_10085E5((int)Src, v5, (int)&word_100C9E0, (int)&v18);
        v3 = v2;
        if ( v2 )
        {
          if ( v2 > 1 )
          {
            v8 = lstrlenW(stru_100C0C0.lpstrReplaceWith);
            v19 = v8;
            v22 = v4;
            v6 = v4 + v3 * v8 - v18;
            v7 = 2 * v6 + 2;
            if ( v7 > 0 )
            {
              v9 = GlobalAlloc(0, 2 * v6 + 2);
              hMem = v9;
              if ( v9 )
              {
                if ( v3 > 0 )
                {
                  Size = 2 * v19;
                  v18 = v3;
                  do
                  {
                    v10 = sub_100818F((int)Src, v22, (int)&word_100C9E0, dword_100D798, (int)&v19);
                    v11 = v10;
                    v12 = (v10 - (_DWORD)Src) >> 1;
                    v22 -= v12 + v19;
                    v13 = 2 * v12;
                    memcpy(v9, Src, 2 * v12);
                    v14 = (char *)v9 + v13;
                    memcpy(v14, stru_100C0C0.lpstrReplaceWith, Size);
                    v9 = (char *)v14 + Size;
                    v15 = v18-- == 1;
                    Src = (void *)(v11 + 2 * v19);
                  }
                  while ( !v15 );
                }
                memcpy(v9, Src, v7 - 2 * ((signed int)(v9 - hMem) >> 1));
                SendMessageW(dword_100C028, 177u, 0, v17);
                SendMessageW(dword_100C028, 0xC2u, 1u, (LPARAM)hMem);
                GlobalFree(hMem);
                Size = 1;
              }
            }
          }
        }
        else
        {
          Size = 1;
        }
        LocalUnlock(v16);
        result = Size;
      }
      else
      {
        result = 0;
      }
      return result;
    }
    // 100D798: using guessed type int dword_100D798;
    
    //----- (010087C5) --------------------------------------------------------
    bool __stdcall proc(int a1, int a2)
    {
      struct tagMSG Msg; // [sp+4h] [bp-1Ch]@2
    
      while ( !dword_100DE34 && PeekMessageW(&Msg, 0, 0, 0, 1u) )
      {
        if ( !hDlg || !IsDialogMessageW(hDlg, &Msg) )
        {
          TranslateMessage(&Msg);
          DispatchMessageW(&Msg);
        }
      }
      return dword_100DE34 == 0;
    }
    // 100DE34: using guessed type int dword_100DE34;
    
    //----- (0100882E) --------------------------------------------------------
    int __stdcall sub_100882E(HDC hdc)
    {
      int result; // eax@1
    
      dword_100D7D8 = GetDeviceCaps(hdc, 8);
      dword_100D7D4 = GetDeviceCaps(hdc, 10);
      dword_100D7D0 = GetDeviceCaps(hdc, 90);
      dword_100D7CC = GetDeviceCaps(hdc, 110);
      y = GetDeviceCaps(hdc, 111);
      dword_100D7C4 = GetDeviceCaps(hdc, 112);
      result = GetDeviceCaps(hdc, 113);
      dword_100D7C0 = result;
      return result;
    }
    // 100D7C0: using guessed type int dword_100D7C0;
    // 100D7C4: using guessed type int dword_100D7C4;
    // 100D7D0: using guessed type int dword_100D7D0;
    // 100D7D4: using guessed type int dword_100D7D4;
    // 100D7D8: using guessed type int dword_100D7D8;
    
    //----- (0100888F) --------------------------------------------------------
    BOOL __cdecl sub_100888F()
    {
      BOOL result; // eax@1
    
      EnableWindow(hWnd, 1);
      result = DestroyWindow(hDlg);
      hDlg = 0;
      return result;
    }
    
    //----- (010088B6) --------------------------------------------------------
    signed int __cdecl sub_10088B6()
    {
      signed int result; // eax@3
      const DEVMODEW *v1; // eax@4
      LPVOID v2; // esi@4
      HDC v3; // edi@6
    
      if ( stru_100C140.hDevNames
        || (stru_100C140.Flags |= 0x400u,
            PageSetupDlgW(&stru_100C140),
            stru_100C140.Flags &= 0xFFFFFBFFu,
            stru_100C140.hDevNames) )
      {
        v2 = GlobalLock(stru_100C140.hDevNames);
        v1 = 0;
        if ( stru_100C140.hDevMode )
          v1 = (const DEVMODEW *)GlobalLock(stru_100C140.hDevMode);
        v3 = CreateDCW((LPCWSTR)v2 + *(_WORD *)v2, (LPCWSTR)v2 + *((_WORD *)v2 + 1), 0, v1);
        GlobalUnlock(stru_100C140.hDevNames);
        if ( stru_100C140.hDevMode )
          GlobalUnlock(stru_100C140.hDevMode);
        if ( v3 )
        {
          result = (signed int)v3;
        }
        else
        {
          MessageBoxW(hWnd, dword_100C318, szApp, 0x30u);
          result = -1;
        }
      }
      else
      {
        MessageBoxW(hWnd, dword_100C318, szApp, 0x30u);
        result = -1;
      }
      return result;
    }
    
    //----- (01008987) --------------------------------------------------------
    signed int __cdecl sub_1008987()
    {
      HLOCAL v1; // esi@3
      HDC v2; // edi@7
      DWORD pcbNeeded; // [sp+8h] [bp-8h]@3
      HANDLE hPrinter; // [sp+Ch] [bp-4h]@1
    
      if ( !OpenPrinterW(&pPrinterName, &hPrinter, 0) )
        return -1;
      GetPrinterDriverW(hPrinter, 0, 1u, 0, 0, &pcbNeeded);
      v1 = LocalAlloc(0x40u, pcbNeeded);
      if ( !v1 )
        goto LABEL_6;
      if ( !GetPrinterDriverW(hPrinter, 0, 1u, (LPBYTE)v1, pcbNeeded, &pcbNeeded) )
      {
        LocalFree(v1);
    LABEL_6:
        ClosePrinter(hPrinter);
        return -1;
      }
      stru_100C140.Flags |= 0x400u;
      PageSetupDlgW(&stru_100C140);
      stru_100C140.Flags &= 0xFFFFFBFFu;
      v2 = CreateDCW(*(LPCWSTR *)v1, &pPrinterName, 0, 0);
      LocalFree(v1);
      ClosePrinter(hPrinter);
      if ( !v2 )
      {
        MessageBoxW(hWnd, dword_100C318, szApp, 0x30u);
        return -1;
      }
      return (signed int)v2;
    }
    
    //----- (01008A63) --------------------------------------------------------
    signed int __stdcall sub_1008A63(HWND hWnd, int a2, int a3, int a4)
    {
      LPCWSTR v5; // eax@8
    
      if ( a2 == 272 )
      {
        dword_100D7A0 = GetSystemMenu(hWnd, 0);
        if ( dword_100C008 )
          v5 = lpString2;
        else
          v5 = sub_1007008(&FileName);
        SetDlgItemTextW(hWnd, 20, v5);
        SetFocus(hWnd);
      }
      else
      {
        if ( a2 == 273 )
        {
          dword_100DE34 = 1;
          sub_100888F();
        }
        else
        {
          if ( a2 != 278 )
            return 0;
          EnableMenuItem(dword_100D7A0, 0xF060u, 1u);
        }
      }
      return 1;
    }
    // 100C008: using guessed type int dword_100C008;
    // 100DE34: using guessed type int dword_100DE34;
    
    //----- (01008AEF) --------------------------------------------------------
    signed int __stdcall sub_1008AEF(int a1, int a2, int a3, int a4)
    {
      signed int result; // eax@1
    
      result = 0;
      if ( !a2 || (unsigned int)a2 > 0x7FFFFFFF )
        result = -2147024809;
      if ( result >= 0 )
      {
        if ( (unsigned int)a4 <= 0x7FFFFFFE )
        {
          result = sub_1007C80(a3, a2, a1, 0, a4);
        }
        else
        {
          result = -2147024809;
          *(_WORD *)a1 = 0;
        }
      }
      return result;
    }
    
    //----- (01008B3E) --------------------------------------------------------
    int *__stdcall sub_1008B3E(int a1)
    {
      const WCHAR v1; // cx@1
      int *result; // eax@2
      int *v3; // edx@4
      int v4; // edi@4
      int *v5; // ebx@6
      int v6; // edi@6
      int v7; // edx@8
      int v8; // edx@9
      __int16 v9; // cx@9
      int v10; // eax@29
      int v11; // eax@31
      int v12; // eax@32
      int v13; // edx@34
      char v14; // zf@34
      wint_t v15; // ax@35
      int v16; // edx@35
      int v17; // edx@36
      signed int v18; // ecx@50
      int v19; // edx@51
      const WCHAR *v20; // [sp-8h] [bp-238h]@30
      int v21; // [sp-4h] [bp-234h]@30
      int v22; // [sp+Ch] [bp-224h]@1
      int v23; // [sp+10h] [bp-220h]@1
      int v24; // [sp+14h] [bp-21Ch]@1
      int v25; // [sp+18h] [bp-218h]@29
      int v26; // [sp+1Ch] [bp-214h]@1
      int v27; // [sp+20h] [bp-210h]@1
      const WCHAR Buf; // [sp+24h] [bp-20Ch]@38
      unsigned int v29; // [sp+22Ch] [bp-4h]@1
      int v30; // [sp+230h] [bp+0h]@1
    
      v29 = (unsigned int)&v30 ^ dword_100C010;
      v1 = *(_WORD *)a1;
      v27 = a1;
      v26 = 1;
      v22 = 0;
      v23 = 0;
      v24 = 0;
      if ( v1 )
      {
        result = (int *)dword_100C300;
    LABEL_5:
        if ( v1 )
          goto LABEL_3;
        while ( 1 )
        {
          v5 = &v22 + v26;
          v6 = *v5;
          if ( (unsigned int)*v5 >= 0x104 || v6 < 0 )
            return result;
          v7 = v27;
          if ( *(_WORD *)v27 == 38 )
            break;
    LABEL_49:
          v1 = *(_WORD *)v7;
          if ( !*(_WORD *)v7 )
            goto LABEL_50;
    LABEL_3:
          if ( v1 != 38 )
          {
            v27 += 2;
            v3 = &v22 + v26;
            v4 = *v3;
            *(&word_100D800 + *v3 + 260 * v26) = v1;
            v1 = *(_WORD *)v27;
            *v3 = v4 + 1;
            goto LABEL_5;
          }
        }
        v8 = v27 + 2;
        v9 = *(_WORD *)(v27 + 2);
        v27 += 2;
        if ( v9 == *(_WORD *)result || v9 == *((_WORD *)result + 1) )
        {
          if ( dword_100C008 )
            sub_1002558((int)&Buf, 0x104u, (int)lpString2);
          else
            GetFileTitleW(&FileName, (LPWSTR)&Buf, 0x104u);
          if ( v6 + lstrlenW(&Buf) >= 260 )
            goto LABEL_47;
          sub_1002558((int)(&word_100D800 + v6 + 260 * v26), 260 - v6, (int)&Buf);
          v11 = v6 + lstrlenW(&Buf);
          goto LABEL_46;
        }
        if ( v9 == *((_WORD *)result + 2) || v9 == *((_WORD *)result + 3) )
        {
          v25 = 0;
          v13 = v8 + 2;
          v14 = *(_WORD *)v13 == 43;
          v27 = v13;
          if ( v14 )
          {
            v16 = v13 + 2;
            v15 = *(_WORD *)v16;
            v27 = v16;
            while ( iswctype(v15, 4u) )
            {
              v17 = *(_WORD *)v27;
              v27 += 2;
              v15 = *(_WORD *)v27;
              v25 = 10 * v25 + v17 - 48;
            }
          }
          sub_10015C3((wchar_t *)&Buf, 0x104u, L"%d", v25 + *(_DWORD *)dword_100D7AC);
          if ( v6 + lstrlenW(&Buf) < 260 )
          {
            sub_1002558((int)(&word_100D800 + v6 + 260 * v26), 260 - v6, (int)&Buf);
            *v5 = v6 + lstrlenW(&Buf);
          }
          v27 -= 2;
          goto LABEL_47;
        }
        if ( v9 == *((_WORD *)result + 4) || v9 == *((_WORD *)result + 5) )
        {
          v12 = lstrlenW(&word_100CF68);
          v25 = v6 + v12;
          if ( v6 + v12 < 260 )
          {
            v21 = v12;
            v20 = &word_100CF68;
            goto LABEL_31;
          }
        }
        else
        {
          if ( v9 != *((_WORD *)result + 6) && v9 != *((_WORD *)result + 7) )
          {
            if ( v9 == 38 )
            {
              if ( v6 + 1 < 260 )
              {
                *(&word_100D800 + v6 + 260 * v26) = 38;
                *v5 = v6 + 1;
              }
            }
            else
            {
              if ( v9 == *((_WORD *)result + 8) || v9 == *((_WORD *)result + 9) )
              {
                v26 = 1;
              }
              else
              {
                if ( v9 == *((_WORD *)result + 10) || v9 == *((_WORD *)result + 11) )
                {
                  v26 = 2;
                }
                else
                {
                  if ( v9 == *((_WORD *)result + 12) || v9 == *((_WORD *)result + 13) )
                    v26 = 0;
                }
              }
            }
            goto LABEL_48;
          }
          v10 = lstrlenW(&word_100CD60);
          v25 = v6 + v10;
          if ( v6 + v10 < 260 )
          {
            v21 = v10;
            v20 = &word_100CD60;
    LABEL_31:
            sub_1008AEF((int)(&word_100D800 + v6 + 260 * v26), 260 - v6, (int)v20, v21);
            v11 = v25;
    LABEL_46:
            *v5 = v11;
            goto LABEL_47;
          }
        }
    LABEL_47:
        result = (int *)dword_100C300;
    LABEL_48:
        v7 = v27 + 2;
        v27 += 2;
        goto LABEL_49;
      }
    LABEL_50:
      v18 = 0;
      result = &v22;
      do
      {
        v19 = v18 + *result;
        v18 += 260;
        ++result;
        *(&word_100D800 + v19) = 0;
      }
      while ( v18 <= 520 );
      return result;
    }
    // 100C008: using guessed type int dword_100C008;
    // 100C010: using guessed type int dword_100C010;
    // 100C300: using guessed type int dword_100C300;
    
    //----- (01008EF2) --------------------------------------------------------
    signed int __stdcall sub_1008EF2(HDC hdc, int y)
    {
      __int16 v2; // bx@1
      signed int result; // eax@2
      int v4; // eax@4
      int v5; // eax@7
      int v6; // eax@9
      int v7; // edi@9
      int v8; // eax@9
      int v9; // eax@11
      int v10; // edi@11
      int v11; // eax@11
      struct tagSIZE psizl; // [sp+4h] [bp-8h]@9
      int v13; // [sp+18h] [bp+Ch]@6
    
      v2 = 0;
      if ( *(&word_100C740 + 40 * y) )
      {
        sub_1008B3E((int)(&word_100C740 + 40 * y));
        if ( y )
          v4 = dword_100D7D4 - dword_100DE30 - dword_100D7B8;
        else
          v4 = dword_100D7BC;
        v13 = v4;
        if ( word_100D800 )
        {
          v5 = lstrlenW(&word_100D800);
          TextOutW(hdc, x, v13, &word_100D800, v5);
        }
        if ( word_100DA08 )
        {
          v6 = lstrlenW(&word_100DA08);
          GetTextExtentPoint32W(hdc, &word_100DA08, v6, &psizl);
          v7 = (x + dword_100D7D8 - dword_100D7B0) / 2 - psizl.cx / 2;
          v8 = lstrlenW(&word_100DA08);
          TextOutW(hdc, v7, v13, &word_100DA08, v8);
          v2 = 0;
        }
        if ( word_100DC10 != v2 )
        {
          v9 = lstrlenW(&word_100DC10);
          GetTextExtentPoint32W(hdc, &word_100DC10, v9, &psizl);
          v10 = dword_100D7D8 - dword_100D7B0 - psizl.cx;
          v11 = lstrlenW(&word_100DC10);
          TextOutW(hdc, v10, v13, &word_100DC10, v11);
        }
        result = 1;
      }
      else
      {
        result = 0;
      }
      return result;
    }
    // 100D7B0: using guessed type int dword_100D7B0;
    // 100D7B8: using guessed type int dword_100D7B8;
    // 100D7BC: using guessed type int dword_100D7BC;
    // 100D7D4: using guessed type int dword_100D7D4;
    // 100D7D8: using guessed type int dword_100D7D8;
    // 100DE30: using guessed type int dword_100DE30;
    
    //----- (0100900D) --------------------------------------------------------
    signed int __stdcall sub_100900D(HDC a1)
    {
      HFONT v1; // eax@1
      DWORD v2; // esi@1
      HDC v3; // ST0C_4@1
      HFONT v4; // eax@5
      HGDIOBJ v5; // eax@5
      __int32 v6; // eax@16
      DWORD v7; // edi@21
      LRESULT v8; // eax@22
      int v9; // ebx@31
      signed int result; // eax@59
      struct tagTEXTMETRICW tm; // [sp+Ch] [bp-3C8h]@3
      struct tagDRAWTEXTPARAMS dtp; // [sp+48h] [bp-38Ch]@34
      int v13; // [sp+5Ch] [bp-378h]@25
      WCHAR *v14; // [sp+60h] [bp-374h]@25
      int v15; // [sp+64h] [bp-370h]@25
      int v16; // [sp+68h] [bp-36Ch]@25
      int v17; // [sp+6Ch] [bp-368h]@25
      struct tagRECT rc; // [sp+70h] [bp-364h]@27
      int v19; // [sp+80h] [bp-354h]@27
      HLOCAL hMem; // [sp+84h] [bp-350h]@1
      int v21; // [sp+88h] [bp-34Ch]@1
      HGDIOBJ ho; // [sp+8Ch] [bp-348h]@1
      int v23; // [sp+90h] [bp-344h]@1
      HGDIOBJ h; // [sp+94h] [bp-340h]@1
      LPCWSTR lpchText; // [sp+98h] [bp-33Ch]@1
      HDC hdc; // [sp+9Ch] [bp-338h]@1
      LOGFONTW lf; // [sp+A0h] [bp-334h]@1
      WCHAR String; // [sp+FCh] [bp-2D8h]@24
      wchar_t Dest; // [sp+304h] [bp-D0h]@34
      unsigned int v30; // [sp+3D0h] [bp-4h]@1
      int v31; // [sp+3D4h] [bp+0h]@1
    
      v30 = (unsigned int)&v31 ^ dword_100C010;
      hdc = a1;
      hMem = 0;
      h = 0;
      v23 = 0;
      v21 = 0;
      lpchText = 0;
      dword_100DE34 = 0;
      hDlg = 0;
      SetCursor(hCursor);
      sub_100882E(a1);
      GetLocalTime(&SystemTime);
      GetDateFormatW(0x400u, 2u, &SystemTime, 0, (LPWSTR)&word_100CD60, 260);
      GetTimeFormatW(0x400u, 0, &SystemTime, 0, (LPWSTR)&word_100CF68, 260);
      memcpy(&lf, &::lf, sizeof(lf));
      lf.lfWidth = 0;
      lf.lfHeight = *(_DWORD *)&Data * dword_100D7D0 / -720;
      ((void (__fastcall *)(signed int, int, HDC, signed int))SetMapMode)(
        -720,
        *(_DWORD *)&Data * dword_100D7D0 % -720,
        a1,
        8);
      SetViewportExtEx(a1, dword_100D7CC, y, 0);
      SetWindowExtEx(a1, stru_100C140.ptPaperSize.x, stru_100C140.ptPaperSize.y, 0);
      pt.x = stru_100C140.rtMargin.left;
      pt.y = stru_100C140.rtMargin.top;
      *((_DWORD *)&pt + 2) = stru_100C140.rtMargin.right;
      v3 = hdc;
      *((_DWORD *)&pt + 3) = stru_100C140.rtMargin.bottom;
      LPtoDP(v3, &pt, 2);
      SetMapMode(hdc, 1);
      v1 = CreateFontIndirectW(&lf);
      ho = v1;
      v2 = 0;
      if ( !v1
        || (h = SelectObject(hdc, v1), !h)
        || (SetBkMode(hdc, 1), !GetTextMetricsW(hdc, &tm))
        || !(tm.tmPitchAndFamily & 6)
        && ((v5 = SelectObject(hdc, h),
             DeleteObject(v5),
             memset(lf.lfFaceName, 0, 0x40u),
             v4 = CreateFontIndirectW(&lf),
             ho = v4,
             !v4)
         || (h = SelectObject(hdc, v4), !h)
         || !GetTextMetricsW(hdc, &tm)) )
        goto LABEL_54;
      dword_100DE3C = 8 * tm.tmAveCharWidth;
      dword_100DE30 = tm.tmHeight + tm.tmExternalLeading;
      x = pt.x - dword_100D7C4;
      if ( pt.x - dword_100D7C4 <= 0 )
        x = 0;
      dword_100D7B0 = dword_100DE28 + dword_100D7D8 - dword_100D7CC + dword_100D7C4;
      if ( dword_100DE28 + dword_100D7D8 - dword_100D7CC + dword_100D7C4 <= 0 )
        dword_100D7B0 = 0;
      dword_100D7BC = pt.y - dword_100D7C0;
      if ( pt.y - dword_100D7C0 <= 0 )
        dword_100D7BC = 0;
      dword_100D7B8 = dword_100DE2C + dword_100D7D4 - y + dword_100D7C0;
      if ( dword_100DE2C + dword_100D7D4 - y + dword_100D7C0 <= 0 )
        dword_100D7B8 = 0;
      v6 = (dword_100D7D4 - dword_100D7B8 - dword_100D7BC) / (tm.tmHeight + tm.tmExternalLeading);
      if ( word_100C740 )
        --v6;
      if ( *(_WORD *)&Dst )
        --v6;
      if ( v6 <= 0 )
      {
    LABEL_53:
        MessageBoxW(hWnd, dword_100C324, szApp, 0x30u);
        SetLastError(v2);
    LABEL_54:
        v7 = GetLastError();
        goto LABEL_41;
      }
      v7 = SetAbortProc(hdc, (ABORTPROC)proc);
      if ( (signed int)v7 < 0 )
        goto LABEL_41;
      v8 = SendMessageW(dword_100C028, 0xBDu, 0, 0);
      hMem = (HLOCAL)v8;
      if ( !v8
        || (lpchText = (LPCWSTR)LocalLock((HLOCAL)v8), !lpchText)
        || (GetWindowTextW(hWnd, &String, 260),
            EnableWindow(hWnd, 0),
            hDlg = CreateDialogParamW(hInstance, (LPCWSTR)0xB, hWnd, (DLGPROC)sub_1008A63, 0),
            !hDlg) )
        goto LABEL_54;
      v13 = 20;
      v14 = &String;
      v15 = 0;
      v16 = 0;
      v17 = 0;
      SetLastError(0);
      if ( StartDocW(hdc, (const DOCINFOW *)&v13) > 0 )
      {
        v21 = 1;
        *(_DWORD *)dword_100D7AC = 1;
        rc.left = x;
        v19 = 0;
        rc.right = dword_100D7D8 - dword_100D7B0;
        rc.top = dword_100D7BC;
        v23 = 0;
        rc.bottom = dword_100D7D4 - dword_100D7B8;
        if ( word_100C740 )
          rc.top += dword_100DE30;
        if ( *(_WORD *)&Dst )
          rc.bottom = dword_100D7D4 - dword_100D7B8 - dword_100DE30;
        v9 = lstrlenW(lpchText);
        if ( GetWindowLongW(dword_100C028, -20) & 0x2000 )
          v19 = 131074;
        while ( 1 )
        {
          if ( dword_100DE34 || v9 <= 0 )
          {
            v7 = 0;
            goto LABEL_40;
          }
          sub_10015C3(&Dest, 0x65u, dword_100C344, *(_DWORD *)dword_100D7AC);
          SetDlgItemTextW(hDlg, 21, &Dest);
          sub_1008EF2(hdc, 0);
          dtp.iLeftMargin = 0;
          dtp.iRightMargin = 0;
          dtp.uiLengthDrawn = 0;
          dtp.cbSize = 20;
          dtp.iTabLength = dword_100DE3C;
          if ( StartPage(hdc) <= 0
            || (v23 = 1,
                DrawTextExW(hdc, (LPWSTR)lpchText, v9, &rc, v19 | 0x2850, &dtp),
                sub_1008EF2(hdc, 1),
                EndPage(hdc) <= 0) )
            goto LABEL_26;
          v23 = 0;
          ++*(_DWORD *)dword_100D7AC;
          if ( !dtp.uiLengthDrawn )
            break;
          lpchText += dtp.uiLengthDrawn;
          v9 -= dtp.uiLengthDrawn;
        }
        v2 = 0;
        goto LABEL_53;
      }
    LABEL_26:
      v7 = GetLastError();
    LABEL_40:
      v2 = 0;
    LABEL_41:
      if ( h != (HGDIOBJ)v2 )
      {
        SelectObject(hdc, h);
        DeleteObject(ho);
      }
      if ( lpchText != (LPCWSTR)v2 )
        LocalUnlock(hMem);
      if ( v23 != v2 )
      {
        if ( EndPage(hdc) <= 0 )
        {
          if ( v7 == v2 )
            v7 = GetLastError();
        }
      }
      if ( v21 != v2 )
      {
        if ( dword_100DE34 == v2 )
        {
          if ( EndDoc(hdc) <= 0 )
          {
            if ( v7 == v2 )
              v7 = GetLastError();
          }
        }
        else
        {
          AbortDoc(hdc);
        }
      }
      DeleteDC(hdc);
      sub_100888F();
      SetCursor(dword_100C094);
      if ( dword_100DE34 == v2 )
        result = v7;
      else
        result = -3;
      return result;
    }
    // 100C010: using guessed type int dword_100C010;
    // 100D7B0: using guessed type int dword_100D7B0;
    // 100D7B8: using guessed type int dword_100D7B8;
    // 100D7BC: using guessed type int dword_100D7BC;
    // 100D7C0: using guessed type int dword_100D7C0;
    // 100D7C4: using guessed type int dword_100D7C4;
    // 100D7D0: using guessed type int dword_100D7D0;
    // 100D7D4: using guessed type int dword_100D7D4;
    // 100D7D8: using guessed type int dword_100D7D8;
    // 100DE28: using guessed type int dword_100DE28;
    // 100DE2C: using guessed type int dword_100DE2C;
    // 100DE30: using guessed type int dword_100DE30;
    // 100DE34: using guessed type int dword_100DE34;
    // 100DE3C: using guessed type int dword_100DE3C;
    
    //----- (010096AE) --------------------------------------------------------
    bool __stdcall sub_10096AE(LCID Locale)
    {
      WCHAR LCData; // [sp+0h] [bp-24h]@1
      int v3; // [sp+Eh] [bp-16h]@2
      unsigned int v4; // [sp+20h] [bp-4h]@1
      int v5; // [sp+24h] [bp+0h]@1
    
      v4 = (unsigned int)&v5 ^ dword_100C010;
      return GetLocaleInfoW(Locale, 0x58u, &LCData, 16) && v3 & 0x800;
    }
    // 100C010: using guessed type int dword_100C010;
    
    //----- (010096F8) --------------------------------------------------------
    bool __stdcall sub_10096F8(int a1)
    {
      LANGID v1; // ax@2
      bool result; // eax@2
    
      if ( a1 == 1 )
      {
        v1 = GetUserDefaultUILanguage();
        result = sub_10096AE(v1);
      }
      else
      {
        result = a1 == 6 || a1 == 23 || a1 == 10 || a1 == 8;
      }
      return result;
    }
    
    //----- (0100973A) --------------------------------------------------------
    bool __stdcall sub_100973A(bool a1)
    {
      bool result; // eax@1
      char v2; // zf@2
      WCHAR LCData[2]; // [sp+4h] [bp-4h]@1
    
      *(_DWORD *)LCData = 1;
      result = sub_10096AE(0x400u);
      if ( result )
      {
        GetLocaleInfoW(0x400u, 0x20001009u, LCData, 2);
        v2 = sub_10096F8(*(int *)LCData) == 0;
        result = a1;
        if ( v2 )
          *(_DWORD *)a1 |= 0x10u;
        else
          *(_DWORD *)a1 |= 0x20u;
      }
      return result;
    }
    
    //----- (0100978A) --------------------------------------------------------
    LRESULT __stdcall sub_100978A(int a1)
    {
      struct _SYSTEMTIME SystemTime; // [sp+8h] [bp-3ECh]@1
      DWORD dwFlags; // [sp+18h] [bp-3DCh]@1
      WCHAR DateStr; // [sp+1Ch] [bp-3D8h]@1
      _WORD lParam[330]; // [sp+BCh] [bp-338h]@1
      WCHAR TimeStr; // [sp+350h] [bp-A4h]@1
      unsigned int v7; // [sp+3F0h] [bp-4h]@1
      int v8; // [sp+3F4h] [bp+0h]@1
    
      v7 = (unsigned int)&v8 ^ dword_100C010;
      lParam[0] = 0;
      memset(&lParam[1], 0, 0x292u);
      dwFlags = 1;
      GetLocalTime(&SystemTime);
      sub_100973A((bool)&dwFlags);
      GetDateFormatW(0x400u, dwFlags, &SystemTime, 0, &DateStr, 80);
      GetTimeFormatW(0x400u, 2u, &SystemTime, 0, &TimeStr, 80);
      if ( a1 )
        sub_1007F99((int)lParam, 0x14Au, (int)L"
    ");
      sub_1007F99((int)lParam, 0x14Au, (int)&TimeStr);
      sub_1007F99((int)lParam, 0x14Au, (int)&dword_10098B8);
      sub_1007F99((int)lParam, 0x14Au, (int)&DateStr);
      if ( a1 )
        sub_1007F99((int)lParam, 0x14Au, (int)L"
    ");
      return SendMessageW(dword_100C028, 0xC2u, 1u, (LPARAM)lParam);
    }
    // 10098B8: using guessed type int dword_10098B8;
    // 10098BC: using guessed type wchar_t asc_10098BC[3];
    // 100C010: using guessed type int dword_100C010;
    
    //----- (010098C7) --------------------------------------------------------
    signed int __stdcall sub_10098C7(int a1, int a2)
    {
      int v2; // edx@1
      int v3; // ecx@1
      signed int v4; // esi@1
      unsigned __int8 v5; // al@2
      signed int result; // eax@8
    
      v3 = 0;
      v4 = 1;
      v2 = 0;
      if ( a2 <= 0 )
        goto LABEL_8;
      do
      {
        v5 = *(_BYTE *)(v3 + a1);
        if ( (char)v5 < 0 )
          v4 = 0;
        if ( v2 )
        {
          if ( (v5 & 0xC0) != -128 )
            goto LABEL_8;
          --v2;
        }
        else
        {
          if ( v5 >= 0x80u )
          {
            do
            {
              v5 *= 2;
              ++v2;
            }
            while ( (char)v5 < 0 );
            --v2;
            if ( !v2 )
              goto LABEL_8;
          }
        }
        ++v3;
      }
      while ( v3 < a2 );
      if ( v2 || v4 )
    LABEL_8:
        result = 0;
      else
        result = 1;
      return result;
    }
    
    //----- (0100991D) --------------------------------------------------------
    BOOL __stdcall sub_100991D(const void *lpv, int iSize)
    {
      BOOL result; // eax@1
      int iResult; // [sp+0h] [bp-4h]@1
    
      iResult = -1;
      result = IsTextUnicode(lpv, iSize, &iResult);
      if ( result )
      {
        if ( iResult == 2 )
        {
          if ( iSize < 100 )
            result = 0;
        }
      }
      return result;
    }
    
    //----- (01009952) --------------------------------------------------------
    signed int __usercall sub_1009952<eax>(int a1<eax>, int a2<edx>, int a3<edi>)
    {
      signed int result; // eax@1
      int v4; // ecx@1
      int v5; // esi@1
    
      v5 = a1;
      result = 0;
      v4 = a2;
      if ( !a2 )
        goto LABEL_12;
      do
      {
        if ( !*(_WORD *)v5 )
          break;
        v5 += 2;
        --a2;
      }
      while ( a2 );
      if ( !a2 )
    LABEL_12:
        result = -2147024809;
      if ( a3 )
      {
        if ( result < 0 )
          *(_DWORD *)a3 = 0;
        else
          *(_DWORD *)a3 = v4 - a2;
      }
      return result;
    }
    
    //----- (01009989) --------------------------------------------------------
    signed int __stdcall sub_1009989(HWND hwnd, int a2, __int16 a3, int a4)
    {
      BOOL v4; // eax@6
      signed int v5; // edi@6
      HWND v7; // eax@14
      HWND v8; // eax@14
      OLECHAR *v9; // edi@18
      int v10; // eax@22
      struct _SHELLEXECUTEINFOW ExecInfo; // [sp+Ch] [bp-368h]@12
      HWND ppv; // [sp+48h] [bp-32Ch]@1
      struct _OSVERSIONINFOW VersionInformation; // [sp+4Ch] [bp-328h]@6
      char v14; // [sp+166h] [bp-20Eh]@7
      WCHAR Buffer; // [sp+168h] [bp-20Ch]@11
      unsigned int v16; // [sp+370h] [bp-4h]@1
      int v17; // [sp+374h] [bp+0h]@1
    
      v16 = (unsigned int)&v17 ^ dword_100C010;
      ppv = GetAncestor(hwnd, 2u);
      if ( a2 == 78 )
      {
        v10 = *(_DWORD *)(a4 + 8);
        if ( (v10 == -4 || v10 == -2) && *(_DWORD *)(a4 + 4) == 51202 )
        {
          v5 = 1;
          if ( LoadStringW((HINSTANCE)0x1000000, 0xC808u, &Buffer, 260) )
          {
            memset(&ExecInfo.fMask, 0, 0x38u);
            ExecInfo.lpFile = &Buffer;
            ExecInfo.cbSize = 60;
            ExecInfo.nShow = 1;
            ExecInfo.fMask = 256;
            ShellExecuteExW(&ExecInfo);
          }
          return v5;
        }
        return 0;
      }
      if ( a2 == 83 )
      {
        ppv = 0;
        if ( CoInitialize(0) >= 0 )
        {
          if ( CoCreateInstance(&stru_10043E0, 0, 0x17u, &stru_10043D0, (LPVOID *)&ppv) >= 0 )
          {
            if ( LoadStringW((HINSTANCE)0x1000000, 0xC805u, &Buffer, 260) )
            {
              v9 = SysAllocString(&Buffer);
              if ( v9 )
              {
                (*(void (__stdcall **)(HWND, OLECHAR *))(*(_DWORD *)ppv + 16))(ppv, v9);
                SysFreeString(v9);
              }
            }
            (*(void (__stdcall **)(HWND))(*(_DWORD *)ppv + 8))(ppv);
          }
          CoUninitialize();
        }
        return 0;
      }
      if ( a2 == 272 )
      {
        v7 = GetParent(hwnd);
        PostMessageW(v7, 1162u, 16u, 20);
        v8 = GetParent(hwnd);
        PostMessageW(v8, 0x48Bu, 0x10u, 17);
        SetWindowPos(ppv, HWND_MESSAGE|0x2, 0, 0, 0, 0, 3u);
        return 1;
      }
      if ( a2 != 273 || a3 != -14335 )
        return 0;
      SetWindowPos(ppv, (HWND)0xFFFFFFFE, 0, 0, 0, 0, 3u);
      VersionInformation.dwOSVersionInfoSize = 284;
      v4 = GetVersionExW(&VersionInformation);
      v5 = 1;
      if ( v4 )
        v4 = v14 == 3 || v14 == 2;
      if ( LoadStringW((HINSTANCE)0x1000000, 51207 - (v4 != 0), &Buffer, 260) )
      {
        memset(&ExecInfo.fMask, 0, 0x38u);
        ExecInfo.lpFile = &Buffer;
        ExecInfo.cbSize = 60;
        ExecInfo.nShow = 1;
        ExecInfo.fMask = 256;
        ShellExecuteExW(&ExecInfo);
      }
      PostMessageW(ppv, 0x10u, 0, 0);
      return v5;
    }
    // 100C010: using guessed type int dword_100C010;
    
    //----- (01009C2A) --------------------------------------------------------
    void __stdcall StartAddress(int a1)
    {
      const PROPSHEETPAGEW_V3 constPropSheetPagePointer; // [sp+8h] [bp-70h]@1
      const PROPSHEETHEADERW_V2 v2; // [sp+40h] [bp-38h]@2
      HPROPSHEETPAGE v3; // [sp+74h] [bp-4h]@1
    
      memset(&constPropSheetPagePointer.dwFlags, 0, 0x34u);
      constPropSheetPagePointer.dwSize = 56;
      constPropSheetPagePointer.dwFlags = 4096;
      constPropSheetPagePointer.hInstance = (HINSTANCE)16777216;
      constPropSheetPagePointer.pszTemplate = (LPCWSTR)51200;
      constPropSheetPagePointer.pfnDlgProc = (DLGPROC)sub_1009989;
      constPropSheetPagePointer.pszHeaderTitle = (LPCWSTR)51203;
      constPropSheetPagePointer.lParam = 0;
      v3 = CreatePropertySheetPageW(&constPropSheetPagePointer);
      if ( v3 )
      {
        memset(&v2.dwFlags, 0, 0x30u);
        v2.ppsp = (LPCPROPSHEETPAGEW)&v3;
        v2.dwSize = 52;
        v2.dwFlags = 16416;
        v2.hwndParent = 0;
        v2.hInstance = (HINSTANCE)16777216;
        v2.pszCaption = (LPCWSTR)51204;
        v2.nPages = 1;
        PropertySheetW(&v2);
      }
      InterlockedExchange(&Target, 0);
      FreeLibraryAndExitThread((HMODULE)0x1000000, 0);
    }
    
    //----- (01009CDF) --------------------------------------------------------
    signed int __stdcall sub_1009CDF(int a1, int a2, int a3)
    {
      signed int result; // eax@1
    
      result = 0;
      if ( !a2 || (unsigned int)a2 > 0x7FFFFFFF )
        result = -2147024809;
      if ( result >= 0 )
        result = sub_1007C80(a3, a2, a1, 0, 2147483646);
      return result;
    }
    
    //----- (01009D19) --------------------------------------------------------
    signed int __stdcall sub_1009D19(int a1, int a2, int a3)
    {
      signed int result; // eax@1
      int v4; // ebx@4
      int v5; // ecx@5
    
      result = 0;
      if ( !a2 || (unsigned int)a2 > 0x7FFFFFFF )
        result = -2147024809;
      v4 = a1;
      if ( result < 0 )
      {
        v5 = 0;
      }
      else
      {
        result = sub_1009952(a1, a2, (int)&a1);
        v5 = a1;
      }
      if ( result >= 0 )
        result = sub_1007C80(a3, a2 - v5, v4 + 2 * v5, 0, 2147483647);
      return result;
    }
    
    //----- (01009D73) --------------------------------------------------------
    int __cdecl sub_1009D73(int a1, int a2, int a3, int a4)
    {
      return except_handler4_common(&dword_100C010, sub_1001564, a1, a2, a3, a4);
    }
    // 1009FF1: using guessed type int __cdecl except_handler4_common(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD, _DWORD);
    // 100C010: using guessed type int dword_100C010;
    
    //----- (01009D9D) --------------------------------------------------------
    int __stdcall sub_1009D9D(int a1)
    {
      _DWORD *v1; // eax@1
      int v2; // eax@3
    
      v1 = *(_DWORD **)a1;
      if ( **(_DWORD **)a1 == -529697949 )
      {
        if ( v1[4] == 3 )
        {
          v2 = v1[5];
          if ( v2 == 429065504 || v2 == 429065505 || v2 == 429065506 || v2 == 26820608 )
            terminate();
        }
      }
      return 0;
    }
    // 100132C: using guessed type void __cdecl terminate();
    
    //----- (01009DF0) --------------------------------------------------------
    bool __cdecl sub_1009DF0(int a1)
    {
      bool result; // eax@2
      int v2; // eax@3
    
      if ( *(_WORD *)a1 != 23117 || (v2 = a1 + *(_DWORD *)(a1 + 60), *(_DWORD *)v2 != 17744) )
        result = 0;
      else
        result = *(_WORD *)(v2 + 24) == 267;
      return result;
    }
    
    //----- (01009E2A) --------------------------------------------------------
    int __cdecl sub_1009E2A(int a1, unsigned int a2)
    {
      int result; // eax@1
      unsigned int v3; // edx@1
      unsigned int v4; // esi@1
      int v5; // ecx@1
      unsigned int v6; // ecx@2
    
      v5 = a1 + *(_DWORD *)(a1 + 60);
      v4 = *(_WORD *)(v5 + 6);
      v3 = 0;
      result = *(_WORD *)(v5 + 20) + v5 + 24;
      if ( *(_WORD *)(v5 + 6) )
      {
        while ( 1 )
        {
          v6 = *(_DWORD *)(result + 12);
          if ( a2 >= v6 )
          {
            if ( a2 < v6 + *(_DWORD *)(result + 8) )
              break;
          }
          ++v3;
          result += 40;
          if ( v3 >= v4 )
            goto LABEL_5;
        }
      }
      else
      {
    LABEL_5:
        result = 0;
      }
      return result;
    }
    
    //----- (01009E73) --------------------------------------------------------
    int __usercall sub_1009E73<eax>(int a1<ebp>)
    {
      sub_1003B0C((int)dword_1009EE0, 8);
      *(_DWORD *)(a1 - 4) = 0;
      if ( sub_1009DF0(16777216) && sub_1009E2A(16777216, *(_DWORD *)(a1 + 8) - 16777216) )
        *(_DWORD *)(a1 - 4) = -2;
      else
        *(_DWORD *)(a1 - 4) = -2;
      return sub_10023D0(a1);
    }
    // 10023D0: using guessed type _DWORD __usercall sub_10023D0<eax>(_DWORD ebp0<ebp>);
    // 1009EE0: using guessed type int dword_1009EE0[2];
    
    //----- (01009F07) --------------------------------------------------------
    BOOL __usercall sub_1009F07<eax>(char _CF<cf>, char _ZF<zf>, char _SF<sf>, char _OF<of>, int a5<eax>, int a6<edx>, int a7<ecx>, int a8<ebx>, int a9<edi>, int a10<esi>, char a11)
    {
      int v12; // ST04_4@1
      int v13; // ST330_4@1
      HANDLE v14; // eax@1
      int v15; // [sp+32Ch] [bp+4h]@1
    
      dword_100C470 = a5;
      dword_100C46C = a7;
      dword_100C468 = a6;
      dword_100C464 = a8;
      dword_100C460 = a10;
      dword_100C45C = a9;
      word_100C488 = __SS__;
      word_100C47C = __CS__;
      word_100C458 = __DS__;
      word_100C454 = __ES__;
      word_100C450 = __FS__;
      word_100C44C = __GS__;
      __asm { pushf }
      dword_100C480 = v12;
      dword_100C474 = v13;
      dword_100C478 = v15;
      dword_100C484 = (int)&a11;
      dword_100C3C0 = 65537;
      dword_100C37C = dword_100C478;
      dword_100C370 = -1073740791;
      dword_100C374 = 1;
      SetUnhandledExceptionFilter(0);
      UnhandledExceptionFilter(&ExceptionInfo);
      v14 = GetCurrentProcess();
      return TerminateProcess(v14, 0xC0000409u);
    }
    // 100C370: using guessed type int dword_100C370;
    // 100C374: using guessed type int dword_100C374;
    // 100C37C: using guessed type int dword_100C37C;
    // 100C3C0: using guessed type int dword_100C3C0;
    // 100C44C: using guessed type __int16 word_100C44C;
    // 100C450: using guessed type __int16 word_100C450;
    // 100C454: using guessed type __int16 word_100C454;
    // 100C458: using guessed type __int16 word_100C458;
    // 100C45C: using guessed type int dword_100C45C;
    // 100C460: using guessed type int dword_100C460;
    // 100C464: using guessed type int dword_100C464;
    // 100C468: using guessed type int dword_100C468;
    // 100C46C: using guessed type int dword_100C46C;
    // 100C470: using guessed type int dword_100C470;
    // 100C474: using guessed type int dword_100C474;
    // 100C478: using guessed type int dword_100C478;
    // 100C47C: using guessed type __int16 word_100C47C;
    // 100C480: using guessed type int dword_100C480;
    // 100C484: using guessed type int dword_100C484;
    // 100C488: using guessed type __int16 word_100C488;
    
    #error "There were 1 decompilation failure(s) on 140 function(s)"
    



  • 相关阅读:
    函数嵌套
    函数对象
    可变长参数
    函数的参数
    函数的调用
    函数的返回值
    定义函数的三种形式
    函数的定义
    SQLAlchemy
    Flask总结完整版
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330343.html
Copyright © 2020-2023  润新知