//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997. // // File: N C B A S E . C P P // // Contents: Basic common code. // // Notes: Pollute this under penalty of death. // // Author: shaunco 20 Sep 1997 // //---------------------------------------------------------------------------- #include #pragma hdrstop #include "ncbase.h" #include "ncdebug.h" //+--------------------------------------------------------------------------- // // Function: AddRefObj // // Purpose: AddRef's the object pointed to by punk by calling // punk->AddRef(); // // Arguments: // punk [in] Object to be AddRef'd. Can be NULL. // // Returns: Result of AddRef call. // // Author: danielwe 25 Feb 1997 // // Notes: Using this function to AddRef an object will reduce // our code size. // NOTHROW ULONG AddRefObj ( IUnknown* punk) { return (punk) ? punk->AddRef () : 0; } //+--------------------------------------------------------------------------- // // Function: ReleaseObj // // Purpose: Releases the object pointed to by punk by calling // punk->Release(); // // Arguments: // punk [in] Object to be released. Can be NULL. // // Returns: Result of Release call. // // Author: danielwe 25 Feb 1997 // // Notes: Using this function to release a (possibly NULL) object will // reduce our code size. // NOTHROW ULONG ReleaseObj ( IUnknown* punk) { return (punk) ? punk->Release () : 0; } //+-------------------------------------------------------------------------- // // Function: DwWin32ErrorFromHr // // Purpose: Converts the HRESULT to a Win32 error or SetupApi error. // // Arguments: // hr [in] The HRESULT to convert // // Returns: Converted DWORD value. // // Author: billbe 22 Apr 1997 // // Notes: // NOTHROW DWORD DwWin32ErrorFromHr ( HRESULT hr) { DWORD dw = ERROR_SUCCESS; // All success codes convert to ERROR_SUCCESS so we only need to handle // failures. if (FAILED(hr)) { DWORD dwFacility = HRESULT_FACILITY(hr); if (FACILITY_WIN32 == dwFacility) { dw = HRESULT_CODE(hr); } else if (FACILITY_ITF == dwFacility) { dw = ERROR_GEN_FAILURE; } else { // cannot convert it dw = hr; } } return dw; } //+--------------------------------------------------------------------------- // // Function: HrFromLastWin32Error // // Purpose: Converts the GetLastError() Win32 call into a proper HRESULT. // // Arguments: // (none) // // Returns: Converted HRESULT value. // // Author: danielwe 24 Mar 1997 // // Notes: This is not inline as it actually generates quite a bit of // code. // If GetLastError returns an error that looks like a SetupApi // error, this function will convert the error to an HRESULT // with FACILITY_SETUP instead of FACILITY_WIN32 // NOTHROW HRESULT HrFromLastWin32Error () { DWORD dwError = GetLastError(); HRESULT hr; // This test is testing SetupApi errors only (this is // temporary because the new HRESULT_FROM_SETUPAPI macro will // do the entire conversion) if (dwError & (APPLICATION_ERROR_MASK | ERROR_SEVERITY_ERROR)) { hr = HRESULT_FROM_SETUPAPI(dwError); } else { hr = HRESULT_FROM_WIN32(dwError); } return hr; } //+--------------------------------------------------------------------------- // // Function: HrGetProcAddress // // Purpose: Loads a libray and returns the address of a procedure within // the library // // Arguments: // hModule [in] The handle to the library module instance // pszaFunction [in] Function to retrieve // ppfn [out] Address of szFunction // // Returns: S_OK if successful, Win32 converted error if failure. // // Author: billbe 10 June 1997 // // Notes: // HRESULT HrGetProcAddress ( HMODULE hModule, PCSTR pszaFunction, FARPROC* ppfn) { Assert(hModule); Assert(pszaFunction); Assert(ppfn); HRESULT hr = S_OK; *ppfn = GetProcAddress(hModule, pszaFunction); if (!*ppfn) { hr = HrFromLastWin32Error(); TraceTag(ttidError, "HrGetProcAddress failed: szFunction: %s", pszaFunction); } TraceError("HrGetProcAddress", hr); return hr; } //+--------------------------------------------------------------------------- // // Function: HrLoadLibAndGetProcs // // Purpose: Load a dynamic link library and the addresses of one or // more procedures within that library. // // Arguments: // pszLibPath [in] Path to the DLL to load. // cFunctions [in] Number of procedures to load. // apszaFunctionNames [in] Array of function names. (Must be 'cFunctions' // of them.) // phmod [out] Returned handle to the loaded module. // apfn [out] Array of returned pointers to the procedures // loaded. (Must be 'cFunctions' of them.) // // Returns: S_OK if all procedures were loaded, S_FALSE if only // some of them were, or a Win32 error code. If only // one procedure is to be loaded and it is not, S_FALSE will // not be returned, rather, the reason for why the single // procedure could not be loaded will be returned. This allows // HrLoadLibAndGetProc to be implemented using this function. // // Author: shaunco 19 Jan 1998 // // Notes: phmod should be freed by the caller using FreeLibrary if // the return value is S_OK. // HRESULT HrLoadLibAndGetProcs ( PCTSTR pszLibPath, UINT cFunctions, const PCSTR* apszaFunctionNames, HMODULE* phmod, FARPROC* apfn) { Assert (pszLibPath); Assert (cFunctions); Assert (apszaFunctionNames); Assert (phmod); Assert (apfn); HRESULT hr = S_OK; // Load the module and initialize the output parameters. // HMODULE hmod = LoadLibrary(pszLibPath); *phmod = hmod; ZeroMemory (apfn, cFunctions * sizeof(FARPROC)); if (hmod) { // Get the proc address of each function. // for (UINT i = 0; i < cFunctions; i++) { apfn[i] = GetProcAddress (hmod, apszaFunctionNames[i]); if (!apfn[i]) { // Couldn't load all functions. We'll be returning S_FALSE // (if their are more than one function.) // hr = S_FALSE; TraceTag (ttidError, "HrLoadLibAndGetProcs: GetProcAddress " "for '%s' failed.", apszaFunctionNames[i]); } } // If we're only loading one function, and it failed, // return the failure. // if ((1 == cFunctions) && !apfn[0]) { hr = HrFromLastWin32Error (); FreeLibrary (hmod); } } else { hr = HrFromLastWin32Error (); TraceTag (ttidError, "HrLoadLibAndGetProcs: LoadLibraryW (%S) failed.", pszLibPath); } TraceError ("HrLoadLibAndGetProcs", hr); return hr; } //+--------------------------------------------------------------------------- // // Function: FFileExists // // Purpose: Check for file existance. Returns TRUE if file is present, // FALSE otherwise (duh). // // Arguments: // pszFileName [in] File name to check for. // fDirectory [in] TRUE if the file is really a directory // // Returns: // // Author: jeffspr 13 Jan 2000 // // Notes: // BOOL FFileExists(LPTSTR pszFileName, BOOL fDirectory) { BOOL fReturn = TRUE; HANDLE hFile = NULL; DWORD dwFlags; if (fDirectory) { dwFlags = FILE_ATTRIBUTE_DIRECTORY | FILE_FLAG_BACKUP_SEMANTICS; } else { dwFlags = FILE_ATTRIBUTE_NORMAL; } hFile = CreateFile( pszFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, dwFlags, NULL); if (hFile == INVALID_HANDLE_VALUE) { fReturn = FALSE; goto Exit; } Exit: if (hFile && hFile != INVALID_HANDLE_VALUE) { CloseHandle(hFile); hFile = NULL; } return fReturn; }