//like A: is error path ,must be A:/ T_BOOL Fwl_GetLongPath(T_U16 lPathName[], const T_U16 basePath[], const T_U16 rltPath[]) { T_U16 basePathLen= UStrLen(basePath); T_U16 endChar= basePath[basePathLen- 1]; T_U16 pathSymbol= basePath[2]; UStrCpy(lPathName, basePath); //A:/ A:/record the second char is the path symbol if(endChar != UNICODE_SOLIDUS && endChar != UNICODE_RES_SOLIDUS) { lPathName[basePathLen]= pathSymbol; lPathName[basePathLen+ 1]= '\0'; } UStrCat(lPathName, rltPath); return AK_TRUE; }
HRESULT LINK(PTSTR ptzCmd) { // Parse Shortcut,Target,Param,IconPath,IconIndex PTSTR ptzTarget = UStrChr(ptzCmd, CC_SEP); if (ptzTarget == NULL) { return ERROR_PATH_NOT_FOUND; } INT iIcon = 0; PTSTR ptzIcon = NULL; *ptzTarget++ = 0; PTSTR ptzParam = UStrChr(ptzTarget, CC_SEP); if (ptzParam) { *ptzParam++ = 0; ptzIcon = UStrChr(ptzParam, CC_SEP); if (ptzIcon) { *ptzIcon++ = 0; PTSTR ptzIndex = UStrChr(ptzIcon, CC_SEP); if (ptzIndex) { *ptzIndex++ = 0; iIcon = UStrToInt(ptzIndex); } } } // Search target if (*ptzCmd == '*') { ptzCmd++; } else { TCHAR tzTarget[MAX_PATH]; if (SearchPath(NULL, ptzTarget, NULL, MAX_PATH, tzTarget, NULL)) { ptzTarget = tzTarget; } else if (!UDirExist(ptzTarget)) { return ERROR_PATH_NOT_FOUND; } } // Create shortcut IShellLink *pLink; CoInitialize(NULL); HRESULT hResult = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (PVOID *) &pLink); if (hResult == S_OK) { IPersistFile *pFile; hResult = pLink->QueryInterface(IID_IPersistFile, (PVOID *) &pFile); if (hResult == S_OK) { if (*ptzCmd == '!') { ptzCmd++; hResult = pLink->SetShowCmd(SW_SHOWMINIMIZED); } // Shortcut settings hResult = pLink->SetPath(ptzTarget); hResult = pLink->SetArguments(ptzParam); hResult = pLink->SetIconLocation(ptzIcon, iIcon); if (UPathSplit(ptzTarget) != ptzTarget) { hResult = pLink->SetWorkingDirectory(ptzTarget); } // Save link WCHAR wzLink[MAX_PATH]; if (UStrCmpI(ptzCmd + UStrLen(ptzCmd) - 4, TEXT(".LNK"))) { UStrCat(ptzCmd, TEXT(".LNK")); } UStrToWStr(wzLink, ptzCmd, MAX_PATH); UDirCreate(ptzCmd); hResult = pFile->Save(wzLink, FALSE); pFile->Release(); } pLink->Release(); } CoUninitialize(); return hResult; }
HRESULT PAGE(PTSTR ptzCmd) { // Parse size UINT uMin = 0; UINT uMax = 0; PTSTR p = UStrChr(ptzCmd, ' '); if (p) { *p++ = 0; uMin = UStrToInt(p); p = UStrChr(p, ' '); if (p) { *p++ = 0; uMax = UStrToInt(p); } } if (uMax<uMin) { uMax=uMin; } // Get DOS device name for page file TCHAR tzDrive[16]; TCHAR tzDos[MAX_PATH]; TCHAR tzFile[MAX_PATH]; tzDrive[0] = ptzCmd[0]; tzDrive[1] = ptzCmd[1]; tzDrive[2] = 0; UStrCopy(tzFile, ptzCmd + 2); QueryDosDevice(tzDrive, tzDos, MAX_PATH); UStrCat(tzDos, tzFile); WCHAR wzPath[MAX_PATH]; UStrToWStr(wzPath, tzDos, MAX_PATH); UNICODE_STRING sPath; sPath.Length = UWStrLen(wzPath) * sizeof(WCHAR); sPath.MaximumLength = sPath.Length + sizeof(WCHAR); sPath.Buffer = wzPath; // Fill size param ULARGE_INTEGER ulMax, ulMin; ulMin.QuadPart = uMin * 1024 * 1024; ulMax.QuadPart = uMax * 1024 * 1024; // Get function address typedef NTSTATUS (NTAPI* PNtCreatePagingFile)(PUNICODE_STRING sPath, PULARGE_INTEGER puInitSize, PULARGE_INTEGER puMaxSize, ULONG uPriority); PNtCreatePagingFile NtCreatePagingFile = (PNtCreatePagingFile) GetProcAddress(GetModuleHandle(TEXT("NTDLL")), "NtCreatePagingFile"); if (!NtCreatePagingFile) { return E_FAIL; } // Create page file Priv(SE_CREATE_PAGEFILE_NAME); HRESULT hResult = NtCreatePagingFile(&sPath, &ulMin, &ulMax, 0); if (hResult == S_OK) { // Log to Windows Registry TCHAR tzStr[MAX_PATH]; DWORD i = sizeof(tzStr); if (SHGetValue(HKEY_LOCAL_MACHINE, REG_MemMgr, REG_PageFile, NULL, tzStr, &i) != S_OK) { i = 0; } else { i = (i / sizeof(TCHAR)) - 1; } i += UStrPrint(tzStr + i, TEXT("%s %d %d"), ptzCmd, uMin, uMax); tzStr[++i] = 0; SHSetValue(HKEY_LOCAL_MACHINE, REG_MemMgr, REG_PageFile, REG_MULTI_SZ, tzStr, i * sizeof(TCHAR)); } return hResult; }
// ENVIronment HRESULT ENVI(PTSTR ptzEnv, BOOL bSystem) { TCHAR tzStr[MAX_STR]; if (!ptzEnv[0] || (ptzEnv[0] == '=')) { for (UINT i = 0; i < _NumOf(c_sMacro); i++) { if (ptzEnv[0]/* == '='*/) { ENVI((PTSTR) c_sMacro[i].ptzMacro, bSystem); continue; } PTSTR p = tzStr + UStrPrint(tzStr, TEXT("%s="), c_sMacro[i].ptzMacro); if (SHGetSpecialFolderPath(NULL, p, c_sMacro[i].iFolder, TRUE)) { if (c_sMacro[i].iFolder == CSIDL_APPDATA) { // Trick UStrCat(p, TEXT("\\Microsoft\\Internet Explorer\\Quick Launch\\")); UDirCreate(p); CreateDirectory(p, NULL); } ENVI(tzStr, bSystem); } } if (ptzEnv[0]/* == '='*/) { return ENVI((PTSTR) STR_AppName, bSystem); } else { UStrPrint(tzStr, TEXT("%s=%s/%s"), STR_AppName, STR_VersionStamp, STR_BuildStamp); return ENVI(tzStr, bSystem); } } if (bSystem) { UStrPrint(tzStr, TEXT("HKLM\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment\\%s"), ptzEnv); REGX(tzStr); } PTSTR ptzValue = UStrChr(ptzEnv, '='); if (ptzValue) { // Trick : If no '=', ptzEnv can be a constant string. *ptzValue++ = 0; } HRESULT hResult = SetEnvironmentVariable(ptzEnv, ptzValue) ? S_OK : GetLastError(); if (bSystem) { if (!ptzValue) { ptzValue = ptzEnv + UStrLen(ptzEnv) + 1; } DWORD dwResult = 0; SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM) TEXT("Environment"), SMTO_ABORTIFHUNG, 5000, &dwResult); } return hResult; }
UINT CALLBACK DevCab(PVOID pvContext, UINT uMsg, UINT_PTR upParam1, UINT_PTR upParam2) { static UINT s_uExtract = 0; if (uMsg == SPFILENOTIFY_FILEINCABINET) { PTSTR ptzTarget = ((FILE_IN_CABINET_INFO*) upParam1)->FullTargetName; PCTSTR ptzName = ((FILE_IN_CABINET_INFO*) upParam1)->NameInCabinet; PCTSTR p = UStrRChr(ptzName, '\\'); if (p) { ptzName = p + 1; } // Extract INF or driver file p = ptzName + UStrLen(ptzName) - 4; if (UStrCmpI(p, TEXT(".INF")) == 0) { p = TEXT("%SystemRoot%\\INF\\"); } else if (s_uExtract) { if (UStrCmpI(p, TEXT(".SYS")) == 0) { p = TEXT("%SystemRoot%\\SYSTEM32\\DRIVERS\\"); } else if (UStrCmpI(p, TEXT(".DLL")) == 0) { p = TEXT("%SystemRoot%\\SYSTEM32\\"); } else { p = TEXT("%SystemRoot%\\"); } } else { // Skip return FILEOP_SKIP; } ExpandEnvironmentStrings(p, ptzTarget, MAX_PATH); UStrCat(ptzTarget, ptzName); UStrRep(ptzTarget, '#', '\\'); UDirCreate(ptzTarget); return FILEOP_DOIT; } else if (uMsg == SPFILENOTIFY_FILEEXTRACTED) { PCTSTR ptzTarget = ((FILEPATHS*) upParam1)->Target; if (UStrCmpI(ptzTarget + UStrLen(ptzTarget) - 4, TEXT(".INF"))) { // Not INF s_uExtract++; return NO_ERROR; } // Get Device from INF PCTSTR ptzDevID = DevGetInf((PCTSTR) pvContext, ptzTarget); if (ptzDevID) { // Found Driver s_uExtract = 1; do {*g_ptzDevInf++ = *ptzDevID;} while (*ptzDevID++); do {*g_ptzDevInf++ = *ptzTarget;} while (*ptzTarget++); return NO_ERROR; } // Delete INF if (s_uExtract != 1) { // Driver has been extracted completely. s_uExtract = 0; UFileDelete(ptzTarget); } } return NO_ERROR; }