// StructureWapperHelpers.cpp // ////////////////////////////////////////////////////////////////////// //*************************************************************************** // // judyp May 1999 // //*************************************************************************** #include "stdafx.h" #pragma warning (disable : 4786) #pragma warning (disable : 4275) #include #include #include #include #include #include #include using namespace std; #include #include #ifdef NONNT5 typedef unsigned long ULONG_PTR; #endif #include #include #include #include #include #include "t_string.h" #include "Persistor.h" #include "Logger.h" #include "TCOData.h" #include "Utilities.h" #include "StructureWrappers.h" #include "StructureWapperHelpers.h" #include "ConstantMap.h" extern CConstantMap g_ConstantMap; static TCHAR g_tcNl = _T('\n'); static TCHAR g_tcCR = 0x0d; static TCHAR g_tcLF = 0x0a; #ifdef _UNICODE static TCHAR g_tcDQuote[] = _T("\""); static TCHAR g_atcNL[] = {0x0d, 0x0a, 0x00}; #else static TCHAR g_atcNL[] = {g_tcNl}; static TCHAR g_tcDQuote = _T('"'); #endif // Why we are not using formatted input: #if 0 From: Phil Lucido (Exchange) Sent: Friday, April 16, 1999 10:34 AM To: Judy Powell Cc: Visual C++ Special Interest Group Subject: RE: Wide character output via wfstream from the "Standard Library" using VC 6 Enterprise Edition SP2 on NT4 SP4 It looks like our iostreams implementation for wide-char streams is actually wide-char in memory, multibyte chars on disk. The reason you get an empty file is because wctomb is failing on 0xfeff. This should work more like the stdio stuff, where a text mode wide-char stream writes multibyte chars to a file, but binary mode writes the raw unicode. We get our C++ Library implementation from Dinkumware (P.J. Plauger). I'll check with him to see about changing this implementation so binary mode wide-char iostream is compatible with wide-char stdio. ...Phil #endif ////////////////////////////////////////////////////////////////////// // Helpers ////////////////////////////////////////////////////////////////////// void LogFileModeOut(t_ostream &ros, ULONG LogFileMode) { // EVENT_TRACE_FILE_MODE_NONE 0x0000 // logfile is off // EVENT_TRACE_FILE_MODE_SEQUENTIAL 0x0001 // log sequentially // EVENT_TRACE_FILE_MODE_CIRCULAR 0x0002 // log in circular manner // EVENT_TRACE_FILE_MODE_NEWFILE 0x0004 // log to new file if full // EVENT_TRACE_REAL_TIME_MODE 0x0100 // real time mode on // EVENT_TRACE_DELAY_OPEN_FILE_MODE 0x0200 // delay opening file // EVENT_TRACE_BUFFERING_MODE 0x0400 // buffering mode only t_string tsOut; // @#$ENUM: says that we are not storing a literal value. tsOut = _T("\"LogFileMode:@#$ENUM:"); PutALine(ros, tsOut.c_str()); bool bFirstOut = true; // Values we anticipate. if (LogFileMode == 0) { tsOut = _T("0"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } if (LogFileMode & EVENT_TRACE_FILE_MODE_NONE) { tsOut = _T("EVENT_TRACE_FILE_MODE_NONE"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } if (LogFileMode & EVENT_TRACE_FILE_MODE_SEQUENTIAL) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_FILE_MODE_SEQUENTIAL"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_FILE_MODE_SEQUENTIAL"); PutALine(ros, tsOut.c_str()); } } if (LogFileMode & EVENT_TRACE_FILE_MODE_CIRCULAR) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_FILE_MODE_CIRCULAR"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_FILE_MODE_CIRCULAR"); PutALine(ros, tsOut.c_str()); } } if (LogFileMode & EVENT_TRACE_FILE_MODE_NEWFILE) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_FILE_MODE_NEWFILE"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_FILE_MODE_NEWFILE"); PutALine(ros, tsOut.c_str()); } } if (LogFileMode & EVENT_TRACE_REAL_TIME_MODE) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_REAL_TIME_MODE"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_REAL_TIME_MODE"); PutALine(ros, tsOut.c_str()); } } if (LogFileMode & EVENT_TRACE_DELAY_OPEN_FILE_MODE) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_DELAY_OPEN_FILE_MODE"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_DELAY_OPEN_FILE_MODE"); PutALine(ros, tsOut.c_str()); } } if (LogFileMode & EVENT_TRACE_PRIVATE_LOGGER_MODE) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_PRIVATE_LOGGER_MODE"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_PRIVATE_LOGGER_MODE"); PutALine(ros, tsOut.c_str()); } } if (LogFileMode & EVENT_TRACE_BUFFERING_MODE) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_BUFFERING_MODE"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_BUFFERING_MODE"); PutALine(ros, tsOut.c_str()); } } // A value we did not anticipate. ULONG uExpected = EVENT_TRACE_FILE_MODE_NONE | EVENT_TRACE_FILE_MODE_SEQUENTIAL | EVENT_TRACE_FILE_MODE_CIRCULAR | EVENT_TRACE_FILE_MODE_NEWFILE | EVENT_TRACE_REAL_TIME_MODE | EVENT_TRACE_DELAY_OPEN_FILE_MODE | EVENT_TRACE_BUFFERING_MODE | EVENT_TRACE_PRIVATE_LOGGER_MODE; if ((uExpected | LogFileMode) != uExpected) { if (bFirstOut) { tsOut = _T("@#$UNKNOWNVALUE:0x"); PutALine(ros, tsOut.c_str()); PutAULONGVar(ros, ~uExpected & LogFileMode, true); } else { tsOut = _T("|@#$UNKNOWNVALUE:0x"); PutALine(ros, tsOut.c_str()); PutAULONGVar(ros, ~uExpected & LogFileMode, true); } } tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); } void EnableFlagsOut(t_ostream &ros, ULONG EnableFlags) { // EVENT_TRACE_FLAG_PROCESS 0x00000001 // process start & end // EVENT_TRACE_FLAG_THREAD 0x00000002 // thread start & end // EVENT_TRACE_FLAG_IMAGE_LOAD 0x00000004 // image load // EVENT_TRACE_FLAG_DISK_IO 0x00000100 // physical disk IO // EVENT_TRACE_FLAG_DISK_FILE_IO 0x00000200 // requires disk IO // EVENT_TRACE_FLAG_MEMORY_PAGE_FAULTS 0x00001000 // all page faults // EVENT_TRACE_FLAG_MEMORY_HARD_FAULTS 0x00002000 // hard faults only // EVENT_TRACE_FLAG_NETWORK_TCPIP 0x00010000 // tcpip send & receive // // Pre-defined Enable flags for everybody else // // EVENT_TRACE_FLAG_PRIVATE 0xC0000000 // Private buffering // EVENT_TRACE_FLAG_EXTENSION 0x80000000 // indicates more flags // EVENT_TRACE_FLAG_FORWARD_WMI 0x40000000 // Can forward to WMI // EVENT_TRACE_FLAG_ENABLE_RESERVE1 0x20000000 // Reserved // EVENT_TRACE_FLAG_ENABLE_RESERVE2 0x10000000 // Reserved t_string tsOut; // @#$ENUM: says that we are not storing a literal value. tsOut = _T("\"EnableFlags:@#$ENUM:"); PutALine(ros, tsOut.c_str()); bool bFirstOut = true; if (EnableFlags == 0) { tsOut = _T("0"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } if (EnableFlags & EVENT_TRACE_FLAG_PROCESS) { tsOut = _T("EVENT_TRACE_FLAG_PROCESS"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } if (EnableFlags & EVENT_TRACE_FLAG_THREAD) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_FLAG_THREAD"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_FLAG_THREAD"); PutALine(ros, tsOut.c_str()); } } if (EnableFlags & EVENT_TRACE_FLAG_THREAD) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_FLAG_THREAD"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_FLAG_THREAD"); PutALine(ros, tsOut.c_str()); } } if (EnableFlags & EVENT_TRACE_FLAG_IMAGE_LOAD) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_FLAG_IMAGE_LOAD"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_FLAG_IMAGE_LOAD"); PutALine(ros, tsOut.c_str()); } } if (EnableFlags & EVENT_TRACE_FLAG_DISK_IO) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_FLAG_DISK_IO"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_FLAG_DISK_IO"); PutALine(ros, tsOut.c_str()); } } if (EnableFlags & EVENT_TRACE_FLAG_DISK_FILE_IO) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_FLAG_DISK_FILE_IO"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_FLAG_DISK_FILE_IO"); PutALine(ros, tsOut.c_str()); } } if (EnableFlags & EVENT_TRACE_FLAG_MEMORY_PAGE_FAULTS) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_FLAG_MEMORY_PAGE_FAULTS"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_FLAG_MEMORY_PAGE_FAULTS"); PutALine(ros, tsOut.c_str()); } } if (EnableFlags & EVENT_TRACE_FLAG_MEMORY_HARD_FAULTS) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_FLAG_MEMORY_HARD_FAULTS"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_FLAG_MEMORY_HARD_FAULTS"); PutALine(ros, tsOut.c_str()); } } if (EnableFlags & EVENT_TRACE_FLAG_NETWORK_TCPIP) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_FLAG_NETWORK_TCPIP"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_FLAG_NETWORK_TCPIP"); PutALine(ros, tsOut.c_str()); } } #if 0 if (EnableFlags & EVENT_TRACE_FLAG_PRIVATE) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_FLAG_PRIVATE"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_FLAG_PRIVATE"); PutALine(ros, tsOut.c_str()); } } #endif if (EnableFlags & EVENT_TRACE_FLAG_EXTENSION) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_FLAG_EXTENSION"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_FLAG_EXTENSION"); PutALine(ros, tsOut.c_str()); } } if (EnableFlags & EVENT_TRACE_FLAG_FORWARD_WMI) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_FLAG_FORWARD_WMI"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_FLAG_FORWARD_WMI"); PutALine(ros, tsOut.c_str()); } } #if 0 if (EnableFlags & EVENT_TRACE_FLAG_ENABLE_RESERVE1) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_FLAG_ENABLE_RESERVE1"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_FLAG_ENABLE_RESERVE1"); PutALine(ros, tsOut.c_str()); } } if (EnableFlags & EVENT_TRACE_FLAG_ENABLE_RESERVE2) { if (bFirstOut) { tsOut = _T("EVENT_TRACE_FLAG_ENABLE_RESERVE2"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|EVENT_TRACE_FLAG_ENABLE_RESERVE2"); PutALine(ros, tsOut.c_str()); } } #endif ULONG uExpected = EVENT_TRACE_FLAG_PROCESS | EVENT_TRACE_FLAG_THREAD | EVENT_TRACE_FLAG_IMAGE_LOAD | EVENT_TRACE_FLAG_DISK_IO | EVENT_TRACE_FLAG_DISK_FILE_IO | EVENT_TRACE_FLAG_MEMORY_PAGE_FAULTS | EVENT_TRACE_FLAG_MEMORY_HARD_FAULTS | EVENT_TRACE_FLAG_NETWORK_TCPIP | EVENT_TRACE_FLAG_EXTENSION | EVENT_TRACE_FLAG_FORWARD_WMI; if ((uExpected | EnableFlags) != uExpected) { if (bFirstOut) { tsOut = _T("@#$UNKNOWNVALUE:0x"); PutALine(ros, tsOut.c_str()); PutAULONGVar(ros, ~uExpected & EnableFlags, true); } else { tsOut = _T("|@#$UNKNOWNVALUE:0x"); PutALine(ros, tsOut.c_str()); PutAULONGVar(ros, ~uExpected & EnableFlags, true); } } tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); } // "Wnode.Flags:@#$ENUM:WNODE_FLAG_ALL_DATA" void WnodeFlagsOut(t_ostream &ros, ULONG WnodeFlags) { t_string tsOut; // @#$ENUM: says that we are not storing a literal value. tsOut = _T("\"Wnode.Flags:@#$ENUM:"); PutALine(ros, tsOut.c_str()); bool bFirstOut = true; if (WnodeFlags & WNODE_FLAG_TRACED_GUID) { if (bFirstOut) { tsOut = _T("WNODE_FLAG_TRACED_GUID"); PutALine(ros, tsOut.c_str()); bFirstOut = false; } else { tsOut = _T("|WNODE_FLAG_TRACED_GUID"); PutALine(ros, tsOut.c_str()); } } ULONG uExpected = WNODE_FLAG_TRACED_GUID; if ((uExpected | WnodeFlags) != uExpected) { if (bFirstOut) { tsOut = _T("@#$UNKNOWNVALUE:0x"); PutALine(ros, tsOut.c_str()); PutAULONGVar(ros, ~uExpected & WnodeFlags, true); } else { tsOut = _T("|@#$UNKNOWNVALUE:0x"); PutALine(ros, tsOut.c_str()); PutAULONGVar(ros, ~uExpected & WnodeFlags, true); } } tsOut = g_tcDQuote; tsOut += g_atcNL; PutALine(ros, tsOut.c_str()); } // We print out a GUID in the form: // "{0000cbd1-0011-11d0-0d00-00aa006d010a}" // typedef struct _GUID // { // DWORD Data1; // WORD Data2; // WORD Data3; // BYTE Data4[8]; // } GUID; // Data4 specifies an array of 8 bytes. The first 2 bytes contain // the third group of 4 hexadecimal digits. The remaining 6 bytes // contain the final 12 hexadecimal digits. We have separate // logic for acsii and unicode for Data4. void GUIDOut(t_ostream &ros, GUID Guid) { t_string tsOut; t_strstream strStream; strStream << _T("{"); strStream.fill(_T('0')); strStream.width(8); strStream.flags(ros.flags() | ios_base::right); strStream << hex << Guid.Data1; strStream << _T("-"); strStream.width(4); strStream << hex << Guid.Data2; strStream << _T("-"); strStream << hex << Guid.Data3; strStream << _T("-"); // Data4 specifies an array of 8 bytes. The first 2 bytes contain // the third group of 4 hexadecimal digits. The remaining 6 bytes // contain the final 12 hexadecimal digits. #ifndef _UNICODE int i; strStream.width(1); BYTE Byte; int Int; for (i = 0; i < 2; i++) { Byte = Guid.Data4[i]; Byte = Byte >> 4; Int = Byte; strStream << hex << Int; Byte = Guid.Data4[i]; Byte = 0x0f & Byte; Int = Byte; strStream << hex << Int; } strStream << _T("-"); strStream.width(1); for (i = 2; i < 8; i++) { BYTE Byte = Guid.Data4[i]; Byte = Byte >> 4; Int = Byte; strStream << hex << Int; Byte = Guid.Data4[i]; Byte = 0x0f & Byte; Int = Byte; strStream << hex << Int; } #else int i; for (i = 0; i < 2; i++) { TCHAR tc = Guid.Data4[i]; // For some reason the width is reset each time through the // loop to be one. strStream.width(2); strStream << hex << tc; } strStream << _T("-"); BYTE Byte; strStream.width(1); for (i = 2; i < 8; i++) { Byte = Guid.Data4[i]; Byte = Byte >> 4; strStream << hex << Byte; Byte = Guid.Data4[i]; Byte = 0x0f & Byte; strStream << hex << Byte; } #endif strStream << _T("}"); strStream >> tsOut; PutALine(ros, tsOut.c_str() , -1); } void LARGE_INTEGEROut(t_ostream &ros, LARGE_INTEGER Large) { t_string tsOut; tsOut = _T("{0x"); PutALine(ros, tsOut.c_str() , -1); LONG Long = Large.u.HighPart; PutALONGVar(ros, Large.u.HighPart,true); DWORD DWord = Large.u.LowPart; PutADWORDVar(ros, DWord); tsOut = _T("}"); PutALine(ros, tsOut.c_str() , -1); } void InitializeTCHARVar(t_string &rtsValue , void *pVar) { TCHAR **pTCHAR = reinterpret_cast (pVar); if (rtsValue.length() > 0) { // Null string. if (case_insensitive_compare(rtsValue,_T("@#$STRING_NULL")) == 0) { *pTCHAR = NULL; } // Empty string. else if (case_insensitive_compare(rtsValue,_T("@#$STRING_EMPTY")) == 0) { *pTCHAR = NewTCHAR(_T("")); } else // Just a string. { *pTCHAR = NewTCHAR(rtsValue.c_str()); } } else // Empty string. { *pTCHAR = NewTCHAR(_T("")); } } //"EVENT_TRACE_FILE_MODE_NEWFILE|EVENT_TRACE_REAL_TIME_MODE|@#$UNKNOWNVALUE:0x20" //"EVENT_TRACE_FLAG_IMAGE_LOAD|EVENT_TRACE_FLAG_DISK_IO|@#$UNKNOWNVALUE:0x20" void InitializeEnumVar(t_string &rtsValue , void *pVar) { ULONG *pULong = reinterpret_cast (pVar); *pULong = 0; int nEndPos; int nBegPos = 0; int nSubstrLen; t_string tsTemp; CONSTMAP::iterator Iterator; bool bDone = false; while (!bDone) { nEndPos = rtsValue.find(_T("|"), nBegPos); if (nEndPos == t_string::npos) { bDone = true; nEndPos = rtsValue.length(); } nSubstrLen = nEndPos - nBegPos; tsTemp = rtsValue.substr(nBegPos, nSubstrLen); Iterator = g_ConstantMap.m_Map.find(tsTemp); if (Iterator == g_ConstantMap.m_Map.end()) { // Had better be @#$UNKNOWNVALUE:0x if (tsTemp.compare(0, 18, _T("@#$UNKNOWNVALUE:0x")) == 0) { tsTemp = rtsValue.substr(nBegPos + 18); ULONG ulTemp; InitializeULONGVar(tsTemp , (void *) &ulTemp, true); *pULong |= ulTemp; } } else { *pULong |= (*Iterator).second; } nBegPos = nEndPos + 1; } } // Expect HANDLEs to be in the form 0xnnnnnnnn void InitializeHandleVar(t_string &rtsValue , void *pVar) { HANDLE *pHandle = reinterpret_cast (pVar); HANDLE handle; t_strstream strStream; t_string tsTemp; tsTemp = rtsValue.substr(2); strStream << tsTemp; strStream >> handle; *pHandle = handle; } void InitializeULONGVar(t_string &rtsValue , void *pVar, bool bHex ) { ULONG *pULong = reinterpret_cast (pVar); ULONG uLong; t_strstream strStream; strStream << rtsValue; if (bHex) { strStream >> hex >> uLong; } else { strStream >> uLong; } *pULong = uLong; } void InitializeLONGVar(t_string &rtsValue , void *pVar) { LONG *pLong = reinterpret_cast (pVar); LONG Long; t_strstream strStream; strStream << rtsValue; strStream >> Long; *pLong = Long; } t_istream &GetAChar(t_istream &ris,TCHAR &tc) { #ifndef _UNICODE tc = ris.get(); return ris; #else char *pChar = (char *) &tc; pChar[0] = ris.get(); pChar[1] = ris.get(); return ris; #endif } // See note at top of this file to understand why we are not using // formatted input. // We are reading in a wide character file one byte at a time and // creating our two byte characters from each two byte sequence. t_istream &GetALine(t_istream &ris,TCHAR *tcBuffer, int nBufferSize) { #ifndef _UNICODE t_istream &r = ris.getline(tcBuffer,nBufferSize - 1,_T('\n')); // Docs for getline say that it sould eat the new line. It does // not, and it does even worse. It returns a 0x0d which we delete. // This should work even when getline does // what the docs say it will. int n = _tcsclen(tcBuffer) - 1; if (tcBuffer[n] == 0x0d) { tcBuffer[n] = _T('\0'); } return r; #else char *pChar = (char *) tcBuffer; bool bSkipNext = false; bool bEOL = false; int intIn1; int intIn2; int i = 0; int count = 0; while (1) { intIn1 = ris.get(); if (ris.eof()) { break; } intIn2 = ris.get(); if (intIn1 == 0x0d && intIn2 == 0x0) { // Found 0x0d so eat the 0x0a. intIn1 = ris.get(); intIn2 = ris.get(); tcBuffer[i / 2] = _T('\0'); break; } else { pChar[i++] = intIn1; pChar[i++] = intIn2; } } if (i == 0) { tcBuffer[0] = _T('\0'); } return ris; #endif } // See note at top of this file to understand why we are not using // formatted input. // We are writing out a wide character file one byte at a time. // nBufferSize is the number of TCHARS not size in bytes. // if nBufferSize == -1 tcBuffer better be a null terminated string. // Will handle a unicode string with "proper" and "inproper" newlines. t_ostream &PutALine(t_ostream &ros,const TCHAR *tcBuffer, int nBufferSize) { #ifndef _UNICODE // return ros << tcBuffer; const char *pBuffer = tcBuffer; int nSize = nBufferSize; if (nBufferSize == -1) { nSize = _tcsclen(tcBuffer); } for (int i = 0; i < nSize; i++) { int intOut = pBuffer[i]; if (intOut == 0x0a && pBuffer[i - 1] != 0x0d) { ros.put(0x0d); } ros.put(intOut); } return ros; #else char *pBuffer = (char *) tcBuffer; int nSize = nBufferSize; if (nBufferSize == -1) { nSize = _tcsclen(tcBuffer); } for (int i = 0; i < nSize * 2; i++) { int intOut = pBuffer[i]; if (intOut == 0x0a && pBuffer[i - 2] != 0x0d) { ros.put(0x0d); ros.put(0x0); } ros.put(intOut); } return ros; #endif } // Hex flavor not tested for non-unicode. t_ostream &PutALONGVar(t_ostream &ros, LONG l, bool bHex) { #ifndef _UNICODE if (bHex) { TCHAR f = ros.fill(_T('0')); int w = ros.width(8); int fl = ros.flags(ros.flags() | ios_base::right); ros << hex << l; ros.fill(f); ros.width(w); ros.flags(fl); return ros << dec; } else { return ros << l; } #else t_string tsTemp; t_strstream strStream; if (bHex) { strStream.width(8); strStream.fill('0'); strStream.flags(ios_base::right); strStream << hex << l; } else { strStream << l; } strStream >> tsTemp; PutALine(ros, tsTemp.c_str() , -1); return ros; #endif } t_ostream &PutAULONG64Var(t_ostream &ros, ULONG64 ul64) { ULONG *lArray = (ULONG *) &ul64; PutAULONGVar( ros, lArray[0], true); PutAULONGVar( ros, lArray[1], true); return ros; } t_ostream &PutAULONGVar(t_ostream &ros, ULONG ul, bool bHex) { #ifndef _UNICODE if (bHex) { TCHAR f = ros.fill(_T('0')); int w = ros.width(8); int fl = ros.flags(ros.flags() | ios_base::right); ros << hex << ul; ros.fill(f); ros.width(w); ros.flags(fl); return ros << dec; } else { return ros << ul; } #else t_string tsTemp; t_strstream strStream; if (bHex) { strStream.width(8); strStream.fill('0'); strStream.flags(ios_base::right); strStream << hex << ul; } else { strStream << ul; } strStream >> tsTemp; PutALine(ros, tsTemp.c_str() , -1); return ros; #endif } t_ostream &PutADWORDVar(t_ostream &ros, DWORD dw) { #ifndef _UNICODE TCHAR f = ros.fill(_T('0')); int w = ros.width(8); int fl = ros.flags(ros.flags() | ios_base::right); ros << hex << dw; ros.fill(f); ros.width(w); ros.flags(fl); return ros << dec; #else t_string tsTemp; t_strstream strStream; strStream.width(8); strStream.fill('0'); strStream.flags(ios_base::right); strStream << hex << dw; strStream >> tsTemp; PutALine(ros, tsTemp.c_str() , -1); return ros; #endif } void InitializeGUIDVar(t_string &rtsValue , void *pVar) { GUID *pGUID = reinterpret_cast (pVar); if (rtsValue.length() > 0 && case_insensitive_compare(rtsValue,_T("@#$NA")) != 0) { wGUIDFromString(rtsValue.c_str(), pGUID); } else { RtlZeroMemory(pGUID, sizeof(GUID)); } } // *** Following routine copied from WMI\MofCheck. to convert // a guid string to a GUID. // The routines below were blantenly stolen without remorse from the ole // sources in \nt\private\ole32\com\class\compapi.cxx. They are copied here // so that WMI doesn't need to load in ole32 only to convert a guid string // into its binary representation. // //+------------------------------------------------------------------------- // // Function: HexStringToDword (private) // // Synopsis: scan lpsz for a number of hex digits (at most 8); update lpsz // return value in Value; check for chDelim; // // Arguments: [lpsz] - the hex string to convert // [Value] - the returned value // [cDigits] - count of digits // // Returns: TRUE for success // //-------------------------------------------------------------------------- BOOL HexStringToDword(LPCTSTR lpsz, DWORD * RetValue, int cDigits, WCHAR chDelim) { int Count; DWORD Value; Value = 0; for (Count = 0; Count < cDigits; Count++, lpsz++) { if (*lpsz >= '0' && *lpsz <= '9') Value = (Value << 4) + *lpsz - '0'; else if (*lpsz >= 'A' && *lpsz <= 'F') Value = (Value << 4) + *lpsz - 'A' + 10; else if (*lpsz >= 'a' && *lpsz <= 'f') Value = (Value << 4) + *lpsz - 'a' + 10; else return(FALSE); } *RetValue = Value; if (chDelim != 0) return *lpsz++ == chDelim; else return TRUE; } //+------------------------------------------------------------------------- // // Function: wUUIDFromString (internal) // // Synopsis: Parse UUID such as 00000000-0000-0000-0000-000000000000 // // Arguments: [lpsz] - Supplies the UUID string to convert // [pguid] - Returns the GUID. // // Returns: TRUE if successful // //-------------------------------------------------------------------------- BOOL wUUIDFromString(LPCTSTR lpsz, LPGUID pguid) { DWORD dw; if (!HexStringToDword(lpsz, &pguid->Data1, sizeof(DWORD)*2, '-')) return FALSE; lpsz += sizeof(DWORD)*2 + 1; if (!HexStringToDword(lpsz, &dw, sizeof(WORD)*2, '-')) return FALSE; lpsz += sizeof(WORD)*2 + 1; pguid->Data2 = (WORD)dw; if (!HexStringToDword(lpsz, &dw, sizeof(WORD)*2, '-')) return FALSE; lpsz += sizeof(WORD)*2 + 1; pguid->Data3 = (WORD)dw; if (!HexStringToDword(lpsz, &dw, sizeof(BYTE)*2, 0)) return FALSE; lpsz += sizeof(BYTE)*2; pguid->Data4[0] = (BYTE)dw; if (!HexStringToDword(lpsz, &dw, sizeof(BYTE)*2, '-')) return FALSE; lpsz += sizeof(BYTE)*2+1; pguid->Data4[1] = (BYTE)dw; if (!HexStringToDword(lpsz, &dw, sizeof(BYTE)*2, 0)) return FALSE; lpsz += sizeof(BYTE)*2; pguid->Data4[2] = (BYTE)dw; if (!HexStringToDword(lpsz, &dw, sizeof(BYTE)*2, 0)) return FALSE; lpsz += sizeof(BYTE)*2; pguid->Data4[3] = (BYTE)dw; if (!HexStringToDword(lpsz, &dw, sizeof(BYTE)*2, 0)) return FALSE; lpsz += sizeof(BYTE)*2; pguid->Data4[4] = (BYTE)dw; if (!HexStringToDword(lpsz, &dw, sizeof(BYTE)*2, 0)) return FALSE; lpsz += sizeof(BYTE)*2; pguid->Data4[5] = (BYTE)dw; if (!HexStringToDword(lpsz, &dw, sizeof(BYTE)*2, 0)) return FALSE; lpsz += sizeof(BYTE)*2; pguid->Data4[6] = (BYTE)dw; if (!HexStringToDword(lpsz, &dw, sizeof(BYTE)*2, 0)) return FALSE; lpsz += sizeof(BYTE)*2; pguid->Data4[7] = (BYTE)dw; return TRUE; } //+------------------------------------------------------------------------- // // Function: wGUIDFromString (internal) // // Synopsis: Parse GUID such as {00000000-0000-0000-0000-000000000000} // // Arguments: [lpsz] - the guid string to convert // [pguid] - guid to return // // Returns: TRUE if successful // //-------------------------------------------------------------------------- BOOL wGUIDFromString(LPCTSTR lpsz, LPGUID pguid) { if (*lpsz == '{' ) lpsz++; if(wUUIDFromString(lpsz, pguid) != TRUE) return FALSE; lpsz +=36; if (*lpsz == '}' ) lpsz++; if (*lpsz != '\0') // check for zero terminated string - test bug #18307 { return FALSE; } return TRUE; } int case_insensitive_compare(t_string &r1, t_string &r2) { t_string tsTemp1; t_string tsTemp2; tsTemp1 = r1.c_str(); tsTemp2 = r2.c_str(); int i; for (i = 0; i < tsTemp1.length(); i++) { tsTemp1.replace(i,1,1, toupper(tsTemp1[i])); } for (i = 0; i < tsTemp2.length(); i++) { tsTemp2.replace(i,1,1, toupper(tsTemp2[i])); } return tsTemp1.compare(tsTemp2); } int case_insensitive_compare(TCHAR *p, t_string &r2) { if (p == NULL) { return -1; } t_string tsTemp; tsTemp = p; return case_insensitive_compare(tsTemp, r2); } int case_insensitive_compare(t_string &r1,TCHAR *p ) { if (p == NULL) { return 1; } t_string tsTemp; tsTemp = p; return case_insensitive_compare(r1, tsTemp); } int case_insensitive_compare(TCHAR *p1,TCHAR *p2) { if (!p1 && !p2) { return 0; } else if (!p1) { return -1; } else if (!p2) { return 1; } int l1 = _tcslen(p1); int l2 = _tcslen(p2); int nCompare = _tcsnicmp(p1,p2,_MIN(l1,l2)); if (nCompare == 0) { if (l1 == l2) { return 0; } else if (l1 < l2) { return -1; } else { return 1; } } else { return nCompare; } }