mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
334 lines
6.8 KiB
334 lines
6.8 KiB
/*
|
|
* Module Name: WSFSLIB.C
|
|
*
|
|
* Library/DLL: Common library functions for handling working set tuner files.
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
* Library routines called by the working set tuner programs to open and
|
|
* read working set tuner files. These functions may be useful to ISVs, etc.,
|
|
*
|
|
* This is an OS/2 2.x specific file
|
|
*
|
|
* IBM/Microsoft Confidential
|
|
*
|
|
* Copyright (c) IBM Corporation 1987, 1989
|
|
* Copyright (c) Microsoft Corporation 1987, 1989
|
|
*
|
|
* All Rights Reserved
|
|
*
|
|
* Modification History:
|
|
*
|
|
* 03/26/90 - created
|
|
*
|
|
*/
|
|
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <windows.h>
|
|
#include <time.h>
|
|
#include <wserror.h>
|
|
#include <wsdata.h>
|
|
#include <wsfslib.h>
|
|
|
|
#define MAXLINE 128
|
|
|
|
|
|
/*
|
|
* Function declarations and prototypes.
|
|
*/
|
|
|
|
|
|
/*
|
|
*
|
|
***EP WsWSPOpen
|
|
*
|
|
* Effects:
|
|
*
|
|
* Opens a WSP file, and reads and validates the file header.
|
|
*
|
|
* Returns:
|
|
*
|
|
* Returns 0. If an error is encountered, exits with ERROR via an
|
|
* indirect call through pfnExit.
|
|
*/
|
|
|
|
USHORT FAR PASCAL
|
|
WsWSPOpen( PSZ pszFileName, FILE **phFile, PFN pfnExit, wsphdr_t *pWspHdr,
|
|
INT iExitCode)
|
|
{
|
|
ULONG rc = NO_ERROR;
|
|
INT iRet = 0;
|
|
ULONG cbRead = 0;
|
|
size_t stRead = 0;
|
|
|
|
/* Open module's input WSP file. */
|
|
|
|
if ((*phFile = fopen(pszFileName, "rb")) == NULL)
|
|
{
|
|
iRet = (*pfnExit)(iExitCode, PRINT_MSG, MSG_FILE_OPEN, rc,
|
|
pszFileName);
|
|
return(iRet);
|
|
}
|
|
|
|
|
|
|
|
/* Read WSP file header. */
|
|
stRead = fread((PVOID) pWspHdr, (ULONG) sizeof(*pWspHdr),1, *phFile);
|
|
if(!stRead)
|
|
{
|
|
iRet = (*pfnExit)(ERROR, PRINT_MSG, MSG_FILE_OPEN, rc,
|
|
pszFileName);
|
|
return(iRet);
|
|
}
|
|
|
|
|
|
/* Read module pathname (directly follows file header). */
|
|
|
|
#ifdef DEBUG
|
|
printf("WspHdr (%s): ulTime 0x%lx, ulSnaps 0x%lx, OffBits 0x%lx\n",
|
|
szModPath, pWspHdr->wsphdr_ulTimeStamp,
|
|
pWspHdr->wsphdr_ulSnaps, pWspHdr->wsphdr_ulOffBits);
|
|
#endif /* DEBUG */
|
|
|
|
/* Validate the WSP file header. */
|
|
if (_strcmpi(pWspHdr->wsphdr_chSignature, "WSP"))
|
|
(*pfnExit)(ERROR, PRINT_MSG, MSG_FILE_BAD_HDR, (ULONG)-1, pszFileName);
|
|
|
|
return(NO_ERROR);
|
|
}
|
|
|
|
|
|
/*
|
|
*
|
|
***EP WsTMIOpen
|
|
*
|
|
* Effects:
|
|
*
|
|
* Opens a TMI file, and reads and validates the file header.
|
|
*
|
|
* Returns:
|
|
*
|
|
* Returns the number of records in the TMI file. If an error is
|
|
* encountered, exits with ERROR via an indirect call through pfnExit.
|
|
*/
|
|
|
|
ULONG FAR PASCAL
|
|
WsTMIOpen( PSZ pszFileName, FILE **phFile, PFN pfnExit, USHORT usId, PCHAR pch)
|
|
{
|
|
//ULONG ulTmp;
|
|
ULONG rc = NO_ERROR;
|
|
ULONG cbRead = 0;
|
|
ULONG cFxns = 0;
|
|
CHAR szLineTMI[MAXLINE]; // Line from TMI file
|
|
CHAR szTDFID[8]; // TDF Identifier string
|
|
ULONG ulTDFID = 0; // TDF Identifier
|
|
|
|
/* Open TMI file (contains function names, etc., in ASCII). */
|
|
|
|
if ((*phFile = fopen(pszFileName, "rt")) == NULL)
|
|
{
|
|
(*pfnExit)(NOEXIT, PRINT_MSG, MSG_FILE_OPEN, rc,
|
|
pszFileName);
|
|
return(MSG_FILE_OPEN);
|
|
}
|
|
|
|
/* Validate TMI file. */
|
|
if (fgets(szLineTMI, MAXLINE, *phFile) == NULL){
|
|
(*pfnExit)(ERROR, PRINT_MSG, MSG_FILE_READ, rc,
|
|
pszFileName);
|
|
}
|
|
// # fxns
|
|
if (fgets(szLineTMI, MAXLINE, *phFile) == NULL){
|
|
(*pfnExit)(ERROR, PRINT_MSG, MSG_FILE_READ, rc,
|
|
pszFileName);
|
|
}
|
|
szLineTMI[strlen(szLineTMI) - 1] = '\0';
|
|
if (sscanf(szLineTMI,"/* Total Symbols= %u */", &cFxns) != 1){
|
|
(*pfnExit)(ERROR, PRINT_MSG, MSG_FILE_READ, rc,
|
|
pszFileName);
|
|
}
|
|
// MODNAME
|
|
if (fgets(szLineTMI, MAXLINE, *phFile) == NULL)
|
|
(*pfnExit)(ERROR, PRINT_MSG, MSG_FILE_READ, rc,
|
|
pszFileName);
|
|
// MAJOR
|
|
if (fgets(szLineTMI, MAXLINE, *phFile) == NULL)
|
|
(*pfnExit)(ERROR, PRINT_MSG, MSG_FILE_READ, rc,
|
|
pszFileName);
|
|
// TDFID
|
|
if (fgets(szLineTMI, MAXLINE, *phFile) == NULL)
|
|
(*pfnExit)(ERROR, PRINT_MSG, MSG_FILE_READ, rc,
|
|
pszFileName);
|
|
if (sscanf(szLineTMI, "TDFID = %s", szTDFID) != 1)
|
|
(*pfnExit)(ERROR, PRINT_MSG, MSG_FILE_READ, rc,
|
|
pszFileName);
|
|
ulTDFID = strtoul(szTDFID, (char **) 0, 0);
|
|
|
|
/* Check identifier field */
|
|
|
|
if (ulTDFID != (ULONG) usId)
|
|
(*pfnExit)(ERROR, PRINT_MSG, MSG_FILE_BAD_HDR, (ULONG)-1,
|
|
pszFileName);
|
|
|
|
return(cFxns);
|
|
}
|
|
|
|
|
|
/*
|
|
*
|
|
***EP WsTMIReadRec
|
|
*
|
|
* Effects:
|
|
*
|
|
* Reads a record from a TMI file, including the variable length function
|
|
* name.
|
|
*
|
|
* Returns:
|
|
*
|
|
* Function size, in bytes, from this record. If an error is
|
|
* encountered, exits with ERROR via an indirect call through pfnExit.
|
|
*/
|
|
|
|
ULONG FAR PASCAL
|
|
WsTMIReadRec( PSZ pszFxnName, PULONG pulFxnIndex, PULONG pulFxnAddr,
|
|
FILE *hFile, PFN pfnExit, PCHAR pch)
|
|
{
|
|
ULONG rc = NO_ERROR;
|
|
ULONG cbRead = 0;
|
|
ULONG cbFxn = 0;
|
|
UINT uiFxnAddrObj; // object portion of function address
|
|
ULONG cbFxnName; // size in bytes of function name
|
|
|
|
// Read in function name, etc.
|
|
|
|
rc = fscanf(hFile, "%ld %x:%lx 0x%lx %d %s\n",
|
|
pulFxnIndex, &uiFxnAddrObj, pulFxnAddr, &cbFxn,
|
|
&cbFxnName, pszFxnName);
|
|
|
|
if (rc != 6)
|
|
(*pfnExit)(ERROR, PRINT_MSG, MSG_FILE_READ, rc, "TMI file");
|
|
|
|
return(cbFxnName);
|
|
}
|
|
|
|
|
|
/*
|
|
*
|
|
***EP WsGetWSDIR
|
|
*
|
|
* Effects:
|
|
*
|
|
* Retrieves the environment variable WSDIR. Concatenates the WSDIR string
|
|
* to the argument string.
|
|
*
|
|
* Returns:
|
|
*
|
|
* Returns zero. As a side effect, concatenates the WSDIR string
|
|
* to the argument string.
|
|
*/
|
|
|
|
USHORT FAR PASCAL
|
|
WsGetWSDIR( PSZ pszWSDIRPath )
|
|
{
|
|
PCHAR pszTmp;
|
|
PCHAR tmp;
|
|
|
|
pszTmp = getenv("WSDIR");
|
|
if (pszTmp == NULL) {
|
|
//printf("WARNING: Environment variable 'WSDIR' not set, assuming '\\'.\n");
|
|
} else {
|
|
if( ( tmp = (PCHAR )malloc( strlen( pszTmp ) + 1 ) ) != NULL ) {
|
|
strcpy( tmp, pszTmp );
|
|
CharToOem( tmp, tmp );
|
|
strcat(pszWSDIRPath, tmp);
|
|
free( tmp );
|
|
} else {
|
|
strcat(pszWSDIRPath, pszTmp);
|
|
}
|
|
}
|
|
strcat(pszWSDIRPath, "\\");
|
|
|
|
return(NO_ERROR);
|
|
|
|
|
|
#if 0
|
|
PCHAR pszTmp;
|
|
|
|
pszTmp = getenv("WSDIR");
|
|
if (pszTmp == NULL);
|
|
//printf("WARNING: Environment variable 'WSDIR' not set, assuming '\\'.\n");
|
|
else
|
|
strcat(pszWSDIRPath, pszTmp);
|
|
strcat(pszWSDIRPath, "\\");
|
|
|
|
return(NO_ERROR);
|
|
#endif
|
|
}
|
|
|
|
LPVOID APIENTRY AllocAndLockMem(DWORD cbMem, HGLOBAL *hMem)
|
|
{
|
|
|
|
//
|
|
// Changed to GHND from GMEM_MOVABLE
|
|
//
|
|
*hMem = GlobalAlloc(GHND, cbMem);
|
|
|
|
if(!*hMem) {
|
|
return(NULL);
|
|
}
|
|
|
|
return(GlobalLock(*hMem));
|
|
}
|
|
|
|
BOOL APIENTRY UnlockAndFreeMem(HGLOBAL hMem)
|
|
{
|
|
BOOL fRet;
|
|
|
|
fRet = GlobalUnlock(hMem);
|
|
if (fRet) {
|
|
return(fRet);
|
|
}
|
|
|
|
if (!GlobalFree(hMem)) {
|
|
return(FALSE);
|
|
}
|
|
|
|
return(TRUE);
|
|
|
|
}
|
|
|
|
void
|
|
ConvertAppToOem( unsigned argc, char* argv[] )
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Converts the command line from ANSI to OEM, and force the app
|
|
to use OEM APIs
|
|
|
|
Arguments:
|
|
|
|
argc - Standard C argument count.
|
|
|
|
argv - Standard C argument strings.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
unsigned i;
|
|
|
|
for( i=0; i<argc; i++ ) {
|
|
CharToOem( argv[i], argv[i] );
|
|
}
|
|
SetFileApisToOEM();
|
|
}
|
|
|
|
|