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.
507 lines
12 KiB
507 lines
12 KiB
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
os2vm.c
|
|
|
|
Abstract:
|
|
|
|
This is a test OS/2 application to test the Virtual Memory component of OS/2
|
|
|
|
Author:
|
|
|
|
Steve Wood (stevewo) 22-Aug-1989
|
|
|
|
Environment:
|
|
|
|
User Mode Only
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#define OS2_API32
|
|
#define INCL_OS2V20_ERRORS
|
|
#define INCL_OS2V20_TASKING
|
|
#define INCL_OS2V20_MEMORY
|
|
#include <os2.h>
|
|
|
|
PPIB Pib;
|
|
PNT_TIB NtTib;
|
|
PSZ ImageFileName;
|
|
|
|
PSZ
|
|
DumpPib(
|
|
PPIB Pib,
|
|
int argc,
|
|
char *argv[],
|
|
char *envp[]
|
|
);
|
|
|
|
VOID
|
|
TestMemory( VOID );
|
|
|
|
VOID
|
|
ExitRoutine(
|
|
ULONG ExitReason
|
|
);
|
|
|
|
VOID
|
|
TestThread(
|
|
IN PCH ThreadName
|
|
);
|
|
|
|
int
|
|
main(
|
|
int argc,
|
|
char *argv[],
|
|
char *envp[]
|
|
)
|
|
{
|
|
APIRET rc;
|
|
|
|
DbgPrint( "*** Entering OS/2 Virtual Memory Test Application\n" );
|
|
|
|
rc = DosGetThreadInfo( &NtTib, &Pib );
|
|
|
|
DumpPib( Pib, argc, argv, envp );
|
|
|
|
rc = DosExitList( EXLST_ADD | 0x3000, ExitRoutine );
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosExitList(EXLST_ADD) failed - rc == %lX\n",
|
|
rc
|
|
);
|
|
}
|
|
|
|
TestMemory();
|
|
|
|
DbgPrint( "*** Exiting OS/2 Virtual Memory Test Application\n" );
|
|
return( 0 );
|
|
}
|
|
|
|
VOID
|
|
ExitRoutine(
|
|
ULONG ExitReason
|
|
)
|
|
{
|
|
DbgPrint( "*** ExitRoutine( %lX ) called\n", ExitReason );
|
|
DosExitList( EXLST_EXIT, NULL );
|
|
}
|
|
|
|
VOID
|
|
TestThread(
|
|
IN PCH ThreadName
|
|
)
|
|
{
|
|
APIRET rc;
|
|
PPIB Pib;
|
|
PNT_TIB NtTib;
|
|
|
|
DbgPrint( "*** Entering OS/2 Thread %s\n", ThreadName );
|
|
|
|
rc = DosGetThreadInfo( &NtTib, &Pib );
|
|
|
|
DbgPrint( "*** Leaveing OS/2 Thread %s\n", ThreadName );
|
|
}
|
|
|
|
|
|
VOID
|
|
CloneTest( VOID );
|
|
|
|
BOOLEAN
|
|
IsClonedTest( VOID );
|
|
|
|
VOID
|
|
CloneTest( VOID )
|
|
{
|
|
PPIB Pib;
|
|
PNT_TIB NtTib;
|
|
APIRET rc;
|
|
PCH src, Variables, ImageFileName, CommandLine;
|
|
CHAR ErrorBuffer[ 32 ];
|
|
RESULTCODES ResultCodes;
|
|
|
|
rc = DosGetThreadInfo( &NtTib, &Pib );
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosGetThreadInfo failed - rc == %ld\n", rc );
|
|
return;
|
|
}
|
|
|
|
src = Pib->Environment;
|
|
Variables = src;
|
|
while (*src) {
|
|
while (*src) {
|
|
src++;
|
|
}
|
|
src++;
|
|
}
|
|
src++;
|
|
ImageFileName = src;
|
|
CommandLine = "CLONETEST\000";
|
|
rc = DosExecPgm( ErrorBuffer,
|
|
sizeof( ErrorBuffer ),
|
|
EXEC_SYNC,
|
|
CommandLine,
|
|
Variables,
|
|
&ResultCodes,
|
|
ImageFileName
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosExecPgm( %s, %s failed - rc == %ld\n",
|
|
ImageFileName, CommandLine, rc
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
BOOLEAN
|
|
IsClonedTest( VOID )
|
|
{
|
|
PPIB Pib;
|
|
PNT_TIB NtTib;
|
|
APIRET rc;
|
|
|
|
rc = DosGetThreadInfo( &NtTib, &Pib );
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosGetThreadInfo failed - rc == %ld\n", rc );
|
|
return( FALSE );
|
|
}
|
|
|
|
if (!strcmp( Pib->CommandLine, "CLONETEST" )) {
|
|
return( TRUE );
|
|
}
|
|
else {
|
|
return( FALSE );
|
|
}
|
|
}
|
|
|
|
|
|
PSZ MemoryNames[ 8 ] = {
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
"\\SHAREMEM\\Shared\\Memory\\1",
|
|
"\\sharemem\\Shared\\Memory\\2",
|
|
NULL,
|
|
NULL
|
|
};
|
|
|
|
ULONG MemoryFlags[ 8 ] = {
|
|
PAG_READ,
|
|
PAG_READ | PAG_WRITE,
|
|
PAG_COMMIT | PAG_READ,
|
|
PAG_COMMIT | PAG_READ | PAG_WRITE,
|
|
PAG_READ,
|
|
PAG_READ | PAG_WRITE,
|
|
PAG_COMMIT | PAG_READ | OBJ_GIVEABLE | OBJ_GETTABLE,
|
|
PAG_COMMIT | PAG_READ | PAG_WRITE | OBJ_GIVEABLE | OBJ_GETTABLE,
|
|
};
|
|
|
|
PSZ BadMemoryNames[] = {
|
|
"\\SHAREMEM\\a\\",
|
|
#ifdef MIPS
|
|
NULL
|
|
#else
|
|
"\\SHAREMEM\\a/",
|
|
// 123456789012345678901234567890123456789012345678901234567890
|
|
"\\SHAREMEM\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
|
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
|
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
|
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
|
|
aaaaaaaaaaaaaaaaaaa", // 259 bytes long
|
|
"\\SHAREMEM\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
|
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
|
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
|
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
|
|
aaaaaaaaaaaaaaaaaaaa", // 260 bytes long
|
|
"\\SHAREMEM\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
|
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
|
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
|
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
|
|
aaaaaaaaaaaaaaaaaaaaa", // 261 bytes long
|
|
"\\SHAREMEM\\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
|
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
|
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
|
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\
|
|
aaaaaaaaaaaaaaaaaaaaaa", // 262 bytes long
|
|
NULL
|
|
#endif // MIPS
|
|
};
|
|
|
|
VOID
|
|
TestMemory( VOID )
|
|
{
|
|
APIRET rc;
|
|
PVOID BaseAddress[ 8 ];
|
|
ULONG PostCount;
|
|
int i, j;
|
|
PCH s, s1;
|
|
ULONG cb;
|
|
PULONG p;
|
|
|
|
s = "\\sharemem\\a";
|
|
cb = 4*1024;
|
|
|
|
if (IsClonedTest()) {
|
|
rc = DosGetNamedSharedMem( &BaseAddress[ 0 ],
|
|
s,
|
|
PAG_READ
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosGetNamedSharedMem( %s ) failed - rc == %ld\n",
|
|
s, rc
|
|
);
|
|
}
|
|
else {
|
|
p = (PULONG)BaseAddress[ 0 ];
|
|
for (i=0; i<(cb / sizeof( ULONG )); i++ ) {
|
|
if (*p != i) {
|
|
DbgPrint( "*** @%lX == %lX != %lX\n", p, *p, i );
|
|
break;
|
|
}
|
|
|
|
p++;
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
for (i=0; s1=BadMemoryNames[i]; i++) {
|
|
rc = DosAllocSharedMem( &BaseAddress[ 0 ],
|
|
s1,
|
|
0x1000,
|
|
PAG_COMMIT | PAG_READ | PAG_WRITE
|
|
);
|
|
if (rc == NO_ERROR && strlen( s1 ) <= CCHMAXPATH) {
|
|
DosFreeMem( BaseAddress[ 0 ] );
|
|
}
|
|
else
|
|
if (rc != ERROR_INVALID_NAME) {
|
|
DbgPrint( "*** DosAllocSharedMem( %s ) returned incorrect rc == %ld\n",
|
|
s1, rc
|
|
);
|
|
|
|
if (rc == NO_ERROR) {
|
|
DosFreeMem( BaseAddress[ 0 ] );
|
|
}
|
|
}
|
|
}
|
|
|
|
rc = DosAllocSharedMem( &BaseAddress[ 0 ],
|
|
s,
|
|
cb,
|
|
PAG_READ
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosAllocSharedMem( %s, %ld ) failed - rc == %ld\n",
|
|
s, cb, rc
|
|
);
|
|
return;
|
|
}
|
|
|
|
rc = DosGiveSharedMem( BaseAddress[ 0 ], Pib->ProcessId, PAG_WRITE );
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosGiveSharedMem( %X, PAG_WRITE ) failed - rc == %ld\n",
|
|
BaseAddress[ 0 ], rc
|
|
);
|
|
return;
|
|
}
|
|
|
|
rc = DosSetMem( BaseAddress[ 0 ], cb, PAG_DEFAULT | PAG_COMMIT );
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosSetMem( %X, PAG_DEFAULT | PAG_COMMIT ) failed - rc == %ld\n",
|
|
BaseAddress[ 0 ], rc
|
|
);
|
|
return;
|
|
}
|
|
|
|
p = (PULONG)BaseAddress[ 0 ];
|
|
for (i=0; i<(cb / sizeof( ULONG )); i++ ) {
|
|
try {
|
|
*p++ = i;
|
|
}
|
|
except( EXCEPTION_EXECUTE_HANDLER ) {
|
|
DbgPrint( "*** [%X] = %d - failed, Status = %X\n",
|
|
p, i, GetExceptionCode()
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
|
|
CloneTest();
|
|
|
|
DosFreeMem( BaseAddress[ 0 ] );
|
|
rc = DosAllocSharedMem( &BaseAddress[ 0 ],
|
|
s,
|
|
cb,
|
|
PAG_COMMIT | PAG_READ | PAG_WRITE
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** 2nd DosAllocSharedMem( %s, %ld ) failed - rc == %ld\n",
|
|
s, cb, rc
|
|
);
|
|
}
|
|
|
|
for (i=0; i<8; i++) {
|
|
if (i < 4) {
|
|
rc = DosAllocMem( &BaseAddress[i],
|
|
64*1024,
|
|
MemoryFlags[i]
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosAllocMem( %ld ) failed - rc == %lX\n",
|
|
64*1024, rc
|
|
);
|
|
BaseAddress[i] = (PVOID)0;
|
|
}
|
|
else {
|
|
DbgPrint( "*** DosAllocMem( %ld ) success - Address == %lX\n",
|
|
64*1024, BaseAddress[i]
|
|
);
|
|
}
|
|
}
|
|
else {
|
|
rc = DosAllocSharedMem( &BaseAddress[i],
|
|
MemoryNames[i],
|
|
64*1024,
|
|
MemoryFlags[i]
|
|
);
|
|
if (rc != NO_ERROR) {
|
|
DbgPrint( "*** DosAllocSharedMem( %s, %ld ) failed - rc == %lX\n",
|
|
MemoryNames[i] ? MemoryNames[i] : "shared",
|
|
64*1024
|
|
);
|
|
BaseAddress[i] = (PVOID)0;
|
|
}
|
|
else {
|
|
DbgPrint( "*** DosAllocSharedMem( %s, %ld ) success - Address == %lX\n",
|
|
MemoryNames[i] ? MemoryNames[i] : "shared",
|
|
64*1024,
|
|
BaseAddress[i]
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
PSZ
|
|
DumpPib(
|
|
PPIB Pib,
|
|
int argc,
|
|
char *argv[],
|
|
char *envp[]
|
|
)
|
|
{
|
|
ULONG i;
|
|
PUCHAR src, dst;
|
|
PSZ VariableName, VariableValue, PathVariableValue, RestoreEqualChar;
|
|
|
|
DbgPrint( " OS/2 Process Information Block (PIB) at %lX\n", Pib );
|
|
DbgPrint( " ProcessId: %lX\n", Pib->ProcessId );
|
|
DbgPrint( " ParentProcessId: %lX\n", Pib->ParentProcessId );
|
|
DbgPrint( " ImageFileHandle: %lX\n", Pib->ImageFileHandle );
|
|
DbgPrint( " CommandLine: %lX\n", Pib->CommandLine );
|
|
DbgPrint( " Environment: %lX\n", Pib->Environment );
|
|
DbgPrint( " Status: %lX\n", Pib->Status );
|
|
DbgPrint( " Type: %lX\n", Pib->Type );
|
|
|
|
PathVariableValue = NULL;
|
|
|
|
i = 0;
|
|
src = Pib->Environment;
|
|
while (*src) {
|
|
VariableName = src;
|
|
VariableValue = "(*** undefined ***)";
|
|
RestoreEqualChar = NULL;
|
|
while (*src) {
|
|
if (*src == '=') {
|
|
RestoreEqualChar = src;
|
|
*src++ = '\0';
|
|
if (!_stricmp( VariableName, "PATH" )) {
|
|
PathVariableValue = src;
|
|
}
|
|
VariableValue = src;
|
|
while (*src) {
|
|
if (*src < ' ' || *src > 0x7F) {
|
|
VariableValue = "(*** unprintable value ***)";
|
|
}
|
|
|
|
src++;
|
|
}
|
|
|
|
break;
|
|
}
|
|
else {
|
|
if (*src < ' ' || *src > 0x7F) {
|
|
VariableName = "(*** unprintable name ***)";
|
|
}
|
|
|
|
src++;
|
|
}
|
|
}
|
|
|
|
DbgPrint( " Env[ %ld ] - %s = %s\n",
|
|
i,
|
|
VariableName,
|
|
VariableValue
|
|
);
|
|
i++;
|
|
src++;
|
|
if (RestoreEqualChar) {
|
|
*RestoreEqualChar = '=';
|
|
}
|
|
}
|
|
src++;
|
|
|
|
ImageFileName = src;
|
|
DbgPrint( " ImagePathName: %s\n", ImageFileName );
|
|
while (*src) {
|
|
src++;
|
|
}
|
|
src++;
|
|
|
|
if (src != Pib->CommandLine) {
|
|
DbgPrint( " CommandLine at %lX, not %lX\n",
|
|
src,
|
|
Pib->CommandLine
|
|
);
|
|
}
|
|
|
|
i = 0;
|
|
while (*src) {
|
|
VariableValue = src;
|
|
while (*src) {
|
|
if (*src < ' ' || *src > 0x7F) {
|
|
VariableValue = "(*** unprintable argument ***)";
|
|
}
|
|
src++;
|
|
}
|
|
|
|
DbgPrint( " Arg[ %ld ] - %s\n", i, VariableValue );
|
|
i++;
|
|
src++;
|
|
}
|
|
|
|
DbgPrint( " C Runtime parameters passed to main()\n" );
|
|
DbgPrint( " argc: %d\n", argc );
|
|
i = 0;
|
|
while (argc--) {
|
|
DbgPrint( " argv[ %d ]: %s\n", i, *argv );
|
|
i++;
|
|
argv++;
|
|
}
|
|
|
|
i = 0;
|
|
while (src = *envp++) {
|
|
DbgPrint( " envp[ %d ]: %s\n", i, *envp );
|
|
i++;
|
|
envp++;
|
|
}
|
|
|
|
return( PathVariableValue );
|
|
}
|