String::~String() { if(NULL != this->pszValue) { NoCheckHeapDeleteArray(wcslen(this->pszValue) + 1, this->pszValue); } }
// // Returns the major and minor version of the binary passed as argument. // HRESULT AutoSystemInfo::GetVersionInfo(__in LPCWSTR pszPath, DWORD* majorVersion, DWORD* minorVersion) { #ifdef _WIN32 DWORD dwTemp; DWORD cbVersionSz; HRESULT hr = E_FAIL; BYTE* pVerBuffer = NULL; VS_FIXEDFILEINFO* pFileInfo = NULL; cbVersionSz = GetFileVersionInfoSizeEx(FILE_VER_GET_LOCALISED, pszPath, &dwTemp); if(cbVersionSz > 0) { pVerBuffer = NoCheckHeapNewArray(BYTE, cbVersionSz); if(pVerBuffer) { if(GetFileVersionInfoEx(FILE_VER_GET_LOCALISED|FILE_VER_GET_NEUTRAL, pszPath, 0, cbVersionSz, pVerBuffer)) { UINT uiSz = sizeof(VS_FIXEDFILEINFO); if(!VerQueryValue(pVerBuffer, _u("\\"), (LPVOID*)&pFileInfo, &uiSz)) { hr = HRESULT_FROM_WIN32(GetLastError()); } else { hr = S_OK; } } else { hr = HRESULT_FROM_WIN32(GetLastError()); } } else { hr = E_OUTOFMEMORY; } } if(SUCCEEDED(hr)) { *majorVersion = pFileInfo->dwFileVersionMS; *minorVersion = pFileInfo->dwFileVersionLS; } else { *majorVersion = INVALID_VERSION; *minorVersion = INVALID_VERSION; } if(pVerBuffer) { NoCheckHeapDeleteArray(cbVersionSz, pVerBuffer); } return hr; #else // !_WIN32 // xplat-todo: how to handle version resource? *majorVersion = INVALID_VERSION; *minorVersion = INVALID_VERSION; return NOERROR; #endif }
bool AutoSystemInfo::InitPhysicalProcessorCount() { DWORD size = 0; DWORD countPhysicalProcessor = 0; PSYSTEM_LOGICAL_PROCESSOR_INFORMATION pBufferCurrent; PSYSTEM_LOGICAL_PROCESSOR_INFORMATION pBufferStart; BOOL bResult; Assert(!this->initialized); // Initialize physical processor to number of logical processors. // If anything below fails, we still need an approximate value this->dwNumberOfPhysicalProcessors = this->dwNumberOfProcessors; bResult = GetLogicalProcessorInformation(NULL, &size); if (bResult || GetLastError() != ERROR_INSUFFICIENT_BUFFER || !size) { return false; } DWORD count = (size) / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); if (size != count * sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION)) { Assert(false); return false; } pBufferCurrent = pBufferStart = NoCheckHeapNewArray(SYSTEM_LOGICAL_PROCESSOR_INFORMATION, (size_t)count); if (!pBufferCurrent) { return false; } bResult = GetLogicalProcessorInformation(pBufferCurrent, &size); if (!bResult) { return false; } while (pBufferCurrent < (pBufferStart + count)) { if (pBufferCurrent->Relationship == RelationProcessorCore) { countPhysicalProcessor++; } pBufferCurrent++; } NoCheckHeapDeleteArray(count, pBufferStart); this->dwNumberOfPhysicalProcessors = countPhysicalProcessor; return true; }
void LeakReport::DumpUrl(DWORD tid) { AutoCriticalSection autocs(&s_cs); if (!EnsureLeakReportFile()) { return; } UrlRecord * prev = nullptr; UrlRecord ** pprev = &LeakReport::urlRecordHead; UrlRecord * curr = *pprev; while (curr != nullptr) { if (curr->tid == tid) { char16 timeStr[26] = _u("00:00"); // xplat-todo: Need to implement _wasctime_s in the PAL #if _MSC_VER struct tm local_time; _localtime64_s(&local_time, &curr->time); _wasctime_s(timeStr, &local_time); #endif timeStr[wcslen(timeStr) - 1] = 0; Print(_u("%s - (%p, %p) %s\n"), timeStr, curr->scriptEngine, curr->globalObject, curr->url); *pprev = curr->next; NoCheckHeapDeleteArray(wcslen(curr->url) + 1, curr->url); NoCheckHeapDelete(curr); } else { pprev = &curr->next; prev = curr; } curr = *pprev; } if (prev == nullptr) { LeakReport::urlRecordTail = nullptr; } else if (prev->next == nullptr) { LeakReport::urlRecordTail = prev; } }
void String::Set(__in_z_opt const char16* pszValue) { if(NULL != this->pszValue) { NoCheckHeapDeleteArray(wcslen(this->pszValue) + 1, this->pszValue); } if(NULL != pszValue) { size_t size = 1 + wcslen(pszValue); this->pszValue = NoCheckHeapNewArray(char16, size); wcscpy_s(this->pszValue, size, pszValue); } else { this->pszValue = NULL; } }