windows-nt/Source/XPSP1/NT/base/ntsetup/mpk/enduser/misc.c

173 lines
3.4 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
#include "enduser.h"
VOID
UpdateMasterDiskState(
IN HDISK DiskHandle,
IN UINT NewState
)
{
MasterDiskInfo.State = NewState;
memset(IoBuffer,0,512);
memcpy(IoBuffer,&MasterDiskInfo,sizeof(MASTER_DISK));
if(!WriteDisk(DiskHandle,1,1,IoBuffer)) {
FatalError(textWriteFailedAtSector,1,1L);
}
}
UINT
LocateMasterDisk(
IN UINT UserSpecifiedInt13Unit OPTIONAL
)
{
UINT DiskCount;
UINT i;
BYTE Int13Unit;
BYTE spt;
USHORT h,cyl;
ULONG ext;
BYTE UnitToMatch;
UnitToMatch = (BYTE)(UserSpecifiedInt13Unit ? UserSpecifiedInt13Unit : 0x80);
DiskCount = InitializeDiskList();
for(i=0; i<DiskCount; i++) {
if(IsMasterDisk(i,IoBuffer)) {
//
// Want unit 80h
//
if(GetDiskInfoById(i,0,&Int13Unit,&spt,&h,&cyl,&ext)
&& (Int13Unit == UnitToMatch)) {
return(i);
}
}
}
FatalError(textCantFindMasterDisk);
}
VOID
FatalError(
IN FPCHAR FormatString,
...
)
{
char strng[250];
va_list arglist;
unsigned p;
DispClearClientArea(NULL);
DispPositionCursor(TEXT_LEFT_MARGIN,TEXT_TOP_LINE);
DispSetCurrentPixelValue(VGAPIX_LIGHT_YELLOW);
DispWriteString(textFatalError1);
DispWriteString("\n\n");
DispWriteString(textFatalError2);
DispSetCurrentPixelValue(VGAPIX_LIGHT_RED);
va_start(arglist,FormatString);
vsprintf(strng,FormatString,arglist);
va_end(arglist);
DispWriteString("\n\n");
DispWriteString(strng);
//
// Hanging this way prevents control-c because DOS isn't involved.
//
// We allow a special way to get out of this screen and exit
// the program, for testing.
//
strcpy(strng,"I am TEDM");
p = (unsigned)strng;
_asm {
y:
mov si,p
x:
push si
xor ax,ax ; get keystroke
int 16h
pop si
push ss
pop ds
cmp byte ptr [si],0 ; reached and of match string?
jnz not0 ; no, try to match chars
cmp al,ASCI_CR ; see if user hit ENTER
je bustout ; user entered magic code, exit to DOS
jne y ; start all over
not0:
cmp [si],al ; still on target for magic sequence?
jne y ; no, start over
inc si ; yes, set up for next iteration
jmp short x
bustout:
mov ax,3
int 10h
}
exit(0);
}
USHORT
GetKey(
VOID
)
{
USHORT c;
_asm {
mov ah,0
int 16h
mov c,ax
}
switch(c) {
case 0x5000:
return(DN_KEY_DOWN);
case 0x4800:
return(DN_KEY_UP);
case 0x4200:
return(DN_KEY_F8);
default:
return(c & 0x00ff);
}
}
VOID
DrainKeyboard(
VOID
)
{
_asm {
drain:
mov ah,1 ; get keyboard status
int 16h ; zero flag set = no key waiting
jz drained ; no key waiting, we're done
mov ah,0 ; get keypress, we know one is there
int 16h
jmp short drain ; see if there are more keys waiting
drained:
}
}