windows-nt/Source/XPSP1/NT/shell/osshell/progman/pmdos.c
2020-09-26 16:20:57 +08:00

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