|
|
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
inf.c
Abstract:
This module contains function for processing the INF Processing sections of WINBOM.INI Author:
Stephen Lodwick (stelo) 8/01/2000
Revision History: --*/ #include "factoryp.h"
#include <setupapi.h>
#include <tchar.h>
//
// Internal Defined Value(s):
//
#define INF_SEC_UPDATESYSTEM _T("UpdateSystem")
//
// Internally defined functions
//
BOOL ProcessInfSection( LPTSTR, LPTSTR ); UINT CALLBACK InfQueueCallback ( PVOID, UINT, UINT, UINT );
/*++
=============================================================================== Routine Description:
BOOL ProcessInfSection Given a filename and a section this function will process/install all entries in an inf section
Arguments:
lpFilename - The name of the inf file to process lpInfSection - The name of the inf section to process
Return Value:
Boolean on whether or not it was able to process the file
=============================================================================== --*/ BOOL ProcessInfSection( LPTSTR lpFilename, LPTSTR lpInfSection ) { HINF hInf = NULL; PVOID pvContext = NULL; HSPFILEQ hfq = NULL; BOOL bReturn = FALSE;
FacLogFileStr(3, _T("ProcessInfSection('%s', '%s')"), lpFilename, lpInfSection);
if ((hInf = SetupOpenInfFile(lpFilename, NULL, INF_STYLE_OLDNT | INF_STYLE_WIN4, NULL)) != INVALID_HANDLE_VALUE) { FacLogFileStr(3, _T("ProcessInfSection: Opened '%s'"), lpFilename);
// We must have a valid context and file queue for all operations
//
// ISSUE-2002/02/25-acosma,robertko - The hfq file queue is not needed here. It does not get passed to
// SetupInstallFromInfSection() so there is no way for any files to be in this queue.
// Committing this probably does nothing. SetupInstallFromInfSection does an internal commit of a queue
// that it creates.
//
if ( (NULL != (pvContext = SetupInitDefaultQueueCallback(NULL)) ) && (INVALID_HANDLE_VALUE != (hfq = SetupOpenFileQueue()) ) ) { // Attempt to install the inf section.
//
if ( SetupInstallFromInfSection(NULL, hInf, lpInfSection, SPINST_ALL , NULL, NULL, SP_COPY_NEWER, SetupDefaultQueueCallback, pvContext, NULL, NULL) ) { // Installation succeeded
//
FacLogFileStr(3, _T("ProcessInfSection: SetupInstallFromInfSection Success"));
// Commit the queue
//
SetupCommitFileQueue(NULL, hfq, SetupDefaultQueueCallback, pvContext);
bReturn = TRUE; } else { // Installation failed
//
FacLogFileStr(3 | LOG_ERR, _T("ProcessInfSection: Failed SetupInstallFromInfSection (Error: %d)"), GetLastError()); }
// We have a valid queue, lets close it now
//
SetupCloseFileQueue(hfq); }
// Clean up the memory allocated by the context
//
if ( NULL != pvContext ) { SetupTermDefaultQueueCallback(pvContext); }
// Close the Inf file
//
SetupCloseInfFile(hInf); } else { FacLogFileStr(3 | LOG_ERR, _T("ProcessInfSection: Failed to open '%s'\n"), lpFilename); bReturn = FALSE; }
return bReturn; }
BOOL InfInstall(LPSTATEDATA lpStateData) { if ( !DisplayInfInstall(lpStateData) ) { return TRUE; } return ProcessInfSection(lpStateData->lpszWinBOMPath, INF_SEC_UPDATESYSTEM); }
BOOL DisplayInfInstall(LPSTATEDATA lpStateData) { return IniSettingExists(lpStateData->lpszWinBOMPath, INF_SEC_UPDATESYSTEM, NULL, NULL); }
/*++
=============================================================================== Routine Description:
UINT CALLBACK InfQueueCallback This function is required to do file updates when processing an inf file
Arguments:
Context - Context that's currently being used for file queue Notification - Message Param1 - Parameter 1 Param2 - Parameter 2
Return Value:
n/a
=============================================================================== --*/ UINT CALLBACK InfQueueCallback ( PVOID Context, UINT Notification, UINT Param1, UINT Param2 ) { if (SPFILENOTIFY_DELETEERROR == Notification) { // Skip any file delete errors
//
return FILEOP_SKIP; } else { // Pass all other notifications through without modification
//
return SetupDefaultQueueCallback(Context, Notification, Param1, Param2); } }
|