📄 pm.c
字号:
PARAMETERS:base - The starting physical base address of the regionsize - The size in bytes of the regiontype - Type to place into the MTRR registerRETURNS:Error code describing the result.REMARKS:Function to enable write combining for the specified region of memory.****************************************************************************/int PMAPI PM_enableWriteCombine( ulong base, ulong size, uint type){ return MTRR_enableWriteCombine(base,size,type);}/* TODO: Move the MTRR helper stuff into the call gate, or better yet *//* entirely into the ring 0 helper driver!! *//* MTRR helper functions. To make it easier to implement the MTRR support * under OS/2, we simply put our ring 0 helper functions into the * helper device driver rather than the entire MTRR module. This makes * it easier to maintain the MTRR support since we don't need to deal * with 16-bit ring 0 code in the MTRR library. *//****************************************************************************REMARKS:Flush the translation lookaside buffer.****************************************************************************/void PMAPI PM_flushTLB(void){ CallSDDHelp(PMHELP_FLUSHTLB);}/****************************************************************************REMARKS:Return true if ring 0 (or if we can call the helpers functions at ring 0)****************************************************************************/ibool _ASMAPI _MTRR_isRing0(void){ return true;}/****************************************************************************REMARKS:Read and return the value of the CR4 register****************************************************************************/ulong _ASMAPI _MTRR_saveCR4(void){ return CallSDDHelp(PMHELP_SAVECR4);}/****************************************************************************REMARKS:Restore the value of the CR4 register****************************************************************************/void _ASMAPI _MTRR_restoreCR4(ulong cr4Val){ parmsIn[0] = cr4Val; CallSDDHelp(PMHELP_RESTORECR4);}/****************************************************************************REMARKS:Read a machine status register for the CPU.****************************************************************************/void _ASMAPI _MTRR_readMSR( ulong reg, ulong *eax, ulong *edx){ parmsIn[0] = reg; CallSDDHelp(PMHELP_READMSR); *eax = parmsOut[0]; *edx = parmsOut[1];}/****************************************************************************REMARKS:Write a machine status register for the CPU.****************************************************************************/void _ASMAPI _MTRR_writeMSR( ulong reg, ulong eax, ulong edx){ parmsIn[0] = reg; parmsIn[1] = eax; parmsIn[2] = edx; CallSDDHelp(PMHELP_WRITEMSR);}PM_MODULE PMAPI PM_loadLibrary( const char *szDLLName){ /* TODO: Implement this to load shared libraries! */ (void)szDLLName; return NULL;}void * PMAPI PM_getProcAddress( PM_MODULE hModule, const char *szProcName){ /* TODO: Implement this! */ (void)hModule; (void)szProcName; return NULL;}void PMAPI PM_freeLibrary( PM_MODULE hModule){ /* TODO: Implement this! */ (void)hModule;}/****************************************************************************REMARKS:Internal function to convert the find data to the generic interface.****************************************************************************/static void convertFindData( PM_findData *findData, FILEFINDBUF3 *blk){ ulong dwSize = findData->dwSize; memset(findData,0,findData->dwSize); findData->dwSize = dwSize; if (blk->attrFile & FILE_READONLY) findData->attrib |= PM_FILE_READONLY; if (blk->attrFile & FILE_DIRECTORY) findData->attrib |= PM_FILE_DIRECTORY; if (blk->attrFile & FILE_ARCHIVED) findData->attrib |= PM_FILE_ARCHIVE; if (blk->attrFile & FILE_HIDDEN) findData->attrib |= PM_FILE_HIDDEN; if (blk->attrFile & FILE_SYSTEM) findData->attrib |= PM_FILE_SYSTEM; findData->sizeLo = blk->cbFile; findData->sizeHi = 0; strncpy(findData->name,blk->achName,PM_MAX_PATH); findData->name[PM_MAX_PATH-1] = 0;}#define FIND_MASK (FILE_ARCHIVED | FILE_DIRECTORY | FILE_SYSTEM | FILE_HIDDEN | FILE_READONLY)/****************************************************************************REMARKS:Function to find the first file matching a search criteria in a directory.****************************************************************************/void *PMAPI PM_findFirstFile( const char *filename, PM_findData *findData){ FILEFINDBUF3 blk; HDIR hdir = HDIR_CREATE; ulong count = 1; if (DosFindFirst((PSZ)filename,&hdir,FIND_MASK,&blk,sizeof(blk),&count,FIL_STANDARD) == NO_ERROR) { convertFindData(findData,&blk); return (void*)hdir; } return PM_FILE_INVALID;}/****************************************************************************REMARKS:Function to find the next file matching a search criteria in a directory.****************************************************************************/ibool PMAPI PM_findNextFile( void *handle, PM_findData *findData){ FILEFINDBUF3 blk; ulong count = 1; if (DosFindNext((HDIR)handle,&blk,sizeof(blk),&count) == NO_ERROR) { convertFindData(findData,&blk); return true; } return false;}/****************************************************************************REMARKS:Function to close the find process****************************************************************************/void PMAPI PM_findClose( void *handle){ DosFindClose((HDIR)handle);}/****************************************************************************REMARKS:Function to determine if a drive is a valid drive or not. Under Unix thisfunction will return false for anything except a value of 3 (consideredthe root drive, and equivalent to C: for non-Unix systems). The drivenumbering is: 0 - Current drive 1 - Drive A: 2 - Drive B: 3 - Drive C: etc****************************************************************************/ibool PMAPI PM_driveValid( char drive){ ulong cntDisk,cntDriveMap; ibool valid; DosQueryCurrentDisk(&cntDisk,&cntDriveMap); valid = (DosSetDefaultDisk(drive) == NO_ERROR); DosSetDefaultDisk(cntDisk); return valid;}/****************************************************************************REMARKS:Function to get the current working directory for the specififed drive.Under Unix this will always return the current working directory regardlessof what the value of 'drive' is.****************************************************************************/void PMAPI PM_getdcwd( int drive, char *dir, int len){ ulong length = len; DosQueryCurrentDir(drive, (PSZ)dir, &length);}/****************************************************************************REMARKS:Function to change the file attributes for a specific file.****************************************************************************/void PMAPI PM_setFileAttr( const char *filename, uint attrib){ FILESTATUS3 s; if (DosQueryPathInfo((PSZ)filename,FIL_STANDARD,(PVOID)&s,sizeof(s))) return; s.attrFile = 0; if (attrib & PM_FILE_READONLY) s.attrFile |= FILE_READONLY; if (attrib & PM_FILE_ARCHIVE) s.attrFile |= FILE_ARCHIVED; if (attrib & PM_FILE_HIDDEN) s.attrFile |= FILE_HIDDEN; if (attrib & PM_FILE_SYSTEM) s.attrFile |= FILE_SYSTEM; DosSetPathInfo((PSZ)filename,FIL_STANDARD,(PVOID)&s,sizeof(s),0L);}/****************************************************************************REMARKS:Function to get the file attributes for a specific file.****************************************************************************/uint PMAPI PM_getFileAttr( const char *filename){ FILESTATUS3 fs3; uint retval = 0; if (DosQueryPathInfo((PSZ)filename, FIL_STANDARD, &fs3, sizeof(FILESTATUS3))) return 0; if (fs3.attrFile & FILE_READONLY) retval |= PM_FILE_READONLY; if (fs3.attrFile & FILE_ARCHIVED) retval |= PM_FILE_ARCHIVE; if (fs3.attrFile & FILE_HIDDEN) retval |= PM_FILE_HIDDEN; if (fs3.attrFile & FILE_SYSTEM) retval |= PM_FILE_SYSTEM; return retval;}/****************************************************************************REMARKS:Function to create a directory.****************************************************************************/ibool PMAPI PM_mkdir( const char *filename){ return DosCreateDir((PSZ)filename,NULL) == NO_ERROR;}/****************************************************************************REMARKS:Function to remove a directory.****************************************************************************/ibool PMAPI PM_rmdir( const char *filename){ return DosDeleteDir((PSZ)filename) == NO_ERROR;}/****************************************************************************REMARKS:Function to get the file time and date for a specific file.****************************************************************************/ibool PMAPI PM_getFileTime( const char *filename, ibool gmTime, PM_time *time){ FILESTATUS3 fs3; struct tm tc; struct tm *ret; time_t tt; if (DosQueryPathInfo((PSZ)filename, FIL_STANDARD, &fs3, sizeof(FILESTATUS3))) return false; if (gmTime) { tc.tm_year = fs3.fdateLastWrite.year + 80; tc.tm_mon = fs3.fdateLastWrite.month - 1; tc.tm_mday = fs3.fdateLastWrite.day; tc.tm_hour = fs3.ftimeLastWrite.hours; tc.tm_min = fs3.ftimeLastWrite.minutes; tc.tm_sec = fs3.ftimeLastWrite.twosecs * 2; if((tt = mktime(&tc)) == -1) return false; if(!(ret = gmtime(&tt))) return false; time->sec = ret->tm_sec; time->day = ret->tm_mday; time->mon = ret->tm_mon + 1; time->year = ret->tm_year - 80; time->min = ret->tm_min; time->hour = ret->tm_hour; } else { time->sec = fs3.ftimeLastWrite.twosecs * 2; time->day = fs3.fdateLastWrite.day; time->mon = fs3.fdateLastWrite.month; time->year = fs3.fdateLastWrite.year; time->min = fs3.ftimeLastWrite.minutes; time->hour = fs3.ftimeLastWrite.hours; } return true;}/****************************************************************************REMARKS:Function to set the file time and date for a specific file.****************************************************************************/ibool PMAPI PM_setFileTime( const char *filename, ibool gmTime, PM_time *time){ FILESTATUS3 fs3; struct tm tc; struct tm *ret; time_t tt; if (DosQueryPathInfo((PSZ)filename,FIL_STANDARD,(PVOID)&fs3,sizeof(fs3))) return false; if (gmTime) { tc.tm_year = time->year + 80; tc.tm_mon = time->mon - 1; tc.tm_mday = time->day; tc.tm_hour = time->hour; tc.tm_min = time->min; tc.tm_sec = time->sec; if((tt = mktime(&tc)) == -1) return false; ret = localtime(&tt); fs3.ftimeLastWrite.twosecs = ret->tm_sec / 2; fs3.fdateLastWrite.day = ret->tm_mday; fs3.fdateLastWrite.month = ret->tm_mon + 1; fs3.fdateLastWrite.year = ret->tm_year - 80; fs3.ftimeLastWrite.minutes = ret->tm_min; fs3.ftimeLastWrite.hours = ret->tm_hour; } else { fs3.ftimeLastWrite.twosecs = time->sec / 2; fs3.fdateLastWrite.day = time->day; fs3.fdateLastWrite.month = time->mon; fs3.fdateLastWrite.year = time->year; fs3.ftimeLastWrite.minutes = time->min; fs3.ftimeLastWrite.hours = time->hour; } memcpy(&fs3.fdateLastAccess, &fs3.fdateLastWrite, sizeof(FDATE)); memcpy(&fs3.fdateCreation, &fs3.fdateLastWrite, sizeof(FDATE)); memcpy(&fs3.ftimeLastAccess, &fs3.ftimeLastWrite, sizeof(FTIME)); memcpy(&fs3.ftimeCreation, &fs3.ftimeLastWrite, sizeof(FTIME)); DosSetPathInfo((PSZ)filename,FIL_STANDARD,(PVOID)&fs3,sizeof(FILESTATUS3),0L); return true;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -