376 lines
9.8 KiB
C
376 lines
9.8 KiB
C
|
/*
|
||
|
* pmdos.c
|
||
|
*
|
||
|
* Copyright (c) 1991, Microsoft Corporation
|
||
|
*
|
||
|
* DESCRIPTION
|
||
|
*
|
||
|
* This file is for support of program manager under NT Windows.
|
||
|
* This file is/was ported from pmdos.asm (program manager).
|
||
|
* It was in x86 asm code, and now is in ansi C.
|
||
|
* Some functions will be removed, due to they are only needed
|
||
|
* by DOS Windows.
|
||
|
*
|
||
|
* MODIFICATION HISTORY
|
||
|
* Initial Version: x/x/90 Author Unknown, since he didn't feel
|
||
|
* like commenting the code...
|
||
|
*
|
||
|
* NT 32b Version: 1/9/91 Jeff Pack
|
||
|
* Intitial port to begin.
|
||
|
*
|
||
|
* WARNING: since this is NOT for DOS, I'm making it soley 32bit aware.
|
||
|
* Following functions not ported
|
||
|
* IsRemovable() is in pmcomman.c (already ifdef'd in asm code)
|
||
|
* IsRemote() is in pmcomman.c (ditto!)
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
|
||
|
#include <io.h>
|
||
|
#include <string.h>
|
||
|
#include <ctype.h>
|
||
|
#include <windows.h>
|
||
|
#include <port1632.h>
|
||
|
|
||
|
#if DBG
|
||
|
|
||
|
#define KdPrint(_x_) OutputDebugStringA _x_;
|
||
|
|
||
|
#else
|
||
|
|
||
|
#define KdPrint(_x_)
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#define LOCALBUFFERSIZE 128
|
||
|
|
||
|
|
||
|
/*** FileTime -- Gets time of last modification.
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
* DWORD FileTime(HFILE hFile)
|
||
|
*
|
||
|
* ENTRY - int hFile - file handle to access
|
||
|
*
|
||
|
* EXIT - LPWORD - which is gotten from lpTimeStamp = 0 (ERROR).
|
||
|
* or lpTimeStamp != 0 (value of timestamp)
|
||
|
*
|
||
|
* SYNOPSIS - calls GetFileTime() to get timestamp. If error, then
|
||
|
* lpTimeStamp = 0, else contains TimeStamp for file.
|
||
|
* WARNINGS -
|
||
|
* EFFECTS -
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
DWORD FileTime(
|
||
|
HFILE hFile)
|
||
|
{
|
||
|
BOOL bReturnCode;
|
||
|
FILETIME CreationTime;
|
||
|
FILETIME LastAccessTime;
|
||
|
FILETIME LastWriteTime;
|
||
|
WORD FatTime;
|
||
|
WORD FatDate;
|
||
|
|
||
|
bReturnCode = GetFileTime((HANDLE)hFile, &CreationTime, &LastAccessTime,
|
||
|
&LastWriteTime);
|
||
|
|
||
|
/*
|
||
|
* Test return code
|
||
|
*/
|
||
|
if (bReturnCode == FALSE) {
|
||
|
return 0; /*set to zero, for error*/
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Now convert 64bit time to DOS 16bit time
|
||
|
*/
|
||
|
FileTimeToDosDateTime( &LastWriteTime, &FatDate, &FatTime);
|
||
|
return FatTime;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*** IsReadOnly -- determines if file is readonly or not.
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
* BOOL IsReadOnly(LPSTR lpszFileString)
|
||
|
*
|
||
|
* ENTRY - LPSTR lpszFileString - file name to use
|
||
|
*
|
||
|
* EXIT - BOOL xxx - returns (0) = not readonly (1) = read only
|
||
|
* or lpTimeStamp != 0 (value of timestamp)
|
||
|
*
|
||
|
* SYNOPSIS - calls GetAttributes, then tests if file is read only.
|
||
|
* WARNINGS -
|
||
|
* EFFECTS -
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
|
||
|
BOOL IsReadOnly(LPTSTR lpszFileString)
|
||
|
{
|
||
|
|
||
|
DWORD dwReturnedAttributes;
|
||
|
LPTSTR lpszLocalBuffer; /*local buffer for AnsiToOem()*/
|
||
|
DWORD nBufferLength;
|
||
|
|
||
|
nBufferLength = lstrlen(lpszFileString) + 1;
|
||
|
/*alloc local, non-moveable, zero filled buffer*/
|
||
|
lpszLocalBuffer = (LPTSTR)LocalAlloc(0, sizeof(TCHAR)*nBufferLength);
|
||
|
if(lpszLocalBuffer == NULL){
|
||
|
KdPrint(("<IsReadOnly> LocalAlloc FAILed\n"));
|
||
|
}
|
||
|
|
||
|
lstrcpy(lpszLocalBuffer,lpszFileString);
|
||
|
|
||
|
/*get attributes of filestring*/
|
||
|
dwReturnedAttributes = GetFileAttributes(lpszLocalBuffer);
|
||
|
if(dwReturnedAttributes == -1){
|
||
|
KdPrint(("<IsReadOnly> - GetFileAttributes() FAILed!\n"));
|
||
|
LocalFree(lpszLocalBuffer);
|
||
|
return FALSE;
|
||
|
} else {
|
||
|
/*AND with read_only attribute*/
|
||
|
dwReturnedAttributes = dwReturnedAttributes & FILE_ATTRIBUTE_READONLY;
|
||
|
switch(dwReturnedAttributes){
|
||
|
|
||
|
case FILE_ATTRIBUTE_READONLY:
|
||
|
LocalFree(lpszLocalBuffer);
|
||
|
return TRUE;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
LocalFree(lpszLocalBuffer);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/*** GetDOSErrorCode -- returns extended error code
|
||
|
*
|
||
|
*
|
||
|
*
|
||
|
* DWORD GetDOSErrorCode(VOID)
|
||
|
*
|
||
|
* ENTRY - VOID
|
||
|
*
|
||
|
* EXIT - DWORD - returned extended code.
|
||
|
*
|
||
|
* SYNOPSIS - calls GetLastError() to get error code from OS
|
||
|
* WARNINGS -
|
||
|
* EFFECTS -
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
DWORD GetDOSErrorCode(VOID)
|
||
|
{
|
||
|
|
||
|
return( (int) GetLastError());
|
||
|
|
||
|
/*BUG BUG, pmgseg.c uses this from _lcreat() to determine if returned
|
||
|
5 (access denied) or 13 (invalid_data). So this need be tested
|
||
|
to see if win32 returns these.*/
|
||
|
|
||
|
}
|
||
|
|
||
|
/*** DosDelete -- Delete named file.
|
||
|
*
|
||
|
* int DosDelete(LPSTR lpszFileToDelete)
|
||
|
*
|
||
|
* ENTRY - LPSTR lpszFileToDelete - filename to delete.
|
||
|
*
|
||
|
* EXIT - int xxx - returns (0) if success
|
||
|
*
|
||
|
* SYNOPSIS - calls win32 DeleteFile.
|
||
|
* WARNINGS -
|
||
|
* EFFECTS -
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
int DosDelete(LPTSTR lpszFileToDelete)
|
||
|
{
|
||
|
|
||
|
BOOL bReturnCode;
|
||
|
LPTSTR lpszLocalBuffer; /*local buffer for AnsiToOem()*/
|
||
|
DWORD nBufferLength;
|
||
|
|
||
|
nBufferLength = lstrlen(lpszFileToDelete) + 1;
|
||
|
/*alloc local, non-moveable, zero filled buffer*/
|
||
|
lpszLocalBuffer = (LPTSTR)LocalAlloc(0, sizeof(TCHAR)*nBufferLength);
|
||
|
if(lpszLocalBuffer == NULL){
|
||
|
KdPrint(("<DosDelete> LocalAlloc FAILed\n"));
|
||
|
}
|
||
|
|
||
|
|
||
|
lstrcpy(lpszLocalBuffer,lpszFileToDelete);
|
||
|
|
||
|
|
||
|
bReturnCode = DeleteFile(lpszLocalBuffer);
|
||
|
LocalFree(lpszLocalBuffer);
|
||
|
if(bReturnCode){
|
||
|
return(0);
|
||
|
}
|
||
|
else{
|
||
|
return(1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*** DosRename -- Rename file.
|
||
|
*
|
||
|
* int DosRename(LPSTR lpszOrgFileName, LPSTR lpszNewFileName)
|
||
|
*
|
||
|
* ENTRY - LPSTR lpszOrgFileName - origianl filename.
|
||
|
* LPSTR lpszNewFileName - New filename.
|
||
|
*
|
||
|
* EXIT - int xxx - returns (0) if success
|
||
|
*
|
||
|
* SYNOPSIS - calls win32 MoveFile.
|
||
|
* WARNINGS -
|
||
|
* EFFECTS -
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
int DosRename(LPTSTR lpszOrgFileName, LPTSTR lpszNewFileName)
|
||
|
{
|
||
|
|
||
|
BOOL bReturnCode;
|
||
|
LPTSTR lpszLocalBuffer; /*local buffer for AnsiToOem()*/
|
||
|
LPTSTR lpszLocalBuffer1; /*local buffer for AnsiToOem()*/
|
||
|
DWORD nBufferLength;
|
||
|
DWORD nBufferLength1;
|
||
|
|
||
|
nBufferLength = lstrlen(lpszOrgFileName) + 1;
|
||
|
nBufferLength1 = lstrlen(lpszNewFileName) + 1;
|
||
|
/*alloc local, non-moveable, zero filled buffer*/
|
||
|
lpszLocalBuffer = (LPTSTR)LocalAlloc(0, sizeof(TCHAR)*nBufferLength);
|
||
|
if(lpszLocalBuffer == NULL){
|
||
|
KdPrint(("<DosRename> LocalAlloc FAILed\n"));
|
||
|
}
|
||
|
lpszLocalBuffer1 = (LPTSTR)LocalAlloc(0, sizeof(TCHAR)*nBufferLength1);
|
||
|
if(lpszLocalBuffer1 == NULL){
|
||
|
KdPrint(("<DosRename> LocalAlloc FAILed\n"));
|
||
|
}
|
||
|
|
||
|
|
||
|
lstrcpy(lpszLocalBuffer,lpszOrgFileName);
|
||
|
lstrcpy(lpszLocalBuffer1,lpszNewFileName);
|
||
|
|
||
|
/*rename file*/
|
||
|
bReturnCode = MoveFile(lpszLocalBuffer, lpszLocalBuffer1);
|
||
|
|
||
|
LocalFree(lpszLocalBuffer);
|
||
|
LocalFree(lpszLocalBuffer1);
|
||
|
|
||
|
if(bReturnCode){
|
||
|
return(0);
|
||
|
}
|
||
|
else{
|
||
|
return(1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#if 0
|
||
|
#ifdef i386
|
||
|
|
||
|
//
|
||
|
// Returns true if the application exe type is a DOS binary.
|
||
|
//
|
||
|
|
||
|
BOOL IsDOSApplication(LPTSTR lpPath)
|
||
|
{
|
||
|
DWORD dwBinaryType;
|
||
|
BOOL bRet;
|
||
|
|
||
|
bRet = GetBinaryType(lpPath, &dwBinaryType);
|
||
|
if (bRet) {
|
||
|
if (dwBinaryType != SCS_DOS_BINARY) {
|
||
|
bRet = FALSE;
|
||
|
}
|
||
|
}
|
||
|
return(bRet);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// this routine translates path characters into _ characters because
|
||
|
// the NT registry apis do not allow the creation of keys with
|
||
|
// names that contain path characters. it allocates a buffer that
|
||
|
// must be freed.
|
||
|
//
|
||
|
|
||
|
LPTSTR TranslateConsoleTitle(LPTSTR ConsoleTitle)
|
||
|
{
|
||
|
int ConsoleTitleLength,i;
|
||
|
LPTSTR TranslatedConsoleTitle,Tmp;
|
||
|
|
||
|
ConsoleTitleLength = lstrlen(ConsoleTitle) + 1;
|
||
|
Tmp = TranslatedConsoleTitle = (LPTSTR)LocalAlloc(LMEM_FIXED,ConsoleTitleLength * sizeof(TCHAR));
|
||
|
if (TranslatedConsoleTitle == NULL) {
|
||
|
return NULL;
|
||
|
}
|
||
|
for (i=0;i<ConsoleTitleLength;i++) {
|
||
|
if (*ConsoleTitle == TEXT('\\')) {
|
||
|
*TranslatedConsoleTitle++ = (TCHAR)TEXT('_');
|
||
|
ConsoleTitle++;
|
||
|
} else {
|
||
|
*TranslatedConsoleTitle++ = *ConsoleTitle++;
|
||
|
}
|
||
|
}
|
||
|
return Tmp;
|
||
|
}
|
||
|
|
||
|
// DOS apps are no longer set to fullscreen by default in progman
|
||
|
// 5-3-93 johannec (bug 8343)
|
||
|
|
||
|
#define CONSOLE_REGISTRY_STRING TEXT("Console")
|
||
|
#define CONSOLE_REGISTRY_FULLSCR TEXT("FullScreen")
|
||
|
|
||
|
|
||
|
BOOL SetDOSApplicationToFullScreen(LPTSTR lpTitle)
|
||
|
{
|
||
|
HKEY hkeyConsole,hkeyTitle;
|
||
|
LPTSTR lpTranslatedTitle;
|
||
|
DWORD Error;
|
||
|
DWORD dwFullScreen = 1;
|
||
|
|
||
|
Error = RegOpenKeyEx(HKEY_CURRENT_USER,
|
||
|
CONSOLE_REGISTRY_STRING,
|
||
|
0,
|
||
|
KEY_READ | KEY_WRITE,
|
||
|
&hkeyConsole);
|
||
|
|
||
|
if (Error) {
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
lpTranslatedTitle = TranslateConsoleTitle(lpTitle);
|
||
|
if (lpTranslatedTitle == NULL) {
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
Error = RegCreateKey(hkeyConsole,
|
||
|
lpTranslatedTitle,
|
||
|
&hkeyTitle);
|
||
|
LocalFree(lpTranslatedTitle);
|
||
|
if (Error) {
|
||
|
RegCloseKey(hkeyConsole);
|
||
|
return FALSE;
|
||
|
}
|
||
|
Error = RegSetValueEx(hkeyTitle,
|
||
|
CONSOLE_REGISTRY_FULLSCR,
|
||
|
0,
|
||
|
REG_DWORD,
|
||
|
(LPBYTE)&dwFullScreen,
|
||
|
sizeof(dwFullScreen));
|
||
|
RegCloseKey(hkeyTitle);
|
||
|
RegCloseKey(hkeyConsole);
|
||
|
|
||
|
return(!Error);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif
|