windows-nt/Source/XPSP1/NT/shell/osshell/control/mmsys/add.c
2020-09-26 16:20:57 +08:00

263 lines
6.9 KiB
C

/* ADD.C
**
** Copyright (C) Microsoft, 1990, All Rights Reserved.
**
** Multimedia Control Panel Applet for removing
** device drivers. See the ispec doc DRIVERS.DOC for more information.
**
** This file deals with the case where an OEM driver being installed.
**
** History:
**
** Thu Nov 1 1991 -by- Sanjaya
** Created. Originally part of drivers.c
*/
#include <windows.h>
#include <mmsystem.h>
#include <memory.h>
#include <string.h>
#include <cpl.h>
#include "drivers.h"
#include <cphelp.h>
#include "sulib.h"
extern PINF pinfOldDefault;
extern BOOL bBadOemSetup;
TCHAR *szFilter[] = {TEXT("Inf Files(*.inf)"), TEXT("*.inf"), TEXT("Drv Files(*.drv)"), TEXT("*.drv"), TEXT("")};
BOOL GetDir (HWND);
void BrowseDlg (HWND, int);
/* AddDriversDlg
*
* Returns 2 if dialog needs to be redrawn
* Returns 1 if the oem file has been succesfully located
* Returns 0 if Cancel has been pressed
*/
INT_PTR AddDriversDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
SetDlgItemText(hDlg, ID_TEXT, (LPTSTR)szUnlisted);
SetDlgItemText(hDlg, ID_EDIT, (LPTSTR)szDirOfSrc);
return(TRUE);
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
if (GetDir(hDlg))
{
DialogBox(myInstance, MAKEINTRESOURCE(DLG_UPDATE),
GetParent(hDlg), AddUnlistedDlg);
break;
} else {
EndDialog(hDlg, 2);
}
break;
case IDCANCEL:
EndDialog(hDlg, 0);
return(TRUE);
case IDS_BROWSE:
lstrcpy(szDrv, szOemInf);
BrowseDlg(hDlg, 1);
break;
case IDH_DLG_INSERT_DISK:
goto DoHelp;
}
break;
default:
if (message == wHelpMessage) {
DoHelp:
WinHelp(hDlg, szDriversHlp, HELP_CONTEXT, IDH_DLG_INSERT_DISK);
return TRUE;
} else
return FALSE;
}
return (FALSE); /* Didn't process a message */
}
BOOL GetDir(HWND hDlg)
{
LPTSTR pstr;
OFSTRUCT of;
wsStartWait();
/*
* Test the edit box for a proper path
* and look for the oemsetup.inf
* file. If we don't find it , highlight the
* text in the edit box and bring up a dialog box
*/
GetDlgItemText( hDlg, ID_EDIT, szDirOfSrc, MAX_PATH);
RemoveSpaces(szFullPath, szDirOfSrc);
lstrcpy(szDirOfSrc, szFullPath);
for (pstr = szFullPath;*pstr;pstr++);
if (*(pstr-1) != TEXT('\\'))
*pstr++ = TEXT('\\');
*pstr = TEXT('\0');
lstrcpy(szDiskPath, szFullPath);
/*
* Look for an oemsetup.inf
* If you can't find it return false
*
*/
lstrcpy(pstr, szOemInf);
if ((HFILE)HandleToUlong(CreateFile(szFullPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == -1)
{
SendDlgItemMessage(hDlg, ID_EDIT, EM_SETSEL, 0, -1L);
wsEndWait();
return (FALSE);
}
/*
* Change the default inf to this new oemsetup.inf
* Discard the value of the previous .inf, since it might
* just be another set of oem drivers.
*/
if (bBadOemSetup)
infSetDefault(infOpen(szFullPath));
else
pinfOldDefault = infSetDefault(infOpen(szFullPath));
EndDialog(hDlg, 1);
wsEndWait();
return(TRUE);
}
/*
* Hooks into common dialog to show only directories
*/
UINT_PTR CALLBACK AddFileHookProc(HWND hDlg, UINT iMessage,
WPARAM wParam, LPARAM lParam)
{
TCHAR szTemp[200];
HWND hTemp;
switch (iMessage)
{
case WM_INITDIALOG:
GetDlgItemText(((LPOPENFILENAME)lParam)->hwndOwner, ID_TEXT,
szTemp, sizeof(szTemp)/sizeof(TCHAR));
SetDlgItemText(hDlg, ctlLast+1, szTemp);
goto PostMyMessage;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case lst2:
case cmb2:
case IDOK:
PostMyMessage:
PostMessage(hDlg, WM_COMMAND, ctlLast+2, 0L);
break;
case IDH_DLG_BROWSE:
goto DoHelp;
case ctlLast+2:
if (bFindOEM)
{
if (SendMessage(hTemp=GetDlgItem(hDlg, lst1), LB_GETCOUNT,
0, 0L))
{
SendMessage(hTemp, LB_SETCURSEL, 0, 0L);
SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(lst1, LBN_SELCHANGE),
(LONG_PTR)hTemp);
break;
}
}
SetDlgItemText(hDlg, edt1, szDrv);
break;
}
break;
default:
if (iMessage == wHelpMessage)
{
DoHelp:
WinHelp(hDlg, szDriversHlp, HELP_CONTEXT, IDH_DLG_BROWSE);
return(TRUE);
}
}
return FALSE; // commdlg, do your thing
}
/*
* Function : BrowseDlg
*
* Call the GetOpenFileName dialog to open a file
*
* Parameters :
*
* hDlg : Parent Dialog box
*
* iIndex : Index into szFilter to determine which filter(s) to use
*/
void BrowseDlg(HWND hDlg, int iIndex)
{
OPENFILENAME OpenFileName;
TCHAR szPath[MAX_PATH];
TCHAR szFile[MAX_PATH];
*szPath = TEXT('\0');
*szFile = TEXT('\0');
OpenFileName.lStructSize = sizeof(OPENFILENAME);
OpenFileName.hwndOwner = hDlg;
OpenFileName.hInstance = myInstance;
OpenFileName.lpstrFilter = szFilter[0];
OpenFileName.lpstrCustomFilter = NULL;
OpenFileName.nMaxCustFilter = 0;
OpenFileName.nFilterIndex = iIndex;
OpenFileName.lpstrFile = (LPTSTR)szPath;
OpenFileName.nMaxFile = sizeof(szPath) / sizeof(TCHAR);
OpenFileName.lpstrFileTitle = szFile;
OpenFileName.nMaxFileTitle = sizeof(szFile) / sizeof(TCHAR);
OpenFileName.lpstrInitialDir = NULL;
OpenFileName.lpstrTitle = NULL;
OpenFileName.Flags = OFN_HIDEREADONLY | OFN_ENABLEHOOK |
/* OFN_FILEMUSTEXIST | */ OFN_ENABLETEMPLATE | OFN_NOCHANGEDIR |
OFN_SHOWHELP;
OpenFileName.lCustData = (LONG_PTR)hDlg;
OpenFileName.lpfnHook = AddFileHookProc;
OpenFileName.lpTemplateName = (LPTSTR)MAKEINTRESOURCE(DLG_BROWSE);
OpenFileName.nFileOffset = 0;
OpenFileName.nFileExtension = 0;
OpenFileName.lpstrDefExt = NULL;
if (GetOpenFileName(&OpenFileName))
{
UpdateWindow(hDlg); // force buttons to repaint
szPath[OpenFileName.nFileOffset] = TEXT('\0');
SetDlgItemText(hDlg, ID_EDIT, szPath);
}
}