2014-01-26 18:25:59 +00:00
|
|
|
/*
|
|
|
|
* COPYRIGHT: GPL - See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS Virtual DOS Machine
|
|
|
|
* FILE: dem.c
|
|
|
|
* PURPOSE: DOS 32-bit Emulation Support Library -
|
|
|
|
* This library is used by the built-in NTVDM DOS32 and by
|
|
|
|
* the NT 16-bit DOS in Windows (via BOPs). It also exposes
|
|
|
|
* exported functions that can be used by VDDs.
|
|
|
|
* PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
|
|
|
|
* Hermes Belusca-Maito (hermes.belusca@sfr.fr)
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* INCLUDES *******************************************************************/
|
|
|
|
|
|
|
|
#define NDEBUG
|
|
|
|
|
|
|
|
#include "dem.h"
|
|
|
|
|
|
|
|
/* Extra PSDK/NDK Headers */
|
|
|
|
#include <ndk/obtypes.h>
|
|
|
|
|
2014-01-26 21:51:27 +00:00
|
|
|
/**/extern BYTE CurrentDrive;/**/
|
2014-01-26 18:25:59 +00:00
|
|
|
|
2014-01-26 21:51:27 +00:00
|
|
|
/* PUBLIC FUNCTIONS ***********************************************************/
|
2014-01-26 18:25:59 +00:00
|
|
|
|
2014-01-26 21:51:27 +00:00
|
|
|
BOOLEAN DosInitialize(IN LPCSTR DosKernelFileNames)
|
2014-01-26 18:25:59 +00:00
|
|
|
{
|
2014-01-26 21:51:27 +00:00
|
|
|
if (DosKernelFileNames)
|
|
|
|
{
|
|
|
|
DisplayMessage(L"NTVDM: Loading DOS kernel from external files is currently unsupported");
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
BOOLEAN Result;
|
2014-01-26 18:25:59 +00:00
|
|
|
|
2014-01-26 21:51:27 +00:00
|
|
|
Result = DosBIOSInitialize();
|
|
|
|
Result &= DosKRNLInitialize();
|
2014-01-26 18:25:59 +00:00
|
|
|
|
2014-01-26 21:51:27 +00:00
|
|
|
return Result;
|
|
|
|
}
|
|
|
|
}
|
2014-01-26 18:25:59 +00:00
|
|
|
|
|
|
|
/* PUBLIC EXPORTED APIS *******************************************************/
|
|
|
|
|
|
|
|
// demLFNCleanup
|
|
|
|
// demLFNGetCurrentDirectory
|
|
|
|
|
|
|
|
// demGetFileTimeByHandle_WOW
|
|
|
|
// demWOWLFNAllocateSearchHandle
|
|
|
|
// demWOWLFNCloseSearchHandle
|
|
|
|
// demWOWLFNEntry
|
|
|
|
// demWOWLFNGetSearchHandle
|
|
|
|
// demWOWLFNInit
|
|
|
|
|
|
|
|
DWORD
|
|
|
|
WINAPI
|
|
|
|
demClientErrorEx(IN HANDLE FileHandle,
|
|
|
|
IN CHAR Unknown,
|
|
|
|
IN BOOL Flag)
|
|
|
|
{
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
return GetLastError();
|
|
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
|
|
WINAPI
|
|
|
|
demFileDelete(IN LPCSTR FileName)
|
|
|
|
{
|
|
|
|
if (DeleteFileA(FileName)) SetLastError(ERROR_SUCCESS);
|
|
|
|
|
|
|
|
return GetLastError();
|
|
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
|
|
WINAPI
|
|
|
|
demFileFindFirst(OUT PVOID lpFindFileData,
|
|
|
|
IN LPCSTR FileName,
|
|
|
|
IN WORD AttribMask)
|
|
|
|
{
|
|
|
|
BOOLEAN Success = TRUE;
|
|
|
|
WIN32_FIND_DATAA FindData;
|
2014-01-26 21:51:27 +00:00
|
|
|
PDOS_FIND_FILE_BLOCK FindFileBlock = (PDOS_FIND_FILE_BLOCK)lpFindFileData;
|
2014-01-26 18:25:59 +00:00
|
|
|
|
|
|
|
/* Fill the block */
|
|
|
|
FindFileBlock->DriveLetter = CurrentDrive + 'A';
|
|
|
|
FindFileBlock->AttribMask = AttribMask;
|
|
|
|
FindFileBlock->SearchHandle = FindFirstFileA(FileName, &FindData);
|
|
|
|
if (FindFileBlock->SearchHandle == INVALID_HANDLE_VALUE) return GetLastError();
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
/* Check the attributes */
|
|
|
|
if (!((FindData.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN |
|
|
|
|
FILE_ATTRIBUTE_SYSTEM |
|
|
|
|
FILE_ATTRIBUTE_DIRECTORY))
|
|
|
|
& ~AttribMask))
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
while ((Success = FindNextFileA(FindFileBlock->SearchHandle, &FindData)));
|
|
|
|
|
|
|
|
if (!Success) return GetLastError();
|
|
|
|
|
|
|
|
FindFileBlock->Attributes = LOBYTE(FindData.dwFileAttributes);
|
|
|
|
FileTimeToDosDateTime(&FindData.ftLastWriteTime,
|
|
|
|
&FindFileBlock->FileDate,
|
|
|
|
&FindFileBlock->FileTime);
|
|
|
|
FindFileBlock->FileSize = FindData.nFileSizeHigh ? 0xFFFFFFFF
|
|
|
|
: FindData.nFileSizeLow;
|
|
|
|
strcpy(FindFileBlock->FileName, FindData.cAlternateFileName);
|
|
|
|
|
|
|
|
return ERROR_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
|
|
WINAPI
|
|
|
|
demFileFindNext(OUT PVOID lpFindFileData)
|
|
|
|
{
|
|
|
|
WIN32_FIND_DATAA FindData;
|
2014-01-26 21:51:27 +00:00
|
|
|
PDOS_FIND_FILE_BLOCK FindFileBlock = (PDOS_FIND_FILE_BLOCK)lpFindFileData;
|
2014-01-26 18:25:59 +00:00
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
if (!FindNextFileA(FindFileBlock->SearchHandle, &FindData))
|
|
|
|
return GetLastError();
|
|
|
|
|
|
|
|
/* Update the block */
|
|
|
|
FindFileBlock->Attributes = LOBYTE(FindData.dwFileAttributes);
|
|
|
|
FileTimeToDosDateTime(&FindData.ftLastWriteTime,
|
|
|
|
&FindFileBlock->FileDate,
|
|
|
|
&FindFileBlock->FileTime);
|
|
|
|
FindFileBlock->FileSize = FindData.nFileSizeHigh ? 0xFFFFFFFF
|
|
|
|
: FindData.nFileSizeLow;
|
|
|
|
strcpy(FindFileBlock->FileName, FindData.cAlternateFileName);
|
|
|
|
}
|
|
|
|
while((FindData.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN |
|
|
|
|
FILE_ATTRIBUTE_SYSTEM |
|
|
|
|
FILE_ATTRIBUTE_DIRECTORY))
|
|
|
|
& ~FindFileBlock->AttribMask);
|
|
|
|
|
|
|
|
return ERROR_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
UCHAR
|
|
|
|
WINAPI
|
|
|
|
demGetPhysicalDriveType(IN UCHAR DriveNumber)
|
|
|
|
{
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
return DOSDEVICE_DRIVE_UNKNOWN;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
WINAPI
|
|
|
|
demIsShortPathName(IN LPCSTR Path,
|
|
|
|
IN BOOL Unknown)
|
|
|
|
{
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
|
|
WINAPI
|
|
|
|
demSetCurrentDirectoryGetDrive(IN LPCSTR CurrentDirectory,
|
|
|
|
OUT PUCHAR DriveNumber)
|
|
|
|
{
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
return ERROR_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* EOF */
|