// About.cpp : Implementation of CAbout #include "stdafx.h" #include "About.h" #include "SLNKDWFVersion.h" #define SECURITY_WIN32 #include "Security.h" #include "accctrl.h" #include "aclapi.h" #include "sddl.h" // CAbout extern HINSTANCE g_hInstance; // In release mode verwijderen we altijd About.obj om hercompile te forceren CString buildDATE(__DATE__); CString buildTIME(__TIME__); STDMETHODIMP CAbout::get_All(BSTR* pVal) { char module[_MAX_PATH]; // HMODULE GetModuleFileName(g_hInstance, module, sizeof(module)/sizeof(char)); char name[_MAX_PATH]; // HMODULE ULONG cnt = sizeof(name)/sizeof(char); if (!GetUserNameEx(NameSamCompatible, name, &cnt)) { myTRACE("\nGetUserNameEx failed (%d): %s", GetLastError(), myGetLastErrorMsg()); } CString result; result.Format(" SLNKDWF: built on %s, %s" "\n DLL: %s" #ifdef _DEBUG " (debug version)" #endif "\nUsercontext: %s", buildDATE, buildTIME, module, name); (*pVal) = result.AllocSysString(); return S_OK; } STDMETHODIMP CAbout::get_DLLPath(BSTR* pVal) { char module[_MAX_PATH]; // HMODULE GetModuleFileName(g_hInstance, module, sizeof(module)); CString result; result.Format("%s", module); (*pVal) = result.AllocSysString(); return S_OK; } STDMETHODIMP CAbout::get_Buildtime(BSTR* pVal) { CString result; result.Format("%s, %s", buildDATE, buildTIME); (*pVal) = result.AllocSysString(); return S_OK; } STDMETHODIMP CAbout::get_UserContext(BSTR* pVal) { char name[_MAX_PATH]; // HMODULE ULONG cnt = sizeof(name)/sizeof(char); CString result; if (!GetUserNameEx(NameSamCompatible, name, &cnt)) { myTRACE("\nGetUserNameEx failed (%d): %s", GetLastError(), myGetLastErrorMsg()); result = "Unable to detect user"; } else result = name; (*pVal) = result.AllocSysString(); return S_OK; } STDMETHODIMP CAbout::get_VersionMajor(LONG* pVal) { (*pVal) = SLNK_MAJOR_VERSION; return S_OK; } STDMETHODIMP CAbout::get_VersionMinor(LONG* pVal) { (*pVal) = SLNK_MINOR_VERSION; return S_OK; } STDMETHODIMP CAbout::get_VersionString(BSTR* pVal) { CString result = SLNK_BUILDVERSION; (*pVal) = result.AllocSysString(); return S_OK; } STDMETHODIMP CAbout::get_usTimer(DOUBLE* pVal) { LARGE_INTEGER currTime; LARGE_INTEGER frequency; (*pVal)=0; if (!QueryPerformanceFrequency(&frequency)) return S_OK; if (!QueryPerformanceCounter(&currTime)) return S_OK; (*pVal) = ((double)currTime.QuadPart)*1000000/frequency.QuadPart; return S_OK; } // Handig voor sommige load-tests STDMETHODIMP CAbout::Sleep(LONG pVal) { ::Sleep(pVal); return S_OK; } STDMETHODIMP CAbout::fileOwner(BSTR fname, BSTR* pVal) { CString filename(fname); CString result = ""; DWORD dwRtnCode = 0; PSID pSidOwner = NULL; BOOL bRtnBool = TRUE; LPTSTR AcctName = NULL; LPTSTR DomainName = NULL; DWORD dwAcctName = 1, dwDomainName = 1; SID_NAME_USE eUse = SidTypeUnknown; HANDLE hFile; PSECURITY_DESCRIPTOR pSD = NULL; // Get the handle of the file object. hFile = CreateFile( filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, NULL); // Check GetLastError for CreateFile error code. if (hFile == INVALID_HANDLE_VALUE) { return myAtlReportError(GetObjectCLSID(), "\nCAbout::fileOwner('%ls')", (LPCSTR)fname); } // Get the owner SID of the file. dwRtnCode = GetSecurityInfo( hFile, SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION, &pSidOwner, NULL, NULL, NULL, &pSD); CloseHandle(hFile); // Check GetLastError for GetSecurityInfo error condition. if (dwRtnCode != ERROR_SUCCESS) { return myAtlReportError(GetObjectCLSID(), "\nCAbout::fileOwner('%ls') GetSecurityInfo", (LPCSTR)fname); } // First call to LookupAccountSid to get the buffer sizes. bRtnBool = LookupAccountSid( NULL, // local computer pSidOwner, AcctName, (LPDWORD)&dwAcctName, DomainName, (LPDWORD)&dwDomainName, &eUse); // Reallocate memory for the buffers. AcctName = (LPTSTR)GlobalAlloc(GMEM_FIXED, dwAcctName); // Check GetLastError for GlobalAlloc error condition. if (AcctName == NULL) { return myAtlReportError(GetObjectCLSID(), "\nCAbout::fileOwner('%ls') GlobalAlloc", (LPCSTR)fname); } DomainName = (LPTSTR)GlobalAlloc(GMEM_FIXED, dwDomainName); // Check GetLastError for GlobalAlloc error condition. if (DomainName == NULL) { return myAtlReportError(GetObjectCLSID(), "\nCAbout::fileOwner('%ls') GlobalAlloc", (LPCSTR)fname); } // Second call to LookupAccountSid to get the account name. bRtnBool = LookupAccountSid( NULL, // name of local or remote computer pSidOwner, // security identifier AcctName, // account name buffer (LPDWORD)&dwAcctName, // size of account name buffer DomainName, // domain name (LPDWORD)&dwDomainName, // size of domain name buffer &eUse); // SID type // Check GetLastError for LookupAccountSid error condition. if (bRtnBool == FALSE) { DWORD dwErrorCode = 0; dwErrorCode = GetLastError(); if (dwErrorCode == ERROR_NONE_MAPPED) { LPTSTR psz; ConvertSidToStringSid(pSidOwner, &psz); result = CString(DomainName) + "\\" + psz; LocalFree(psz); } else { return myAtlReportError(GetObjectCLSID(), "\nCAbout::fileOwner('%ls') LookupAccountSid", (LPCSTR)fname); } } else if (bRtnBool == TRUE) { // Print the account name. result = CString(DomainName) + "\\" + AcctName; } GlobalFree(DomainName); GlobalFree(AcctName); (*pVal) = result.AllocSysString(); return S_OK; }