int wmain(int argc, WCHAR **argv) { #if !defined(XRE_DONT_SUPPORT_XPSP2) WindowsCrtPatch::Init(); #endif #if defined(_MSC_VER) && _MSC_VER < 1900 && defined(_M_X64) // Disable CRT use of FMA3 on non-AVX2 CPUs and on Win7RTM due to bug 1160148 int cpuid0[4] = {0}; int cpuid7[4] = {0}; __cpuid(cpuid0, 0); // Get the maximum supported CPUID function __cpuid(cpuid7, 7); // AVX2 is function 7, subfunction 0, EBX, bit 5 if (cpuid0[0] < 7 || !(cpuid7[1] & 0x20) || !mozilla::IsWin7SP1OrLater()) { _set_FMA3_enable(0); } #endif #ifndef XRE_DONT_PROTECT_DLL_LOAD mozilla::SanitizeEnvironmentVariables(); SetDllDirectoryW(L""); #endif char **argvConverted = new char*[argc + 1]; if (!argvConverted) return 127; for (int i = 0; i < argc; ++i) { argvConverted[i] = AllocConvertUTF16toUTF8(argv[i]); if (!argvConverted[i]) { return 127; } } argvConverted[argc] = nullptr; // need to save argvConverted copy for later deletion. char **deleteUs = new char*[argc+1]; if (!deleteUs) { FreeAllocStrings(argc, argvConverted); return 127; } for (int i = 0; i < argc; i++) deleteUs[i] = argvConverted[i]; #ifndef XRE_WANT_ENVIRON int result = main(argc, argvConverted); #else // Force creation of the multibyte _environ variable. getenv("PATH"); int result = main(argc, argvConverted, _environ); #endif delete[] argvConverted; FreeAllocStrings(argc, deleteUs); return result; }
LOCAL uchar *AllocNewStr (TENTRY *OldEntry, ushort length) { uchar *pNew; if ((length + LNGTHSZ) > POOL2SIZE) { pNew = Alloc (length + LNGTHSZ); } else if ((length + LNGTHSZ) > POOLSIZE) { pNew = Pool2Alloc (); } else { pNew = PoolAlloc (); } FreeAllocStrings (OldEntry); if ((length + LNGTHSZ) > POOL2SIZE) { OldEntry->flags.IsMalloced = TRUE; } else if ((length + LNGTHSZ) > POOLSIZE) { OldEntry->flags.IsPool2 = TRUE; } else { OldEntry->flags.IsPool = TRUE; } OldEntry->TypeString = pNew; return (pNew); }
LOCAL void C6CnvtBitfieldType (TENTRY *OldEntry) { uchar * pchTypeStr; uchar * pchTypeStrStart; plfBitfield pNewType; uchar * pchDest; ushort usNTotal; // New length of symbol including length field ushort usNewLength; // New paded length excluding length field. OldEntry->flags.IsNewFormat = TRUE; // calculate new length // M00SPEED These are all constants usNTotal = LNGTHSZ + sizeof(lfBitfield); usNewLength = usNTotal - LNGTHSZ; pchTypeStrStart = pchTypeStr = OldEntry->TypeString; // get the string pchTypeStr += 4; // Advance to the length field // Get memory for new type pchDest = Alloc (usNewLength + LNGTHSZ); pNewType = (plfBitfield)(pchDest + LNGTHSZ); // Insert the new length and new type *((ushort *)pchDest) = usNewLength; pNewType->leaf = LF_BITFIELD; // Copy the length in bits of the object pNewType->length = *pchTypeStr++; // Copy the base type // Note that 0x7c was UNSINT and 0x7d was SGNINT, in CV3 days. DASSERT(*pchTypeStr == 0x7c || *pchTypeStr == 0x7d); DASSERT(pNewType->length <= 32); if (pNewType->length <= 16) { pNewType->type = (*pchTypeStr++ == 0x7d) ? T_SHORT : T_USHORT; } else { pNewType->type = (*pchTypeStr++ == 0x7d) ? T_LONG : T_ULONG; } // Copy bit position in the byte, word, ect. pNewType->position = *pchTypeStr++; // Change entry to point to the new string FreeAllocStrings (OldEntry); OldEntry->flags.IsMalloced = TRUE; OldEntry->TypeString = pchDest; pchDest += LNGTHSZ + sizeof (lfBitfield); DASSERT(pchDest == OldEntry->TypeString + *((ushort *)(OldEntry->TypeString)) + LNGTHSZ); }
int wmain(int argc, WCHAR **argv) { #ifndef XRE_DONT_PROTECT_DLL_LOAD mozilla::SanitizeEnvironmentVariables(); SetDllDirectoryW(L""); #endif char **argvConverted = new char*[argc + 1]; if (!argvConverted) return 127; for (int i = 0; i < argc; ++i) { argvConverted[i] = AllocConvertUTF16toUTF8(argv[i]); if (!argvConverted[i]) { return 127; } } argvConverted[argc] = nullptr; // need to save argvConverted copy for later deletion. char **deleteUs = new char*[argc+1]; if (!deleteUs) { FreeAllocStrings(argc, argvConverted); return 127; } for (int i = 0; i < argc; i++) deleteUs[i] = argvConverted[i]; #ifndef XRE_WANT_ENVIRON int result = main(argc, argvConverted); #else // Force creation of the multibyte _environ variable. getenv("PATH"); int result = main(argc, argvConverted, _environ); #endif delete[] argvConverted; FreeAllocStrings(argc, deleteUs); return result; }
BOOL WinLaunchChild(const wchar_t *exePath, int argc, char **argv, HANDLE userToken, HANDLE *hProcess) { wchar_t** argvConverted = new wchar_t*[argc]; if (!argvConverted) return FALSE; for (int i = 0; i < argc; ++i) { argvConverted[i] = reinterpret_cast<wchar_t*>(AllocConvertUTF8toUTF16(argv[i])); if (!argvConverted[i]) { FreeAllocStrings(i, argvConverted); return FALSE; } } BOOL ok = WinLaunchChild(exePath, argc, argvConverted, userToken, hProcess); FreeAllocStrings(argc, argvConverted); return ok; }
LOCAL void C6CnvtLabelType (TENTRY *OldEntry) { uchar * pchTypeStr; plfLabel pNewType; uchar * pchDest; uchar * pchDestBase; // The start of the new string ushort usNTotal; // New length of symbol including length field ushort usNewLength; // New paded length excluding length field. DASSERT(!OldEntry->flags.IsNewFormat); OldEntry->flags.IsNewFormat = TRUE; pchTypeStr = OldEntry->TypeString; // get the string // calculate new length // M00SPEED These are all constants usNTotal = LNGTHSZ + sizeof(lfLabel); usNewLength = usNTotal - LNGTHSZ; // Get memory for new type pchDest = Alloc (usNewLength + LNGTHSZ); pchDestBase = pchDest; pNewType = (plfLabel)(pchDest + LNGTHSZ); // Insert the new length and new type *((ushort *)pchDest) = usNewLength; pNewType->leaf = LF_LABEL; // 0x73 == old LF_FAR, 0x74 == old LF_NEAR //Make sure the code label is one of the two types DASSERT(*(pchTypeStr + 5) == 0x73 || *(pchTypeStr + 5) == 0x74); // Get the new type if (*(pchTypeStr + 5) == 0x73) { pNewType->mode = CV_LABEL_FAR; } else { pNewType->mode = CV_LABEL_NEAR; } pchDest += LNGTHSZ + sizeof (lfLabel); // Change entry to point to the new string FreeAllocStrings (OldEntry); OldEntry->flags.IsMalloced = TRUE; OldEntry->TypeString = pchDestBase; DASSERT(pchDest == OldEntry->TypeString + *((ushort *)(OldEntry->TypeString)) + LNGTHSZ); }
int wmain(int argc, WCHAR **argv) { #ifndef XRE_DONT_PROTECT_DLL_LOAD mozilla::SanitizeEnvironmentVariables(); SetDllDirectoryW(L""); #endif #ifdef XRE_WANT_DLL_BLOCKLIST SetupDllBlocklist(); #endif char **argvConverted = new char*[argc + 1]; if (!argvConverted) return 127; for (int i = 0; i < argc; ++i) { argvConverted[i] = AllocConvertUTF16toUTF8(argv[i]); if (!argvConverted[i]) { return 127; } } argvConverted[argc] = NULL; // need to save argvConverted copy for later deletion. char **deleteUs = new char*[argc+1]; if (!deleteUs) { FreeAllocStrings(argc, argvConverted); return 127; } for (int i = 0; i < argc; i++) deleteUs[i] = argvConverted[i]; int result = main(argc, argvConverted); delete[] argvConverted; FreeAllocStrings(argc, deleteUs); return result; }
BOOL WinLaunchChild(const PRUnichar *exePath, int argc, char **argv, int needElevation) { PRUnichar** argvConverted = new PRUnichar*[argc]; if (!argvConverted) return FALSE; for (int i = 0; i < argc; ++i) { argvConverted[i] = AllocConvertUTF8toUTF16(argv[i]); if (!argvConverted[i]) { return FALSE; } } BOOL ok = WinLaunchChild(exePath, argc, argvConverted, needElevation); FreeAllocStrings(argc, argvConverted); return ok; }
LOCAL void C6CnvtCobol (TENTRY *OldEntry) { uchar * pchTypeStr; uchar * pchDest; ushort usNTotal; // New length of symbol including length field ushort usNewLength; // New paded length excluding length field. plfCobol1 pNewType; DASSERT(!OldEntry->flags.IsNewFormat); IsMFCobol = TRUE; OldEntry->flags.IsNewFormat = TRUE; pchTypeStr = OldEntry->TypeString; // calculate new length. Since all we are doing is copying the old // data, we just increase the length by to allow for large record type usNTotal = LNGTHSZ + *((ushort UNALIGNED *)(pchTypeStr + 1)) + 1; usNewLength = usNTotal - LNGTHSZ; // Get memory for new type pchDest = Alloc (usNTotal); pNewType = (plfCobol1)(pchDest + LNGTHSZ); // Insert the new length and new type and copy the remainder of // of the type string over *((ushort *)pchDest) = usNewLength; pNewType->leaf = LF_COBOL1; memmove (&pNewType->data, pchTypeStr + 4, *((ushort UNALIGNED *)(pchTypeStr + 1)) - 1); // Change entry to point to the new string FreeAllocStrings (OldEntry); OldEntry->flags.IsMalloced = TRUE; OldEntry->TypeString = pchDest; }
LOCAL void C6CnvtArgList (ushort usArgList, ushort usCount) { uchar * pchTypeStr; uchar * pchTypeStrBase; // The base of the original type string plfArgList plf; ushort usNTotal; // New length of symbol including length field ushort usNewLength; // New paded length excluding length field. ushort usfInTmp; // True if string stored in temporary buffer uchar * pchDest; ushort i; uchar * pchDestBase; TENTRY *OldEntry; CV_typ_t forward; OldEntry = GetTypeEntry ((CV_typ_t)(usArgList - 512), &forward); if (OldEntry->flags.IsNewFormat) { return; } OldEntry->flags.IsNewFormat = TRUE; pchTypeStr = OldEntry->TypeString; // get the string pchTypeStrBase = pchTypeStr; DASSERT((pchTypeStr[3] == OLF_LIST) || (pchTypeStr[3] == OLF_ARGLIST) || ((usCount != 0) && (pchTypeStr[3] == OLF_NIL))); // calculate new length usNTotal = LNGTHSZ + offsetof (lfArgList, arg) + (sizeof(CV_typ_t) * usCount); usNewLength = usNTotal - LNGTHSZ; // Get some memory to put the result in if (usNewLength + LNGTHSZ <= LENGTH (pchTypeStr) + 3) { // Get some scratch memory so we don't wipe out the memory we are // are attempting to rewrite. usfInTmp = TRUE; pchDest = GetScratchString (usNewLength + LNGTHSZ); } else { usfInTmp = FALSE; pchDest = Alloc (usNewLength + LNGTHSZ); } pchDestBase = pchDest; pchTypeStr += 4; // Skip to the arguments; *((ushort*)pchDest)++ = usNewLength; plf = (plfArgList) pchDest; plf->leaf = LF_ARGLIST; plf->count = usCount; // Loop through copying the indexes from the old to the new. for (i = 0; i < usCount; i++) { plf->arg[i] = getindex (pchTypeStr); } pchDest = (uchar *) &(plf->arg[i]); if (usfInTmp) { // Copy the new string over the old one memcpy (OldEntry->TypeString, pchDestBase, usNewLength + LNGTHSZ); DASSERT(pchDest == pchDestBase + usNewLength + LNGTHSZ); } else { FreeAllocStrings (OldEntry); OldEntry->flags.IsMalloced = TRUE; OldEntry->TypeString = pchDestBase; DASSERT(pchDest == OldEntry->TypeString + usNewLength + LNGTHSZ); } }