239 lines
6.3 KiB
C
239 lines
6.3 KiB
C
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
All rights reserved.
|
|
|
|
Module Name:
|
|
|
|
FileQ.c
|
|
|
|
Abstract:
|
|
|
|
File queue routines for upgrade
|
|
|
|
Author:
|
|
|
|
Muhunthan Sivapragasam (MuhuntS) 22-Jan-1996
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#include "precomp.h"
|
|
|
|
|
|
//
|
|
// If the source disk is missing we will retry it 4 times waiting for
|
|
// 3 seconds between every try
|
|
//
|
|
#define MISSING_MEDIA_RETRY_COUNT 4
|
|
#define MISSING_MEDIA_RETRY_INTERVAL 3000
|
|
|
|
|
|
typedef struct _FILE_QUEUE_CONTEXT {
|
|
|
|
PVOID QueueContext;
|
|
} FILE_QUEUE_CONTEXT, *PFILE_QUEUE_CONTEXT;
|
|
|
|
|
|
UINT
|
|
MyQueueCallback(
|
|
IN PVOID QueueContext,
|
|
IN UINT Notification,
|
|
IN UINT_PTR Param1,
|
|
IN UINT_PTR Param2
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
File queue callback routine for the upgrade. We will not prompt the user
|
|
for missing file. But we will retry few times before failing
|
|
|
|
Arguments:
|
|
QueueContext : Points to FILE_QUEUE_CONTEXT
|
|
Notification : The event which is being notified
|
|
Param1 : Depends on the notification
|
|
Param2 : Depends on the notification
|
|
|
|
Return Value:
|
|
None
|
|
|
|
--*/
|
|
{
|
|
PFILE_QUEUE_CONTEXT pFileQContext=(PFILE_QUEUE_CONTEXT)QueueContext;
|
|
PSOURCE_MEDIA_W pSource;
|
|
PFILEPATHS_W pFilePaths;
|
|
|
|
switch (Notification) {
|
|
|
|
case SPFILENOTIFY_COPYERROR:
|
|
//
|
|
// We know atleast pjlmon will be missing since it is copied
|
|
// during textmode setup
|
|
//
|
|
pFilePaths = (PFILEPATHS_W) Param1;
|
|
|
|
DebugMsg("Error %d copying %ws to %ws.",
|
|
pFilePaths->Win32Error, pFilePaths->Source,
|
|
pFilePaths->Target);
|
|
|
|
return FILEOP_SKIP;
|
|
|
|
case SPFILENOTIFY_NEEDMEDIA:
|
|
pSource = (PSOURCE_MEDIA_W)Param1;
|
|
|
|
//
|
|
// Setup is going to add \i386 to the end. Tell it to look
|
|
// right in the directory we give. Particularly needed for the
|
|
// upgrade over the network case
|
|
//
|
|
if ( wcscmp(pSource->SourcePath, UpgradeData.pszSourceW) ) {
|
|
|
|
wcscpy((LPWSTR)Param2, UpgradeData.pszSourceW);
|
|
return FILEOP_NEWPATH;
|
|
}
|
|
|
|
DebugMsg("Error copying %ws from %ws.",
|
|
pSource->SourceFile, pSource->SourcePath);
|
|
|
|
return FILEOP_SKIP;
|
|
}
|
|
|
|
return SetupDefaultQueueCallbackW(pFileQContext->QueueContext,
|
|
Notification,
|
|
Param1,
|
|
Param2);
|
|
}
|
|
|
|
|
|
BOOL
|
|
InitFileCopyOnNT(
|
|
IN HDEVINFO hDevInfo
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
On NT we will call ntprint.dll via SetupDiCallClassInstaller api with the
|
|
DI_NOVCP flag so that all the necessary printer driver files are queued
|
|
and copied at the end.
|
|
|
|
This sets the necessary queue etc before calling the class installer
|
|
|
|
Arguments:
|
|
hDevInfo : Handle to printer device info list.
|
|
|
|
Return Value:
|
|
TRUE on success. FALSE on error
|
|
|
|
--*/
|
|
{
|
|
BOOL bRet = FALSE;
|
|
HSPFILEQ CopyQueue;
|
|
PFILE_QUEUE_CONTEXT pFileQContext;
|
|
SP_DEVINSTALL_PARAMS_W DevInstallParams;
|
|
|
|
//
|
|
// Call the current device installation parameters
|
|
//
|
|
DevInstallParams.cbSize = sizeof(DevInstallParams);
|
|
|
|
if ( !SetupDiGetDeviceInstallParamsW(hDevInfo,
|
|
NULL,
|
|
&DevInstallParams) )
|
|
return FALSE;
|
|
|
|
//
|
|
// Set the parameters so that ntprint will just queue files and not commit
|
|
// the file copy operations
|
|
//
|
|
if ( !(pFileQContext = AllocMem(sizeof(FILE_QUEUE_CONTEXT))) )
|
|
goto Cleanup;
|
|
|
|
pFileQContext->QueueContext = SetupInitDefaultQueueCallbackEx(
|
|
INVALID_HANDLE_VALUE,
|
|
INVALID_HANDLE_VALUE,
|
|
0,
|
|
0,
|
|
NULL);
|
|
|
|
DevInstallParams.FileQueue = SetupOpenFileQueue();
|
|
DevInstallParams.InstallMsgHandlerContext = pFileQContext;
|
|
DevInstallParams.InstallMsgHandler = MyQueueCallback;
|
|
DevInstallParams.Flags |= DI_NOVCP;
|
|
DevInstallParams.hwndParent = INVALID_HANDLE_VALUE;
|
|
|
|
//
|
|
// The files should be from the source dir
|
|
//
|
|
wcscpy(DevInstallParams.DriverPath, UpgradeData.pszSourceW);
|
|
|
|
if ( DevInstallParams.FileQueue == INVALID_HANDLE_VALUE ||
|
|
pFileQContext->QueueContext == NULL ||
|
|
!SetupDiSetDeviceInstallParamsW(hDevInfo,
|
|
NULL,
|
|
&DevInstallParams) ) {
|
|
|
|
if ( DevInstallParams.FileQueue != INVALID_HANDLE_VALUE )
|
|
SetupCloseFileQueue(DevInstallParams.FileQueue);
|
|
|
|
if ( pFileQContext->QueueContext )
|
|
SetupTermDefaultQueueCallback(pFileQContext->QueueContext);
|
|
} else {
|
|
|
|
bRet = TRUE;
|
|
}
|
|
|
|
Cleanup:
|
|
|
|
if ( !bRet )
|
|
FreeMem(pFileQContext);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
|
|
BOOL
|
|
CommitFileQueueToCopyFiles(
|
|
IN HDEVINFO hDevInfo
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
After calling ntprint for each printer driver to queue up the files this
|
|
routine is called to commit the file queue and do the actual file copy
|
|
operations
|
|
|
|
Arguments:
|
|
hDevInfo : Handle to printer device info list.
|
|
|
|
Return Value:
|
|
TRUE on success. FALSE on error
|
|
|
|
--*/
|
|
{
|
|
BOOL bRet = FALSE;
|
|
SP_DEVINSTALL_PARAMS_W DevInstallParams;
|
|
PFILE_QUEUE_CONTEXT pFileQContext;
|
|
|
|
DevInstallParams.cbSize = sizeof(DevInstallParams);
|
|
|
|
if ( !SetupDiGetDeviceInstallParamsW(hDevInfo,
|
|
NULL,
|
|
&DevInstallParams) )
|
|
return FALSE;
|
|
|
|
pFileQContext = DevInstallParams.InstallMsgHandlerContext;
|
|
|
|
bRet = SetupCommitFileQueueW(DevInstallParams.hwndParent,
|
|
DevInstallParams.FileQueue,
|
|
DevInstallParams.InstallMsgHandler,
|
|
pFileQContext);
|
|
|
|
SetupCloseFileQueue(DevInstallParams.FileQueue);
|
|
SetupTermDefaultQueueCallback(pFileQContext->QueueContext);
|
|
FreeMem(pFileQContext);
|
|
|
|
return bRet;
|
|
}
|