/* * 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 #include #include #include #include #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((" LocalAlloc FAILed\n")); } lstrcpy(lpszLocalBuffer,lpszFileString); /*get attributes of filestring*/ dwReturnedAttributes = GetFileAttributes(lpszLocalBuffer); if(dwReturnedAttributes == -1){ KdPrint((" - 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((" 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((" LocalAlloc FAILed\n")); } lpszLocalBuffer1 = (LPTSTR)LocalAlloc(0, sizeof(TCHAR)*nBufferLength1); if(lpszLocalBuffer1 == NULL){ KdPrint((" 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