Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

108 lines
2.3 KiB

#include "stdafx.h"
#include "setupapi.h"
#include "ole2.h"
typedef HRESULT (CALLBACK *HCRET)(void);
//
// This function registers an OLE control
//
DWORD RegisterOLEControl(LPCTSTR lpszOcxFile, BOOL fAction)
{
HINSTANCE hDll = NULL;
HCRET hProc = NULL;
DWORD dwErr = NO_ERROR;
CoInitialize(NULL);
if (GetFileAttributes(lpszOcxFile) != 0xFFFFFFFF)
{
hDll = LoadLibraryEx(lpszOcxFile, NULL, LOAD_WITH_ALTERED_SEARCH_PATH );
if (hDll)
{
if (fAction)
hProc = (HCRET)GetProcAddress(hDll, "DllRegisterServer");
else
hProc = (HCRET)GetProcAddress(hDll, "DllUnregisterServer");
if (hProc)
dwErr = (*hProc)();
else
dwErr = GetLastError();
FreeLibrary(hDll);
}
else
{
dwErr = GetLastError();
}
}
CoUninitialize();
return(dwErr);
}
//
// This function registers all OLE controls from a given INF section
//
DWORD RegisterOLEControlsFromInfSection(HINF hFile, LPCTSTR szSectionName, BOOL fRegister)
{
LPTSTR szLine;
DWORD dwLineLen = 0;
DWORD dwRequiredSize;
DWORD dwErr = NO_ERROR;
BOOL b = TRUE;
TCHAR szPath[MAX_PATH];
INFCONTEXT Context;
if (!SetupFindFirstLine(hFile, szSectionName, NULL, &Context))
return(GetLastError());
if (szLine = (LPTSTR)calloc(1024, sizeof(TCHAR)))
dwLineLen = 1024;
else
return(GetLastError());
while (b)
{
b = SetupGetLineText(&Context, NULL, NULL,
NULL, NULL, 0, &dwRequiredSize);
if (dwRequiredSize > dwLineLen)
{
free(szLine);
if (szLine = (LPTSTR)calloc(dwRequiredSize, sizeof(TCHAR)))
dwLineLen = dwRequiredSize;
else
return(GetLastError());
}
if (SetupGetLineText(&Context, NULL, NULL,
NULL, szLine, dwRequiredSize, NULL) == FALSE)
{
free(szLine);
return(GetLastError());
}
// Expand the line to a fully-qualified path
if (ExpandEnvironmentStrings(szLine, szPath, MAX_PATH) < MAX_PATH)
{
// Call function to register OLE control
RegisterOLEControl(szPath, fRegister);
}
else
{
dwErr = ERROR_MORE_DATA;
break;
}
b = SetupFindNextLine(&Context, &Context);
}
if (szLine)
free(szLine);
return(dwErr);
}