windows-nt/Source/XPSP1/NT/base/ntsetup/books/bkutils.c
2020-09-26 16:20:57 +08:00

369 lines
5.8 KiB
C

/*++
Copyright (c) 1993 Microsoft Corporation
Module Name:
bkutils.c
Abstract:
Miscellaneous utility functions for online books program.
Author:
Ted Miller (tedm) 5-Jan-1995
Revision History:
--*/
#include "books.h"
UINT
MyGetDriveType(
IN WCHAR Drive
)
/*++
Routine Description:
Determine the type of a drive (removeable, fixed, net, cd, etc).
Arguments:
Drive - supplies drive letter of drive whose type is needed.
Return Value:
Same set of values as returned by GetDriveType() API.
--*/
{
WCHAR DriveName[3];
DriveName[0] = Drive;
DriveName[1] = L':';
DriveName[2] = 0;
return GetDriveType(DriveName);
}
WCHAR
LocateCdRomDrive(
VOID
)
/*++
Routine Description:
Determine if a CD-ROM drive is attached to the computer and
return its drive letter. If there's more than one cd-rom drive
the one with the alphabetically lower drive letter is returned.
Arguments:
None.
Return Value:
Drive letter of CD-ROM drive, or 0 if none could be located.
--*/
{
WCHAR Drive;
UINT OldMode;
OldMode = SetErrorMode(SEM_FAILCRITICALERRORS);
for(Drive=L'C'; Drive<=L'Z'; Drive++) {
if(MyGetDriveType(Drive) == DRIVE_CDROM) {
SetErrorMode(OldMode);
return Drive;
}
}
SetErrorMode(OldMode);
return 0;
}
BOOL
IsCdRomInDrive(
IN WCHAR Drive,
IN PWSTR TagFile
)
/*++
Routine Description:
Determine if a particular CD-ROM is in a drive,
based on the presence of a given tagfile.
Arguments:
Drive - supplies drive letter of drive to be checked
for presence of the tagfile.
TagFile - supplies drive-relative path (from root)
of the file whose presence validates the presence
of a volume.
Return Value:
Boolean value indicating whether the tagfile could be
accessed.
--*/
{
WCHAR Path[MAX_PATH];
if(*TagFile == L'\\') {
TagFile++;
}
wsprintf(Path,L"%c:\\%s",Drive,TagFile);
return DoesFileExist(Path);
}
BOOL
DoesFileExist(
IN PWSTR File
)
/*++
Routine Description:
Determine if a file exists and is accessible.
Arguments:
File - supplies full path of file whose accessibility
is in question.
Return Value:
Boolean value indicating whether file is accessible.
--*/
{
UINT OldMode;
HANDLE h;
WIN32_FIND_DATA FindData;
//
// Avoid system popups.
//
OldMode = SetErrorMode(SEM_FAILCRITICALERRORS);
h = FindFirstFile(File,&FindData);
SetErrorMode(OldMode);
if(h == INVALID_HANDLE_VALUE) {
return(FALSE);
}
FindClose(h);
return(TRUE);
}
PWSTR
DupString(
IN PWSTR String
)
/*++
Routine Description:
Duplicate a string and return a pointer to the copy.
This routine always succeeds.
Arguments:
String - supplies pointer to the string to be duplicated.
Return Value:
Pointer to copy of string. Caller can free this buffer with
MyFree when the copy is no longer needed.
--*/
{
PWSTR p = MyMalloc((lstrlen(String)+1)*sizeof(WCHAR));
lstrcpy(p,String);
return p;
}
VOID
CenterDialogOnScreen(
IN HWND hdlg
)
/*++
Routine Description:
Center a window on the screen.
Arguments:
hdlg - supplies handle of window to be centered on the screen.
Return Value:
None.
--*/
{
RECT rcWindow;
LONG x,y,w,h;
POINT point;
LONG sx = GetSystemMetrics(SM_CXSCREEN),
sy = GetSystemMetrics(SM_CYSCREEN);
GetWindowRect (hdlg,&rcWindow);
w = rcWindow.right - rcWindow.left + 1;
h = rcWindow.bottom - rcWindow.top + 1;
x = (sx - w) / 2;
y = (sy - h) / 2;
MoveWindow(hdlg,x,y,w,h,FALSE);
}
VOID
CenterDialogInWindow(
IN HWND hdlg,
IN HWND hwnd
)
/*++
Routine Description:
Center a dialog relative to a window.
Arguments:
hdlg - supplies handle of window to be centered relative to a window
hwnd - supplies handle of window relative to which hdlg is to be centered.
Return Value:
None.
--*/
{
RECT rcFrame,
rcWindow;
LONG x,y,w,h;
POINT point;
LONG sx = GetSystemMetrics(SM_CXSCREEN),
sy = GetSystemMetrics(SM_CYSCREEN);
point.x = point.y = 0;
ClientToScreen(hwnd,&point);
GetWindowRect (hdlg,&rcWindow);
GetClientRect (hwnd,&rcFrame );
w = rcWindow.right - rcWindow.left + 1;
h = rcWindow.bottom - rcWindow.top + 1;
x = point.x + ((rcFrame.right - rcFrame.left + 1 - w) / 2);
y = point.y + ((rcFrame.bottom - rcFrame.top + 1 - h) / 2);
if (x + w > sx) {
x = sx - w;
} else if (x < 0) {
x = 0;
}
if (y + h > sy) {
y = sy - h;
} else if (y < 0) {
y = 0;
}
MoveWindow(hdlg,x,y,w,h,FALSE);
}
VOID
MyError(
IN HWND Owner,
IN UINT StringId,
IN BOOL Fatal
)
/*++
Routine Description:
Display message box whose text is taken from the application's
string resources. The caption will be "Error"; the icon will be
ICONSTOP for fatal errors and ICONINFORMATION for nonfatal ones.
Arguments:
Owner - supplies the window handle of the window that is to own
the message box.
StringId - supplies the string Id of the message to be displayed.
Fatal - if TRUE, this is a fatal error and this routine does not
return to the caller but exits via ExitProcess().
Return Value:
Returns only if the error is non-fatal.
--*/
{
PWSTR p;
//
// Load error string
//
p = MyLoadString(StringId);
//
// Put up message box indicating the error.
//
MessageBox(
Owner,
p,
NULL,
MB_OK | MB_SETFOREGROUND | MB_TASKMODAL | (Fatal ? MB_ICONSTOP : MB_ICONINFORMATION)
);
if(Fatal) {
ExitProcess(1);
}
}