mirror of
https://github.com/reactos/reactos.git
synced 2025-01-03 21:09:19 +00:00
[NTVDM]
- Implement INT 21h AH = 29h (Parse Filename into FCB). - Loading an overlay does not create a new process. svn path=/trunk/; revision=67385
This commit is contained in:
parent
0a98cc57f4
commit
360a70846b
1 changed files with 88 additions and 1 deletions
|
@ -1768,6 +1768,78 @@ VOID WINAPI DosInt21h(LPWORD Stack)
|
|||
break;
|
||||
}
|
||||
|
||||
/* Parse Filename into FCB */
|
||||
case 0x29:
|
||||
{
|
||||
PCHAR FileName = (PCHAR)SEG_OFF_TO_PTR(getDS(), getSI());
|
||||
PDOS_FCB Fcb = (PDOS_FCB)SEG_OFF_TO_PTR(getES(), getDI());
|
||||
BYTE Options = getAL();
|
||||
INT i;
|
||||
CHAR FillChar = ' ';
|
||||
|
||||
if (FileName[1] == ':')
|
||||
{
|
||||
/* Set the drive number */
|
||||
Fcb->DriveNumber = RtlUpperChar(FileName[0]) - 'A' + 1;
|
||||
|
||||
/* Skip to the file name part */
|
||||
FileName += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* No drive number specified */
|
||||
if (Options & (1 << 1)) Fcb->DriveNumber = CurrentDrive + 1;
|
||||
else Fcb->DriveNumber = 0;
|
||||
}
|
||||
|
||||
/* Parse the file name */
|
||||
i = 0;
|
||||
while (*FileName && (i < 8))
|
||||
{
|
||||
if (*FileName == '.') break;
|
||||
else if (*FileName == '*')
|
||||
{
|
||||
FillChar = '?';
|
||||
break;
|
||||
}
|
||||
|
||||
Fcb->FileName[i++] = *FileName++;
|
||||
}
|
||||
|
||||
/* Fill the whole field with blanks only if bit 2 is not set */
|
||||
if ((FillChar != ' ') || (i != 0) || !(Options & (1 << 2)))
|
||||
{
|
||||
for (; i < 8; i++) Fcb->FileName[i] = FillChar;
|
||||
}
|
||||
|
||||
/* Skip to the extension part */
|
||||
while (*FileName && *FileName != '.') FileName++;
|
||||
if (*FileName == '.') FileName++;
|
||||
|
||||
/* Now parse the extension */
|
||||
i = 0;
|
||||
FillChar = ' ';
|
||||
|
||||
while (*FileName && (i < 3))
|
||||
{
|
||||
if (*FileName == '*')
|
||||
{
|
||||
FillChar = '?';
|
||||
break;
|
||||
}
|
||||
|
||||
Fcb->FileExt[i++] = *FileName++;
|
||||
}
|
||||
|
||||
/* Fill the whole field with blanks only if bit 3 is not set */
|
||||
if ((FillChar != ' ') || (i != 0) || !(Options & (1 << 3)))
|
||||
{
|
||||
for (; i < 3; i++) Fcb->FileExt[i] = FillChar;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/* Get System Date */
|
||||
case 0x2A:
|
||||
{
|
||||
|
@ -2498,7 +2570,22 @@ VOID WINAPI DosInt21h(LPWORD Stack)
|
|||
LPSTR ProgramName = SEG_OFF_TO_PTR(getDS(), getDX());
|
||||
PDOS_EXEC_PARAM_BLOCK ParamBlock = SEG_OFF_TO_PTR(getES(), getBX());
|
||||
DWORD ReturnAddress = MAKELONG(Stack[STACK_IP], Stack[STACK_CS]);
|
||||
WORD ErrorCode = DosCreateProcess(LoadType, ProgramName, ParamBlock, ReturnAddress);
|
||||
WORD ErrorCode;
|
||||
|
||||
if (LoadType != DOS_LOAD_OVERLAY)
|
||||
{
|
||||
ErrorCode = DosCreateProcess(LoadType, ProgramName, ParamBlock, ReturnAddress);
|
||||
}
|
||||
else
|
||||
{
|
||||
ErrorCode = DosLoadExecutable(DOS_LOAD_OVERLAY,
|
||||
ProgramName,
|
||||
FAR_POINTER(ParamBlock->CommandLine),
|
||||
SEG_OFF_TO_PTR(ParamBlock->Environment, 0),
|
||||
ReturnAddress,
|
||||
NULL,
|
||||
NULL);
|
||||
}
|
||||
|
||||
if (ErrorCode == ERROR_SUCCESS)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue