/* * Return first char of filesystem type, or 0 if unknown. */ static char getFSType(const char *path) { static char cache[1 + 26]; char drive[3], info[512]; Word unit, infolen; char r; if (isalpha(path[0]) && path[1] == ':') { unit = toupper(path[0]) - '@'; path += 2; } else { ULONG driveMap; #if OS2 >= 2 if (DosQueryCurrentDisk(&unit, &driveMap)) #else if (DosQCurDisk(&unit, &driveMap)) #endif return 0; } if ((path[0] == '\\' || path[0] == '/') && (path[1] == '\\' || path[1] == '/')) return 0; if (cache[unit]) return cache[unit]; drive[0] = '@' + unit; drive[1] = ':'; drive[2] = '\0'; infolen = sizeof info; #if OS2 >= 2 if (DosQueryFSAttach(drive, 0, FSAIL_QUERYNAME, (PVOID)info, &infolen)) return 0; if (infolen >= sizeof(FSQBUFFER2)) { FSQBUFFER2 *p = (FSQBUFFER2 *)info; r = p->szFSDName[p->cbName]; } else #else if (DosQFSAttach((PSZ)drive, 0, FSAIL_QUERYNAME, (PVOID)info, &infolen, 0)) return 0; if (infolen >= 9) { char *p = info + sizeof(USHORT); p += sizeof(USHORT) + *(USHORT *)p + 1 + sizeof(USHORT); r = *p; } else #endif r = 0; return cache[unit] = r; }
int LocalGetDrv( void ) /*********************/ { USHORT drive; ULONG map; if( DosQCurDisk( &drive, &map ) ) { return( -1 ); } return( drive - 1 ); }
/* * doGetDriveType - get the type of drive A-Z */ static drive_type doGetDriveType( int drv ) { STUPID_UINT disk; ULONG map; int i; char fname[3]; HFILE hf; STUPID_UINT act; STUPID_UINT type; int rc; #ifdef __OS_dosos2__ if( _osmode == 0 ) { return( dosDoGetDriveType( drv ) ); } else { #endif drv = toupper( drv ); DosQCurDisk( &disk, &map ); for( i='A';i<='Z';i++ ) { if( drv == i ) { if( map & 1 ) { fname[0] = tolower( i ); fname[1] = ':'; fname[2] = 0; rc = DosOpen( fname, &hf, &act, 0, 0, 0x0001, 0x0040 | 0x8000, 0L ); if( rc == 0 ) { DosQHandType( hf, &type, &act ); DosClose( hf ); if( type & 0x8000 ) { return( DRIVE_IS_REMOTE ); } } else { // KLUDGE - this only seems to fail for network drives?! return( DRIVE_IS_REMOTE ); } return( DRIVE_IS_FIXED ); } else { return( DRIVE_NONE ); } } map >>= 1; } return( DRIVE_NONE ); #ifdef __OS_dosos2__ } #endif } /* doGetDriveType */
/* * PushDirectory - save the current directory */ void PushDirectory( char *orig ) { STUPID_UINT c; unsigned long map; oldPath[0] = 0; DosQCurDisk( &c, &map ); oldDisk = (char) c; if( orig[1] == ':' ) { ChangeDrive( orig[0] ); } GetCWD2( oldPath, sizeof( oldPath ) ); } /* PushDirectory */
static USHORT _FillDriveLb(HWND hDlg) { USHORT i, j; SHORT CurDriveId; ULONG LogDrives, Mask, CurrentDrive; CHAR DisplayTekst[5]; if (DosQCurDisk(&CurrentDrive, &LogDrives)) return (1); Mask = 0x0001; CurDriveId = 0; for (i = 0, j = 0; i < 26; ++i) { if (LogDrives & Mask) { sprintf(DisplayTekst, "[%c:]", (char) (65 + i)); WinSendDlgItemMsg(hDlg, LID_CD_DRIVES, LM_INSERTITEM, MPFROM2SHORT(LIT_END, 0), MPFROMP(DisplayTekst)); if (i == CurrentDrive - 1) CurDriveId = j; ++j; } Mask <<= 1; } WinSendDlgItemMsg(hDlg, LID_CD_DRIVES, LM_SELECTITEM, MPFROMSHORT(CurDriveId), MPFROMSHORT((BOOL) TRUE)); SelectedDrive = CurrentDrive; if (_FillDirLb(hDlg, CurrentDrive)) return (1); return (0); }
/* * DoGetDriveType - get the type of drive A-Z */ drive_type DoGetDriveType( int drv ) { STUPID_UINT disk; ULONG map; int i; DosQCurDisk( &disk, &map ); for( i = 'A'; i <= 'Z'; i++ ) { if( drv == i ) { if( map & 1 ) { return( DRIVE_IS_FIXED ); } else { return( DRIVE_NONE ); } } map >>= 1; } return( DRIVE_NONE ); // to quiet the compiler } /* DoGetDriveType */
_WCRTLINK CHAR_TYPE *__F_NAME(getcwd,_wgetcwd)( CHAR_TYPE *buf, size_t size ) { APIRET error; ULONG drive_map; #ifndef __WIDECHAR__ char path[_MAX_PATH]; /* single-byte chars */ OS_UINT pathlen = _MAX_PATH - 3; #else char path[MB_CUR_MAX*_MAX_PATH]; /* multi-byte chars */ OS_UINT pathlen = MB_CUR_MAX * _MAX_PATH - 3; #endif OS_UINT drive; error = DosQCurDir( 0, &path[3], &pathlen ); if( error ) { __set_errno_dos( error ); return( NULL ); } DosQCurDisk( &drive, &drive_map ); path[ 0 ] = drive + 'A' - 1; path[ 1 ] = ':'; path[ 2 ] = '\\'; if( buf == NULL ) { if( (buf = malloc( max(size,pathlen+4)*CHARSIZE )) == NULL ) { __set_errno( ENOMEM ); return( NULL ); } size = pathlen + 3; } /*** Copy the pathname into a buffer and quit ***/ #ifndef __WIDECHAR__ return( strncpy( buf, path, size ) ); #else if( mbstowcs( buf, path, size ) != (size_t)-1 ) return( buf ); else return( NULL ); #endif }
int IsFileSystemFAT(char *dir) { USHORT nDrive; ULONG lMap; BYTE bData[64], bName[3]; USHORT cbData; static USHORT nLastDrive = -1, nResult; if ( _osmode == DOS_MODE ) return TRUE; else { /* We separate FAT and HPFS+other file systems here. at the moment I consider other systems to be similar to HPFS, i.e. support long file names and beeing case sensitive */ if ( isalpha(dir[0]) && (dir[1] == ':') ) nDrive = toupper(dir[0]) - '@'; else DosQCurDisk(&nDrive, &lMap); if ( nDrive == nLastDrive ) return nResult; bName[0] = (char) (nDrive + '@'); bName[1] = ':'; bName[2] = 0; nLastDrive = nDrive; cbData = sizeof(bData); if ( !DosQFSAttach(bName, 0U, 1U, bData, &cbData, 0L) ) nResult = !strcmp(bData + (*(USHORT *) (bData + 2) + 7), "FAT"); else nResult = FALSE; /* End of this ugly code */ return nResult; } }
_WCRTLINK CHAR_TYPE *__F_NAME(_sys_fullpath,_sys_wfullpath) ( CHAR_TYPE *buff, const CHAR_TYPE *path, size_t size ) /*********************************************************************/ { #if defined(__NT__) CHAR_TYPE *filepart; DWORD rc; if( __F_NAME(stricmp,_wcsicmp)( path, STRING( "con" ) ) == 0 ) { _WILL_FIT( 3 ); return( __F_NAME(strcpy,wcscpy)( buff, STRING( "con" ) ) ); } /*** Get the full pathname ***/ rc = __lib_GetFullPathName( path, size, buff, &filepart ); // If the buffer is too small, the return value is the size of // the buffer, in TCHARs, required to hold the path. // If the function fails, the return value is zero. To get extended error // information, call GetLastError. if( ( rc == 0 ) || ( rc > size ) ) { __set_errno_nt(); return( NULL ); } return( buff ); #elif defined(__WARP__) APIRET rc; char root[ 4 ]; /* SBCS: room for drive, ':', '\\', and null */ #ifdef __WIDECHAR__ char mbBuff[ _MAX_PATH * MB_CUR_MAX ]; char mbPath[ _MAX_PATH * MB_CUR_MAX ]; #endif if( __F_NAME(isalpha,iswalpha)( path[ 0 ] ) && ( path[ 1 ] == STRING( ':' ) ) && ( path[ 2 ] == STRING( '\\' ) ) ) { int i; i = __F_NAME(strlen,wcslen)( path ); _WILL_FIT( i ); __F_NAME(strcpy,wcscpy)( buff, path ); return( buff ); } /* * Check for x:filename.ext when drive x doesn't exist. In this * case, return x:\filename.ext, not NULL, to be consistent with * MS and with the NT version of _fullpath. */ if( __F_NAME(isalpha,iswalpha)( path[ 0 ] ) && path[ 1 ] == STRING( ':' ) ) { /*** We got this far, so path can't start with letter:\ ***/ root[ 0 ] = (char)path[ 0 ]; root[ 1 ] = ':'; root[ 2 ] = '\\'; root[ 3 ] = '\0'; rc = DosQueryPathInfo( root, FIL_QUERYFULLNAME, buff, size ); if( rc != NO_ERROR ) { /*** Drive does not exist; return x:\filename.ext ***/ _WILL_FIT( __F_NAME(strlen,wcslen)( &path[ 2 ] ) + 3 ); buff[ 0 ] = root[ 0 ]; buff[ 1 ] = STRING( ':' ); buff[ 2 ] = STRING( '\\' ); __F_NAME(strcpy,wcscpy)( &buff[ 3 ], &path[ 2 ] ); return( buff ); } } #ifdef __WIDECHAR__ if( wcstombs( mbPath, path, sizeof( mbPath ) ) == (size_t)-1 ) { return( NULL ); } rc = DosQueryPathInfo( (PSZ)mbPath, FIL_QUERYFULLNAME, mbBuff, sizeof( mbBuff ) ); #else rc = DosQueryPathInfo( (PSZ)path, FIL_QUERYFULLNAME, buff, size ); #endif if( rc != 0 ) { __set_errno_dos( rc ); return( NULL ); } #ifdef __WIDECHAR__ if( mbstowcs( buff, mbBuff, size ) != (size_t)-1 ) { return( buff ); } else { return( NULL ); } #else return( buff ); #endif #elif defined(__QNX__) || defined( __NETWARE__ ) size_t len; char temp_dir[ _MAX_PATH ]; #if defined(__NETWARE__) if( ConvertNameToFullPath( path, temp_dir ) != 0 ) { return( NULL ); } #else if( __qnx_fullpath( temp_dir, path ) == NULL ) { return( NULL ); } #endif len = strlen( temp_dir ); if( len >= size ) { __set_errno( ERANGE ); return( NULL ); } return( strcpy( buff, temp_dir ) ); #elif defined(__UNIX__) const char *p; char *q; size_t len; char curr_dir[ _MAX_PATH ]; p = path; q = buff; if( ! _IS_SLASH( p[ 0 ] ) ) { if( getcwd( curr_dir, sizeof( curr_dir ) ) == NULL ) { __set_errno( ENOENT ); return( NULL ); } len = strlen( curr_dir ); _WILL_FIT( len ); strcpy( q, curr_dir ); q += len; if( q[ -1 ] != '/' ) { _WILL_FIT( 1 ); *(q++) = '/'; } for( ;; ) { if( p[ 0 ] == '\0' ) break; if( p[ 0 ] != '.' ) { _WILL_FIT( 1 ); *(q++) = *(p++); continue; } ++p; if( _IS_SLASH( p[ 0 ] ) ) { /* ignore "./" in directory specs */ if( ! _IS_SLASH( q[ -1 ] ) ) { *q++ = '/'; } ++p; continue; } if( p[ 0 ] == '\0' ) break; if( p[ 0 ] == '.' && _IS_SLASH( p[ 1 ] ) ) { /* go up a directory for a "../" */ p += 2; if( ! _IS_SLASH( q[ -1 ] ) ) { return( NULL ); } q -= 2; for( ;; ) { if( q < buff ) { return( NULL ); } if( _IS_SLASH( *q ) ) break; --q; } ++q; *q = '\0'; continue; } _WILL_FIT( 1 ); *(q++) = '.'; } *q = '\0'; } else { len = strlen( p ); _WILL_FIT( len ); strcpy( q, p ); } return( buff ); #else const CHAR_TYPE *p; CHAR_TYPE *q; size_t len; int path_drive_idx; char curr_dir[ _MAX_PATH ]; p = path; q = buff; _WILL_FIT( 2 ); if( __F_NAME(isalpha,iswalpha)( p[ 0 ] ) && p[ 1 ] == STRING( ':' ) ) { path_drive_idx = ( __F_NAME(tolower,towlower)( p[ 0 ] ) - STRING( 'a' ) ) + 1; q[ 0 ] = p[ 0 ]; q[ 1 ] = p[ 1 ]; p += 2; } else { #if defined(__OS2__) ULONG drive_map; OS_UINT os2_drive; if( DosQCurDisk( &os2_drive, &drive_map ) ) { __set_errno( ENOENT ); return( NULL ); } path_drive_idx = os2_drive; #else path_drive_idx = TinyGetCurrDrive() + 1; #endif q[ 0 ] = STRING( 'A' ) + ( path_drive_idx - 1 ); q[ 1 ] = STRING( ':' ); } q += 2; if( ! _IS_SLASH( p[ 0 ] ) ) { #if defined(__OS2__) OS_UINT dir_len = sizeof( curr_dir ); if( DosQCurDir( path_drive_idx, curr_dir, &dir_len ) ) { __set_errno( ENOENT ); return( NULL ); } #else if( __getdcwd( curr_dir, path_drive_idx ) ) { __set_errno( ENOENT ); return( NULL ); } #endif len = strlen( curr_dir ); if( curr_dir[ 0 ] != '\\' ) { _WILL_FIT( 1 ); *(q++) = STRING( '\\' ); } _WILL_FIT( len ); #ifdef __WIDECHAR__ if( mbstowcs( q, curr_dir, len + 1 ) == (size_t)-1 ) { return( NULL ); } #else strcpy( q, curr_dir ); #endif q += len; if( q[ -1 ] != STRING( '\\' ) ) { _WILL_FIT( 1 ); *(q++) = STRING( '\\' ); } for( ;; ) { if( p[ 0 ] == NULLCHAR ) break; if( p[ 0 ] != STRING( '.' ) ) { _WILL_FIT( 1 ); *(q++) = *(p++); continue; } ++p; // at least '.' if( _IS_SLASH( p[ 0 ] ) ) { /* ignore "./" in directory specs */ if( ! _IS_SLASH( q[ -1 ] ) ) { *q++ = STRING( '\\' ); } ++p; continue; } if( p[ 0 ] == NULLCHAR ) break; if( p[ 0 ] == STRING( '.' ) ) { /* .. */ ++p; if( _IS_SLASH( p[ 0 ] ) ) { /* "../" */ ++p; } if( ! _IS_SLASH( q[ -1 ] ) ) { return( NULL ); } q -= 2; for( ;; ) { if( q < buff ) { return( NULL ); } if( _IS_SLASH( *q ) ) break; if( *q == STRING( ':' ) ) { ++q; *q = STRING( '\\' ); break; } --q; } ++q; *q = NULLCHAR; continue; } _WILL_FIT( 1 ); *(q++) = STRING( '.' ); } *q = NULLCHAR; } else { len = __F_NAME(strlen,wcslen)( p ); _WILL_FIT( len ); __F_NAME(strcpy,wcscpy)( q, p ); } /* force to all backslashes */ for( q = buff; *q != NULLCHAR; ++q ) { if( *q == STRING( '/' ) ) { *q = STRING( '\\' ); } } return( buff ); #endif }
/* * splitPath - need because C library will truncate fname and ext too early */ static void splitPath( char *path, char *drive, char *dir, char *fname, char *ext ) { char *dotp; char *fnamep; char *startp; char ch; #if defined( __UNIX__ ) || defined( __NETWARE__ ) /* process node/drive specification */ startp = path; if( path[0] == FILE_SEP_CHAR && path[1] == FILE_SEP_CHAR ) { path += 2; for( ;; ) { ch = *path; if( ch == '\0' || ch == FILE_SEP_CHAR || ch == '.' ) { break; } path++; } } copyPart( drive, startp, (int)( path - startp ), _MAX_DRIVE ); #else /* processs drive specification */ if( path[0] != 0 && path[1] == ':' ) { if( drive != NULL ) { drive[0] = path[0]; drive[1] = ':'; drive[2] = 0; } path += 2; } else if( drive != NULL ) { drive[0] = 0; } #endif dotp = NULL; fnamep = path; startp = path; for( ;; ) { ch = *path; if( ch == 0 ) { break; } if( ch == '.' ) { dotp = path; path++; continue; } path++; #if defined( __UNIX__ ) || defined( __NETWARE__ ) if( ch == FILE_SEP_CHAR ) { #else if( ch == FILE_SEP_CHAR || ch == '/' ) { #endif fnamep = path; dotp = NULL; } } copyPart( dir, startp, (int)( fnamep - startp ), _MAX_DIR - 1 ); if( dotp == NULL ) { dotp = path; } #if defined( __UNIX__ ) || defined( __NETWARE__ ) if( ext == NULL ) { dotp = path; } #endif copyPart( fname, fnamep, (int)( dotp - fnamep ), _MAX_PATH - 1 ); copyPart( ext, dotp, (int)( path - dotp ), _MAX_PATH - 1); } /* splitPath */ #ifdef __OS2__ #ifdef _M_I86 #define STUPID_UINT unsigned short #else #define STUPID_UINT unsigned long #endif static drive_type getDriveType( char drive ) { STUPID_UINT disk; unsigned long map; char drv; DosQCurDisk( &disk, &map ); for( drv = 'A'; drv <= 'Z'; drv++ ) { if( drive == drv ) { if( map & 1 ) { return( DRIVE_IS_FIXED ); } else { return( DRIVE_NONE ); } } map >>= 1; } return( DRIVE_NONE ); }
void StartProg( const char *cmd, const char *prog, char *full_args, char *dos_args ) { const char *src; char *dst; USHORT drive; ULONG map; USHORT len; USHORT tid; USHORT rc; char buff[BSIZE]; seg_offset where; char *cmd_tail; /* unused parameters */ (void)cmd; MaxThread = 0; GrowArrays( 1 ); src = prog; dst = UtilBuff; DosQCurDisk( &drive, &map ); if( src[0] == '\0' || src[1] == '\0' || src[1] != ':' ) { *dst++ = drive - 1 + 'A'; *dst++ = ':'; } else { *dst++ = *src++; *dst++ = *src++; } if( src[0] != '\\' ) { ++dst; len = BUFF_SIZE - ( dst - UtilBuff ); DosQCurDir( drive, (PBYTE)dst, &len ); dst[-1] = '\\'; if( *dst == '\\' || *dst == '\0' ) { *dst = '\0'; } else { while( *dst != '\0' ) { ++dst; } *dst++ = '\\'; } } strcpy( dst, src ); dst = UtilBuff + strlen( UtilBuff ) + 1; cmd_tail = dst; strcpy( dst, full_args ); dst += strlen( dst ); *++dst = '\0'; /* Need two nulls at end */ LoadProg( UtilBuff, cmd_tail ); Output( MsgArray[MSG_SAMPLE_1 - ERR_FIRST_MESSAGE] ); Output( UtilBuff ); Output( "\r\n" ); Buff.pid = Pid; Buff.tid = 1; Buff.cmd = PT_CMD_STOP; LibLoadPTrace( &Buff ); if( OSVer < 0x1400 ) { /* OS/2 2.x already dumped out MainMod as a Module load */ CodeLoad( &Buff, MainMod, ExeName, SAMP_MAIN_LOAD ); } InitialCS = Buff.u.r.CS; rc = DosCreateThread( Sleeper, (PUSHORT)&tid, Stack + STACK_SIZE ); if( rc != 0 ) { InternalError( MsgArray[MSG_SAMPLE_4 - ERR_FIRST_MESSAGE] ); } rc = DosSetPrty( PRTYS_THREAD, PRTYC_TIMECRITICAL, 0, tid ); if( rc != 0 ) { InternalError( MsgArray[MSG_SAMPLE_5 - ERR_FIRST_MESSAGE] ); } Buff.pid = Pid; Buff.tid = 1; for( ;; ) { Buff.cmd = PT_CMD_GO; if( LibLoadPTrace( &Buff ) != 0 ) { InternalError( MsgArray[MSG_SAMPLE_7 - ERR_FIRST_MESSAGE] ); } if( Buff.cmd == PT_RET_BREAK && Buff.u.r.DX != 0 ) { /* a mark */ len = 0; Buff.segv = Buff.u.r.DX; Buff.offv = Buff.u.r.AX; for( ;; ) { Buff.cmd = PT_CMD_READ_MEM_D; DosPTrace( &Buff ); buff[len] = Buff.value; if( Buff.cmd != PT_RET_SUCCESS ) buff[len] = '\0'; if( len == BSIZE ) buff[len] = '\0'; if( buff[len] == '\0' ) break; ++len; Buff.offv++; } where.segment = Buff.u.r.CS; where.offset = Buff.u.r.IP; WriteMark( buff, where ); Buff.cmd = PT_CMD_READ_REGS; DosPTrace( &Buff ); Buff.u.r.IP++; Buff.cmd = PT_CMD_WRITE_REGS; DosPTrace( &Buff ); continue; } else if( Buff.cmd == PT_RET_BREAK ) { /* common info pass */ CommonAddr.segment = Buff.u.r.CX; CommonAddr.offset = Buff.u.r.BX; Buff.cmd = PT_CMD_READ_REGS; DosPTrace( &Buff ); Buff.u.r.IP++; Buff.cmd = PT_CMD_WRITE_REGS; DosPTrace( &Buff ); continue; } if( Buff.cmd == PT_RET_FUNERAL ) break; if( Buff.cmd != PT_RET_LIB_LOADED && Buff.cmd != PT_RET_STOPPED && Buff.cmd != PT_RET_TRD_TERMINATE ) { InternalError( MsgArray[MSG_SAMPLE_6 - ERR_FIRST_MESSAGE] ); break; } RecordSample( Buff.u.r.IP, Buff.u.r.CS, Buff.tid ); } report(); }
bool LocalInteractive( sys_handle fh ) /************************************/ { APIRET type; APIRET flags; //NYI: really should convert fh to sys_handle, but I know that it's // a one-to-one mapping #ifdef _M_I86 if( DosQHandType( fh, &type, &flags ) ) { #else if( DosQueryHType( fh, &type, &flags ) ) { #endif return( false ); } if( type == 1 ) { /* device type */ return( true ); } return( false ); } void LocalGetBuff( char *buff, unsigned size ) /********************************************/ { struct _STRINGINBUF length; if( size > UCHAR_MAX ) { size = UCHAR_MAX; } length.cb = size; length.cchIn = 0; if( KbdStringIn( buff, &length, 0, 0 ) ) { buff[0] = '\r'; buff[1] = NULLCHAR; return; } buff[length.cchIn] = NULLCHAR; } error_handle LocalRename( const char *from, const char *to ) /**********************************************************/ { #ifdef _M_I86 return( StashErrCode( DosMove( from, to, 0 ), OP_LOCAL ) ); #else return( StashErrCode( DosMove( from, to ), OP_LOCAL ) ); #endif } error_handle LocalMkDir( const char *name ) /*****************************************/ { #ifdef _M_I86 return( StashErrCode( DosMkDir( name, 0 ), OP_LOCAL ) ); #else return( StashErrCode( DosCreateDir( name, NULL ), OP_LOCAL ) ); #endif } error_handle LocalRmDir( const char *name ) /*****************************************/ { #ifdef _M_I86 return( StashErrCode( DosRmDir( name, 0 ), OP_LOCAL ) ); #else return( StashErrCode( DosDeleteDir( name ), OP_LOCAL ) ); #endif } error_handle LocalSetDrv( int drv ) /*********************************/ { #ifdef _M_I86 return( StashErrCode( DosSelectDisk( drv + 1 ), OP_LOCAL ) ); #else return( StashErrCode( DosSetDefaultDisk( drv + 1 ), OP_LOCAL ) ); #endif } int LocalGetDrv( void ) /*********************/ { APIRET drive; ULONG map; #ifdef _M_I86 if( DosQCurDisk( &drive, &map ) ) { #else if( DosQueryCurrentDisk( &drive, &map ) ) { #endif return( -1 ); } return( drive - 1 ); } error_handle LocalSetCWD( const char *name ) /******************************************/ { #ifdef _M_I86 return( StashErrCode( DosChDir( name, 0 ), OP_LOCAL ) ); #else return( StashErrCode( DosSetCurrentDir( name ), OP_LOCAL ) ); #endif } long LocalGetFileAttr( const char *name ) /***************************************/ { #ifdef _M_I86 USHORT attr; if( DosQFileMode( name, &attr, 0 ) ) { return( -1L ); } return( attr ); #else FILESTATUS3 fileinfo; if( DosQueryPathInfo( name, FIL_STANDARD, &fileinfo, sizeof( fileinfo ) ) ) { return( -1L ); } return( fileinfo.attrFile ); #endif }
MRESULT EXPENTRY SwapProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) { static HWND hwndMenu = (HWND)0; switch(msg) { case WM_CREATE: { MRESULT mr = PFNWPStatic(hwnd,msg,mp1,mp2); WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID); return mr; } case WM_MOUSEMOVE: break; case WM_PRESPARAMCHANGED: { char *rootname = "SwapMon"; switch(WinQueryWindowUShort(hwnd,QWS_ID)) { case CLOCK_FRAME: rootname = "Clock"; break; case HARD_FRAME: rootname = "Hard"; break; case CPU_FRAME: rootname = "CPU"; break; case CLP_FRAME: rootname = "ClipMon"; break; case MEM_FRAME: rootname = "Mem"; break; case TSK_FRAME: rootname = "Task"; break; } PresParamChanged(hwnd, rootname, mp1, mp2); PostMsg(hwnd, UM_TIMER, MPVOID, MPVOID); PostMsg(hwnd, UM_REFRESH, MPVOID, MPFROMSHORT(TRUE)); } break; case WM_APPTERMINATENOTIFY: if(WinQueryWindowUShort(hwnd,QWS_ID) == CPU_FRAME) { if(!StartCPUThreads()) WinDestroyWindow(hwnd); } break; case WM_BUTTON1MOTIONSTART: { POINTL ptl; ptl.x = SHORT1FROMMP(mp1); ptl.y = SHORT2FROMMP(mp1); WinMapWindowPoints(hwnd, HWND_DESKTOP, &ptl, 1L); PostMsg(hwndConfig, UM_SHOWME, MPFROM2SHORT((USHORT)ptl.x,(USHORT)ptl.y), mp2); } return MRFROMSHORT(TRUE); case WM_BUTTON2MOTIONSTART: { TRACKINFO TrackInfo; SWP Position; memset(&TrackInfo,0,sizeof(TrackInfo)); TrackInfo.cxBorder = 1 ; TrackInfo.cyBorder = 1 ; TrackInfo.cxGrid = 1 ; TrackInfo.cyGrid = 1 ; TrackInfo.cxKeyboard = 8 ; TrackInfo.cyKeyboard = 8 ; WinQueryWindowPos(hwnd,&Position); TrackInfo.rclTrack.xLeft = Position.x ; TrackInfo.rclTrack.xRight = Position.x + Position.cx ; TrackInfo.rclTrack.yBottom = Position.y ; TrackInfo.rclTrack.yTop = Position.y + Position.cy ; WinQueryWindowPos(HWND_DESKTOP,&Position); TrackInfo.rclBoundary.xLeft = Position.x ; TrackInfo.rclBoundary.xRight = Position.x + Position.cx ; TrackInfo.rclBoundary.yBottom = Position.y ; TrackInfo.rclBoundary.yTop = Position.y + Position.cy ; TrackInfo.ptlMinTrackSize.x = 0 ; TrackInfo.ptlMinTrackSize.y = 0 ; TrackInfo.ptlMaxTrackSize.x = Position.cx ; TrackInfo.ptlMaxTrackSize.y = Position.cy ; TrackInfo.fs = TF_MOVE | TF_STANDARD | TF_ALLINBOUNDARY ; if(WinTrackRect(HWND_DESKTOP, (HPS)0, &TrackInfo)) { WinSetWindowPos(hwnd, HWND_TOP, TrackInfo.rclTrack.xLeft, TrackInfo.rclTrack.yBottom, 0, 0, SWP_MOVE); switch(WinQueryWindowUShort(hwnd,QWS_ID)) { case SWAP_FRAME: WinQueryWindowPos(hwnd,&swpSwap); SavePrf("SwapSwp", &swpSwap, sizeof(SWP)); break; case CLOCK_FRAME: WinQueryWindowPos(hwnd,&swpClock); SavePrf("ClockSwp", &swpClock, sizeof(SWP)); break; case HARD_FRAME: WinQueryWindowPos(hwnd,&swpHard); SavePrf("HardSwp", &swpHard, sizeof(SWP)); break; case CPU_FRAME: WinQueryWindowPos(hwnd,&swpCPU); SavePrf("CPUSwp", &swpCPU, sizeof(SWP)); break; case CLP_FRAME: WinQueryWindowPos(hwnd,&swpClip); SavePrf("ClipSwp", &swpClip, sizeof(SWP)); break; case MEM_FRAME: WinQueryWindowPos(hwnd,&swpMem); SavePrf("MemSwp", &swpMem, sizeof(SWP)); break; case TSK_FRAME: WinQueryWindowPos(hwnd,&swpTask); SavePrf("TaskSwp", &swpTask, sizeof(SWP)); break; } } } return MRFROMSHORT(TRUE); case WM_BUTTON1DOWN: WinSetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_ZORDER | SWP_DEACTIVATE); return MRFROMSHORT(TRUE); case WM_BUTTON1DBLCLK: case WM_BUTTON1CLICK: if((!fNoMonClick && msg == WM_BUTTON1CLICK) || (fNoMonClick && msg == WM_BUTTON1DBLCLK)) { switch(WinQueryWindowUShort(hwnd,QWS_ID)) { case HARD_FRAME: { ULONG ulDriveNum,ulDriveMap,x; ulDriveMon = min(ulDriveMon,26); if(!DosQCurDisk(&ulDriveNum, &ulDriveMap)) { for(x = ulDriveMon + 1;x < 26;x++) { if(ulDriveMap & (1 << x)) { ulDriveMon = x; break; } } if(x >= 26) { for(x = 3;x < ulDriveMon - 1;x++) { if(ulDriveMap & (1 << x)) { ulDriveMon = x; break; } } } SavePrf("MonDrive", &ulDriveMon, sizeof(ULONG)); } PostMsg(hwnd, UM_TIMER, MPVOID, MPVOID); } break; case CLP_FRAME: case MEM_FRAME: case TSK_FRAME: case SWAP_FRAME: case CLOCK_FRAME: case CPU_FRAME: { USHORT cmd = CPU_PULSE; switch(WinQueryWindowUShort(hwnd,QWS_ID)) { case MEM_FRAME: cmd = CLOCK_CMDLINE; break; case TSK_FRAME: cmd = CPU_KILLPROC; break; case CLP_FRAME: cmd = CLOCK_CLIPBOARD; break; case SWAP_FRAME: cmd = SWAP_LAUNCHPAD; break; case CLOCK_FRAME: cmd = CLOCK_SETTINGS; if((WinGetKeyState(HWND_DESKTOP,VK_SHIFT) & 0x8000) != 0) cmd = CLOCK_CLOCK; break; } PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(cmd,0), MPVOID); } break; } return MRFROMSHORT(TRUE); } else PostMsg(hwnd, UM_TIMER, MPVOID, MPVOID); break; case WM_CONTEXTMENU: WinInvalidateRect(hwnd, NULL, FALSE); WinSendMsg(hwnd, UM_TIMER, MPVOID, MPVOID); WinSetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_ZORDER | SWP_DEACTIVATE); { USHORT id; id = WinQueryWindowUShort(hwnd,QWS_ID); hwndMenu = WinLoadMenu(HWND_DESKTOP, 0, id); if(hwndMenu) { POINTL ptl; SWP swp; ULONG ulDriveNum,ulDriveMap,x; MENUITEM mi; char s[80]; SetPresParams(hwndMenu, -1, -1, -1, helvtext); switch(id) { case CLP_FRAME: WinSendMsg(hwndMenu, MM_SETITEMATTR, MPFROM2SHORT(CLP_APPEND,FALSE), MPFROM2SHORT(MIA_CHECKED, ((fClipAppend) ? MIA_CHECKED : 0))); break; case HARD_FRAME: if(!DosQCurDisk(&ulDriveNum, &ulDriveMap)) { mi.iPosition = 0; mi.hwndSubMenu = (HWND)0; mi.hItem = 0L; mi.afStyle = MIS_TEXT | MIS_STATIC; mi.afAttribute = MIA_FRAMED; mi.id = -1; sprintf(s, "Current drive is %c:", (char)(ulDriveMon + '@')); WinSendMsg(hwndMenu, MM_INSERTITEM, MPFROMP(&mi), MPFROMP(s)); mi.iPosition = MIT_END; for(x = 2;x < 26;x++) { if(ulDriveMap & (1 << x)) { if(x != ulDriveMon - 1) { mi.afStyle = MIS_TEXT; mi.afAttribute = 0; mi.id = HARD_C + (x - 2); if(fShowFreeInMenus) SetDriveText(x + 1, s); else sprintf(s, "%c:", (char)(x + 'A')); WinSendMsg(hwndMenu, MM_INSERTITEM, MPFROMP(&mi), MPFROMP(s)); } } } } break; case CLOCK_FRAME: WinEnableMenuItem(hwndMenu, CLOCK_VIRTUAL, fDesktops); WinEnableMenuItem(hwndMenu, CLOCK_CLIPBOARD, (ClipHwnd != (HWND)0)); break; default: break; } WinQueryWindowPos(hwnd, &swp); ptl.x = SHORT1FROMMP(mp1); ptl.y = SHORT2FROMMP(mp1); WinMapWindowPoints(hwnd, HWND_DESKTOP, &ptl, 1L); ptl.y = max(ptl.y,swp.y + swp.cy + 4); if(!WinPopupMenu(HWND_DESKTOP, hwnd, hwndMenu, ptl.x - 4, ptl.y - 4, 0, PU_HCONSTRAIN | PU_VCONSTRAIN | PU_KEYBOARD | PU_MOUSEBUTTON1)) { WinDestroyWindow(hwndMenu); hwndMenu = (HWND)0; } } } return MRFROMSHORT(TRUE); case WM_MENUEND: WinSetFocus(HWND_DESKTOP, HWND_DESKTOP); WinDestroyWindow((HWND)mp2); if(hwndMenu == (HWND)mp2) hwndMenu = (HWND)0; return 0; case UM_SETUP: { char *rootname = "SwapMon"; switch(WinQueryWindowUShort(hwnd,QWS_ID)) { case SWAP_FRAME: SwapHwnd = hwnd; swaptick = 0; break; case CLOCK_FRAME: ClockHwnd = hwnd; rootname = "Clock"; break; case TSK_FRAME: TaskHwnd = hwnd; rootname = "Task"; break; case MEM_FRAME: MemHwnd = hwnd; rootname = "Mem"; break; case HARD_FRAME: HardHwnd = hwnd; rootname = "Hard"; break; case CPU_FRAME: CPUHwnd = hwnd; rootname = "CPU"; PostMsg(hwnd, UM_REFRESH, MPVOID, MPFROMSHORT(TRUE)); break; case CLP_FRAME: ClipMonHwnd = hwnd; rootname = "ClipMon"; PostMsg(hwnd, UM_REFRESH, MPVOID, MPFROMSHORT(TRUE)); break; } if(!RestorePresParams(hwnd,rootname)) SetPresParams(hwnd, RGB_WHITE, RGB_BLACK, RGB_BLACK, helvtext); } PostMsg(hwnd, UM_TIMER, MPVOID, MPVOID); return 0; case UM_REFRESH: switch(WinQueryWindowUShort(hwnd,QWS_ID)) { case CLP_FRAME: { char s[] = " Clip: [TtBbMmP] + ",*p; ULONG fmt[] = {CF_TEXT,CF_DSPTEXT, CF_BITMAP,CF_DSPBITMAP, CF_METAFILE,CF_DSPMETAFILE, CF_PALETTE,0}; ULONG x,ret; if(WinOpenClipbrd(WinQueryAnchorBlock(hwnd))) { p = s + 8; for(x = 0;fmt[x];x++) { ret = WinQueryClipbrdData(WinQueryAnchorBlock(hwnd), fmt[x]); if(!ret) *p = '-'; p++; } p += 2; if(!fClipAppend) *p = 0; WinCloseClipbrd(WinQueryAnchorBlock(hwnd)); } else strcpy(s + 7, "Can't open. "); SetMonitorSize(hwnd, hwndMenu, &swpClip, s); } break; case CPU_FRAME: { char s[32]; ULONG percent,lastaverage; static BOOL lastavgset = 0; *s = 0; if(mp2) { strcpy(s," CPU: -% "); if(fAverage) strcat(s,"Avg: -%) "); } else { percent = ((MaxCount - (ULONG)mp1) * 100) / MaxCount; lastaverage = AveCPU; AveCPU = (((AveCPU * NumAveCPU) + percent) / ((ULONG)NumAveCPU + 1)); NumAveCPU++; if(!NumAveCPU) NumAveCPU = 65535; if(percent != LastPercent || (AveCPU != lastaverage && fAverage) || NumAveCPU == 1 || lastavgset != fAverage) { lastavgset = fAverage; LastPercent = percent; sprintf(s, " CPU: %lu%% ", percent); if(fAverage) sprintf(s + strlen(s), "(Avg: %lu%%) ", AveCPU); } } if(*s) SetMonitorSize(hwnd, hwndMenu, &swpCPU, s); } break; } return 0; case WM_TIMER: if(fSwapFloat && !hwndMenu) WinSetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_ZORDER | SWP_SHOW); if(WinQueryWindowUShort(hwnd,QWS_ID) == CLP_FRAME) { if(!ClipHwnd) WinDestroyWindow(hwnd); else TakeClipboard(); } return 0; case UM_TIMER: switch(WinQueryWindowUShort(hwnd,QWS_ID)) { case CLP_FRAME: ClipMonHwnd = hwnd; WinSendMsg(hwnd, WM_TIMER, MPVOID, MPVOID); break; case CPU_FRAME: CPUHwnd = hwnd; WinSendMsg(hwnd, WM_TIMER, MPVOID, MPVOID); break; case HARD_FRAME: { char s[80]; HardHwnd = hwnd; SetDriveText(ulDriveMon, s); SetMonitorSize(hwnd, hwndMenu, &swpHard, s); } break; case SWAP_FRAME: { FILEFINDBUF3 ffb; ULONG nm = 1,fl = SWP_SIZE | SWP_SHOW | SWP_MOVE, sh,sl,nh; HDIR hdir = HDIR_CREATE; FSALLOCATE fsa; char s[128],ss[8],sss[8],mb,smb; static ULONG lastcbFile = 0; static BOOL warned = FALSE; static char SwapperDat[CCHMAXPATH] = ""; strcpy(s, " Unable to locate SWAPPER.DAT. "); SwapHwnd = hwnd; if(!*SwapperDat) FindSwapperDat(SwapperDat); if(*SwapperDat) { DosError(FERR_DISABLEHARDERR); if(!DosFindFirst(SwapperDat, &hdir, FILE_NORMAL | FILE_HIDDEN | FILE_SYSTEM | FILE_ARCHIVED | FILE_READONLY, &ffb, sizeof(ffb), &nm, FIL_STANDARD)) { DosFindClose(hdir); if(ffb.cbFile != lastcbFile && lastcbFile) swaptick = 9; lastcbFile = ffb.cbFile; DosError(FERR_DISABLEHARDERR); if(!DosQueryFSInfo(toupper(*SwapperDat) - '@', FSIL_ALLOC, &fsa, sizeof(FSALLOCATE))) nm = fsa.cUnitAvail * (fsa.cSectorUnit * fsa.cbSector); else nm = 0; if(nm <= 32768 * 1024) { swaptick = 10; if(!warned) { SetPresParams(hwnd, RGB_RED, -1, -1, NULL); warned = TRUE; DosBeep(250,15); } } else if(warned) { PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID); warned = FALSE; } mb = MakeNumber(nm, &nh, &sl); *sss = 0; if(sl) sprintf(sss, ".%02lu", sl); smb = MakeNumber(ffb.cbFile, &sh, &sl); *ss = 0; if(sl) sprintf(ss, ".%02lu", sl); sprintf(s, " Swap: %lu%s%cb ", sh, ss, smb); if(fShowSwapFree) sprintf(s + strlen(s), "(%lu%s%cb free) ", nh, sss, mb); } } SetMonitorSize(hwnd, hwndMenu, &swpSwap, s); } break; case TSK_FRAME: { PROCESSINFO *ppi; BUFFHEADER *pbh = NULL; MODINFO *pmi; long numprocs = -1,numthreads = -1; char s[80]; if(!DosAllocMem((PVOID)&pbh, USHRT_MAX + 4096, PAG_COMMIT | OBJ_TILE | PAG_READ | PAG_WRITE)) { if(!DosQProcStatus(pbh, USHRT_MAX)) { numprocs = numthreads = 0; ppi = pbh->ppi; while(ppi->ulEndIndicator != PROCESS_END_INDICATOR ) { pmi = pbh->pmi; while(pmi && ppi->hModRef != pmi->hMod) pmi = pmi->pNext; if(pmi) { numprocs++; numthreads += ppi->usThreadCount; } ppi = (PPROCESSINFO)(ppi->ptiFirst + ppi->usThreadCount); } } DosFreeMem(pbh); sprintf(s, " Procs: %ld Thrds: %ld ", numprocs, numthreads); SetMonitorSize(hwnd, hwndMenu, &swpTask, s); } } break; case MEM_FRAME: { ULONG sh,sl,nh,amem; char s[128],ss[8],sss[8],mb,smb; strcpy(s, "Can't check virtual memory."); MemHwnd = hwnd; if(!DosQuerySysInfo(QSV_TOTAVAILMEM, QSV_TOTAVAILMEM, &amem, sizeof(amem))) { mb = MakeNumber(amem, &nh, &sl); *ss = 0; if(sl) sprintf(ss, ".%02lu", sl); sprintf(s, " VMem: %lu%s%cb ", nh, ss, mb); } if(fShowPMem) { if(!Dos16MemAvail(&amem)) { mb = MakeNumber(amem, &nh, &sl); *ss = 0; if(sl) sprintf(ss, ".%02lu", sl); sprintf(s + strlen(s), " PMem: %lu%s%cb ", nh, ss, mb); } } SetMonitorSize(hwnd, hwndMenu, &swpMem, s); } break; case CLOCK_FRAME: { char s[80]; DATETIME dt; ClockHwnd = hwnd; if(!DosGetDateTime(&dt)) { sprintf(s, " %0*u:%02u%s ", ((ampm) ? 0 : 2), (dt.hours % ((ampm) ? 12 : 24)) + ((ampm && !(dt.hours % 12)) ? 12 : 0), dt.minutes, ((ampm) ? (dt.hours > 11) ? "pm" : "am" : "")); if(showdate) sprintf(s + strlen(s), "%02u/%02u ", dt.month, dt.day); } else strcpy(s,"Unknown time"); SetMonitorSize(hwnd, hwndMenu, &swpClock, s); } break; } return 0; case WM_COMMAND: { BOOL ctrl,shift; ctrl = ((WinGetKeyState(HWND_DESKTOP,VK_CTRL) & 0x8000) != 0); shift = ((WinGetKeyState(HWND_DESKTOP,VK_SHIFT) & 0x8000) != 0); switch(SHORT1FROMMP(mp1)) { case CLP_CLEAR: if(WinOpenClipbrd(WinQueryAnchorBlock(hwnd))) { WinEmptyClipbrd(WinQueryAnchorBlock(hwnd)); WinCloseClipbrd(WinQueryAnchorBlock(hwnd)); PostMsg(hwnd, UM_REFRESH, MPVOID, MPVOID); } break; case CLP_APPEND: fClipAppend = (fClipAppend) ? FALSE : TRUE; SavePrf("ClipAppend", &fClipAppend, sizeof(BOOL)); PostMsg(hwnd, UM_REFRESH, MPVOID, MPVOID); if(ClipSetHwnd) PostMsg(ClipSetHwnd, UM_REFRESH, MPVOID, MPVOID); break; case MSE_HELP: ViewHelp(hwnd, "Monitors page"); break; case CPU_PULSE: { PROGDETAILS pgd; WinSetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE | SWP_FOCUSACTIVATE); memset(&pgd, 0, sizeof(pgd)); pgd.Length = sizeof(pgd); pgd.swpInitial.fl = SWP_ACTIVATE | SWP_ZORDER; pgd.swpInitial.hwndInsertBehind = HWND_TOP; pgd.progt.fbVisible = SHE_VISIBLE; pgd.progt.progc = PROG_DEFAULT; pgd.pszExecutable = "PULSE.EXE"; if(WinStartApp(CPUHwnd, &pgd, NULL, NULL, 0)) { if(CPUHwnd) { closethreads = 1; DosSleep(1); PostMsg(CPUHwnd, UM_REFRESH, MPVOID, MPFROMSHORT(TRUE)); } } } break; case CPU_RESET: AveCPU = 0; NumAveCPU = 0; break; case CLOCK_VIRTUAL: case CLOCK_SWITCHLIST: case CLOCK_CMDLINE: case CLOCK_CLIPBOARD: case CLOCK_CALCULATOR: case HARD_FM2: case MSE_FRAME: { ULONG msg2 = UM_SHOWME; MPARAM mp12 = 0,mp22 = 0; HWND hwndP = hwndConfig; switch(SHORT1FROMMP(mp1)) { case CLOCK_CMDLINE: mp12 = MPFROMLONG(((WinGetKeyState(HWND_DESKTOP,VK_CTRL) & 0x8000) != 0)); msg2 = UM_CMDLINE; break; case CLOCK_CLIPBOARD: msg2 = UM_CLIPMGR; hwndP = ObjectHwnd3; break; case CLOCK_SWITCHLIST: msg2 = UM_SWITCHLIST; break; case CLOCK_VIRTUAL: msg2 = UM_VIRTUAL; break; case CLOCK_CALCULATOR: msg2 = UM_CALC; break; case HARD_FM2: msg2 = UM_STARTWIN; mp12 = MPFROM2SHORT(C_STARTFM2,0); break; } PostMsg(hwndP, msg2, mp12, mp22); } break; case CLOCK_SETTINGS: case CLOCK_CLOCK: case SWAP_LAUNCHPAD: case SWAP_WARPCENTER: case SWAP_CONNECTIONS: case SWAP_INFO: case SWAP_SETTINGS: case SWAP_SYSTEM: case SWAP_TEMPS: case SWAP_FM2: case HARD_OPEN: case CVR_COLORPALETTE: case CVR_HICOLORPALETTE: case CVR_FONTPALETTE: case CPU_KILLPROC: case CPU_HARDWARE: { char *p = "<WP_CLOCK>",*pp = defopen; char s[8]; switch(SHORT1FROMMP(mp1)) { case HARD_OPEN: sprintf(s, "%c:\\", (char)(ulDriveMon + '@')); p = s; break; case SWAP_FM2: p = "<FM3_Folder>"; break; case SWAP_TEMPS: p = "<WP_TEMPS>"; break; case SWAP_SYSTEM: p = "<WP_OS2SYS>"; break; case SWAP_SETTINGS: p = "<WP_CONFIG>"; break; case SWAP_INFO: p = "<WP_INFO>"; break; case SWAP_CONNECTIONS: p = "<WP_CONNECTIONSFOLDER>"; break; case SWAP_WARPCENTER: p = "<WP_WARPCENTER>"; break; case SWAP_LAUNCHPAD: p = "<WP_LAUNCHPAD>"; break; case CLOCK_SETTINGS: pp = setopen; break; case CVR_COLORPALETTE: p = "<WP_LORESCLRPAL>"; break; case CVR_HICOLORPALETTE: p = "<WP_HIRESCLRPAL>"; break; case CVR_FONTPALETTE: p = "<WP_FNTPAL>"; break; case CPU_KILLPROC: p = "<FM/2_KILLPROC>"; break; case CPU_HARDWARE: p = "<WP_HWMGR>"; break; } OpenObject(p, pp); } break; case HARD_VDIR: { PROGDETAILS pgd; char s[36]; sprintf(s, "/C VDIR.CMD %c:\\", (char)(ulDriveMon + '@')); memset(&pgd, 0, sizeof(pgd)); pgd.Length = sizeof(pgd); pgd.swpInitial.fl = SWP_MINIMIZE | SWP_ACTIVATE | SWP_ZORDER; pgd.swpInitial.hwndInsertBehind = HWND_TOP; pgd.progt.fbVisible = SHE_VISIBLE; pgd.progt.progc = PROG_DEFAULT; pgd.pszExecutable = "CMD.EXE"; WinStartApp((HWND)0, &pgd, s, NULL, 0); } break; case HARD_CHKDSK: { PROGDETAILS pgd; char s[8]; WinSetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE | SWP_FOCUSACTIVATE); sprintf(s, "%c:", (char)(ulDriveMon + '@')); memset(&pgd, 0, sizeof(pgd)); pgd.Length = sizeof(pgd); pgd.swpInitial.fl = SWP_ACTIVATE | SWP_ZORDER; pgd.swpInitial.hwndInsertBehind = HWND_TOP; pgd.progt.fbVisible = SHE_VISIBLE; pgd.progt.progc = PROG_DEFAULT; pgd.pszExecutable = "PMCHKDSK.EXE"; WinStartApp((HWND)0, &pgd, s, NULL, 0); } break; default: if(SHORT1FROMMP(mp1) >= HARD_C && SHORT1FROMMP(mp1) <= HARD_C + 24) { ulDriveMon = (SHORT1FROMMP(mp1) - HARD_C) + 3; PostMsg(hwnd, UM_TIMER, MPVOID, MPVOID); if(ctrl) PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(HARD_OPEN,0), MPVOID); else if(shift) PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(HARD_VDIR,0), MPVOID); } break; } } return 0; case WM_DESTROY: switch(WinQueryWindowUShort(hwnd,QWS_ID)) { case SWAP_FRAME: SwapHwnd = (HWND)0; break; case CLOCK_FRAME: ClockHwnd = (HWND)0; break; case HARD_FRAME: HardHwnd = (HWND)0; break; case CPU_FRAME: closethreads = 1; DosSleep(1); CPUHwnd = (HWND)0; break; case CLP_FRAME: ClipMonHwnd = (HWND)0; break; case MEM_FRAME: MemHwnd = (HWND)0; break; case TSK_FRAME: TaskHwnd = (HWND)0; break; } break; } return PFNWPStatic(hwnd,msg,mp1,mp2); }
MRESULT EXPENTRY ChangeCurDirWndProc(HWND hDlg, ULONG Msg, MPARAM mp1, MPARAM mp2) { SHORT DriveId, DirId; CHAR HlpStr[CCHMAXPATH]; ULONG DriveMap; ULONG PathLen; APIRET rc; switch (Msg) { case WM_INITDLG: /*--- save current drive/dir ---*/ PathLen = CCHMAXPATH; if (DosQCurDisk(&SaveCurDisk, &DriveMap) || DosQCurDir(SaveCurDisk, (PUCHAR)SaveCurDir, &PathLen)) { DosBeep(1000, 1000); WinDismissDlg(hDlg, FALSE); break; } if (PathLen == 0) strcpy(SaveCurDir, "\\"); else { memmove(&SaveCurDir[1], SaveCurDir, strlen(SaveCurDir) + 1); SaveCurDir[0] = '\\'; } WinSendDlgItemMsg(hDlg, TID_CD_PATH, EM_SETTEXTLIMIT, MPFROMSHORT(CCHMAXPATH), 0L); if (_FillDriveLb(hDlg)) { DosBeep(1000, 1000); WinDismissDlg(hDlg, FALSE); break; } CenterDialog(hWndFrame, hDlg); WinSetFocus(HWND_DESKTOP, WinWindowFromID(hDlg, LID_CD_DIRS)); return ((MRESULT) TRUE); break; case WM_CONTROL: switch (SHORT1FROMMP(mp1)) { case LID_CD_DRIVES: if (SHORT2FROMMP(mp1) == LN_ENTER) { DriveId = SHORT1FROMMR(WinSendMsg(WinWindowFromID(hDlg, LID_CD_DRIVES), LM_QUERYSELECTION, MPFROMSHORT(LIT_FIRST), NULL)); WinSendMsg(WinWindowFromID(hDlg, LID_CD_DRIVES), LM_QUERYITEMTEXT, MPFROM2SHORT(DriveId, CCHMAXPATH), MPFROMP(HlpStr)); SelectedDrive = (USHORT) HlpStr[1] - 64; DosSelectDisk(SelectedDrive); _FillDirLb(hDlg, SelectedDrive); } break; case LID_CD_DIRS: if (SHORT2FROMMP(mp1) == LN_ENTER) { DirId = SHORT1FROMMR(WinSendMsg(WinWindowFromID(hDlg, LID_CD_DIRS), LM_QUERYSELECTION, MPFROMSHORT(LIT_FIRST), NULL)); WinSendMsg(WinWindowFromID(hDlg, LID_CD_DIRS), LM_QUERYITEMTEXT, MPFROM2SHORT(DirId, CCHMAXPATH), MPFROMP(HlpStr)); if (strncmp(HlpStr, " <root", 6) == 0) strcpy(HlpStr, "\\"); if (DosChDir(HlpStr)) DosBeep(1000, 1000); _FillDirLb(hDlg, SelectedDrive); } break; } break; case WM_COMMAND: switch (SHORT1FROMMP(mp1)) { case DID_OK: if (FileSelected) { rc = WinMessageBox(HWND_DESKTOP, hDlg, "Refresh tree window?", ApplTitle, 0, MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL); if (rc == MBID_YES) WinPostMsg(hWndClient, WUM_START_REBUILD, 0L, 0L); else WinInvalidateRect(hWndClient, NULL, FALSE); } else WinInvalidateRect(hWndClient, NULL, FALSE); WinDismissDlg(hDlg, TRUE); break; case DID_CANCEL: if (DosSelectDisk(SaveCurDisk) || DosChDir(SaveCurDir)) DosBeep(1000, 1000); WinInvalidateRect(hWndClient, NULL, FALSE); WinDismissDlg(hDlg, FALSE); break; } break; default: return WinDefDlgProc(hDlg, Msg, mp1, mp2); break; } return NULL; }