#pragma once #include "nt.h" #include "ntrtl.h" #include "nturtl.h" #include "windows.h" #include #include #include #include #pragma warning(push) #pragma warning(disable: 4511) #pragma warning(disable: 4512) #pragma warning(disable: 4663) #include #pragma warning(disable: 4663) #include #include #include #pragma warning(pop) #include #include "sxsapi.h" #include "fusionlastwin32error.h" #include "fusionbuffer.h" #define SxStressToolGetCurrentProcessId() (HandleToUlong(NtCurrentTeb()->ClientId.UniqueProcess)) #define SxStressToolGetCurrentThreadId() (HandleToUlong(NtCurrentTeb()->ClientId.UniqueThread)) // // Conserve memory. // //typedef CGenericStringBuffer<1, CUnicodeCharTraits> CTinyUnicodeStringBuffer; typedef CTinyUnicodeStringBuffer CTinyStringBuffer; #include "fusiontrace.h" #include "fusiondeque.h" extern CEvent ResumeThreadsEvent; extern CEvent StopEvent; extern LONG ThreadsWaiting; extern LONG TotalThreads; extern CStringBuffer BaseDirectory; void ReportFailure(const char szFormat[], ...); BOOL InitializeMSIInstallTest(); void WaitForMSIInstallTestThreads(); void CleanupMSIInstallTest(); void RequestShutdownMSIInstallTestThreads(); DWORD WINAPI MSIInstallTestThreadProc(LPVOID); BOOL InitializeInstall(); void WaitForInstallThreads(); void CleanupInstall(); DWORD WINAPI InstallThreadProc(LPVOID); BOOL InitializeCreateActCtx(); void WaitForCreateActCtxThreads(); void CleanupCreateActCtx(); DWORD WINAPI CreateActCtxThreadProc(LPVOID); DWORD WINAPI InstallThreadProc( LPVOID pvData ); void RequestShutdownInstallThreads(); void RequestShutdownCreateActCtxThreads(); // // std::string has specialized find_first_not_of that uses integral positions, // and globally there is only find_first_of. Here we provide the expected // iterator-based find_first_not_of, based on the std::string code. // // Find the first occurence in [first1, last1) of an element in [first2, last). // // eg: // find_first_not_of("abc":"12;3", ":;"); // ^ // find_first_not_of(":12;3", ":;"); // ^ // find_first_not_of("3", ":;"); // ^ // template inline Iterator FindFirstNotOf(Iterator first1, Iterator last1, Iterator first2, Iterator last2) { if (first2 == last2) return last1; for ( ; first1 != last1 ; ++first1) { if (std::find(first2, last2, *first1) == last2) { break; } } return first1; } template inline Iterator FindFirstOf(Iterator first1, Iterator last1, Iterator first2, Iterator last2) { return std::find_first_of(first1, last1, first2, last2); } class SxStressToolUnicodeString_t: public UNICODE_STRING { public: typedef PCWSTR const_iterator; typedef PWSTR iterator; SxStressToolUnicodeString_t(PCWSTR s) { RtlInitUnicodeString(this, s); } SxStressToolUnicodeString_t(PCWSTR s, PCWSTR t) { this->Buffer = const_cast(s); const USHORT Length = static_cast(t - s) * sizeof(WCHAR); this->Length = Length; this->MaximumLength = Length; } SIZE_T size() const { return Length / sizeof(Buffer[0]); } SIZE_T length() const { return size(); } PCWSTR begin() const { return Buffer; } PCWSTR end() const { return begin() + size(); } PWSTR begin() { return Buffer; } PWSTR end() { return begin() + size(); } }; template inline void SxStressToolSplitString( const String_t& String, const String_t& Delim, std::vector& Fields ) { String_t::const_iterator FieldBegin; String_t::const_iterator FieldEnd = String.begin(); while ((FieldBegin = FindFirstNotOf(FieldEnd, String.end(), Delim.begin(), Delim.end())) != String.end()) { FieldEnd = FindFirstOf(FieldBegin, String.end(), Delim.begin(), Delim.end()); Fields.push_back(String_t(FieldBegin, FieldEnd)); } } typedef struct _FUSION_FLAG_FORMAT_MAP_ENTRY FUSION_FLAG_FORMAT_MAP_ENTRY, *PFUSION_FLAG_FORMAT_MAP_ENTRY; typedef const FUSION_FLAG_FORMAT_MAP_ENTRY *PCFUSION_FLAG_FORMAT_MAP_ENTRY; BOOL SxStressToolExtractFlagsFromString( ULONG Flags, PCFUSION_FLAG_FORMAT_MAP_ENTRY FlagData, ULONG NumberOfFlagData, PCWSTR FlagString, ULONG& FlagOut ); LONG StringToNumber(PCWSTR s); PCWSTR StringToResourceString(PCWSTR s); BOOL SxStressToolGetStringSetting( ULONG Flags, PCWSTR IniFilePath, PCWSTR Section, PCWSTR Key, PCWSTR Default, CBaseStringBuffer& Buffer, PCWSTR* DumbPointer OPTIONAL = 0 ); BOOL SxStressToolGetFlagSetting( ULONG Flags, PCWSTR IniFilePath, PCWSTR Section, PCWSTR Key, ULONG& FlagsOut, PCFUSION_FLAG_FORMAT_MAP_ENTRY FlagData, ULONG NumberOfFlagData ); BOOL SxStressToolGetResourceIdSetting( ULONG FutureFlags, PCWSTR IniFilePath, PCWSTR Section, PCWSTR Key, CBaseStringBuffer& Buffer, PCWSTR* DumbPointer ); BOOL WaitForThreadResumeEvent(); BOOL SxspGetPrivateProfileIntW( PCWSTR pcwszSection, PCWSTR pcwszKeyName, INT defaultValue, INT &Target, PCWSTR pcwszFilename ); BOOL SxspGetPrivateProfileStringW( PCWSTR pcwszSection, PCWSTR pcwszKeyName, PCWSTR pcwszDefault, OUT CBaseStringBuffer &buffTarget, PCWSTR pcwszFileName ); BOOL SxspIsPrivateProfileStringEqual( PCWSTR pcwszSection, PCWSTR pcwszKeyName, PCWSTR pcwszTestValue, BOOL &rfIsEqual, PCWSTR pcwszFileName );