1514 lines
35 KiB
C
1514 lines
35 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1990 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
old tth.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Test program for Win32 Base File API calls
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Mark Lucovsky (markl) 26-Sep-1990
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include <nt.h>
|
|||
|
#include <ntrtl.h>
|
|||
|
#include <nturtl.h>
|
|||
|
#include <assert.h>
|
|||
|
#include <stdlib.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <windows.h>
|
|||
|
#include <string.h>
|
|||
|
#include <memory.h>
|
|||
|
#include <process.h>
|
|||
|
|
|||
|
#define xassert ASSERT
|
|||
|
int izero;
|
|||
|
int i,j;
|
|||
|
#define BASESPIN 1000000
|
|||
|
|
|||
|
#define NULL_SERVER_SWITCHES 10000
|
|||
|
#define PATH_CONVERSION_TEST 1000
|
|||
|
|
|||
|
//
|
|||
|
// Define local types.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _PERFINFO {
|
|||
|
LARGE_INTEGER StartTime;
|
|||
|
LARGE_INTEGER StopTime;
|
|||
|
ULONG ContextSwitches;
|
|||
|
ULONG FirstLevelFills;
|
|||
|
ULONG SecondLevelFills;
|
|||
|
ULONG SystemCalls;
|
|||
|
PCHAR Title;
|
|||
|
ULONG Iterations;
|
|||
|
} PERFINFO, *PPERFINFO;
|
|||
|
|
|||
|
VOID
|
|||
|
FinishBenchMark (
|
|||
|
IN PPERFINFO PerfInfo
|
|||
|
)
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
ULONG ContextSwitches;
|
|||
|
LARGE_INTEGER Duration;
|
|||
|
ULONG FirstLevelFills;
|
|||
|
ULONG Length;
|
|||
|
ULONG Performance;
|
|||
|
ULONG SecondLevelFills;
|
|||
|
NTSTATUS Status;
|
|||
|
ULONG SystemCalls;
|
|||
|
SYSTEM_PERFORMANCE_INFORMATION SystemInfo;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Print results and announce end of test.
|
|||
|
//
|
|||
|
|
|||
|
NtQuerySystemTime((PLARGE_INTEGER)&PerfInfo->StopTime);
|
|||
|
Status = NtQuerySystemInformation(SystemPerformanceInformation,
|
|||
|
(PVOID)&SystemInfo,
|
|||
|
sizeof(SYSTEM_PERFORMANCE_INFORMATION),
|
|||
|
NULL);
|
|||
|
|
|||
|
if (NT_SUCCESS(Status) == FALSE) {
|
|||
|
printf("Failed to query performance information, status = %lx\n", Status);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
Duration = RtlLargeIntegerSubtract(PerfInfo->StopTime, PerfInfo->StartTime);
|
|||
|
Length = Duration.LowPart / 10000;
|
|||
|
printf(" Test time in milliseconds %d\n", Length);
|
|||
|
printf(" Number of iterations %d\n", PerfInfo->Iterations);
|
|||
|
|
|||
|
Performance = PerfInfo->Iterations * 1000 / Length;
|
|||
|
printf(" Iterations per second %d\n", Performance);
|
|||
|
|
|||
|
ContextSwitches = SystemInfo.ContextSwitches - PerfInfo->ContextSwitches;
|
|||
|
FirstLevelFills = SystemInfo.FirstLevelTbFills - PerfInfo->FirstLevelFills;
|
|||
|
SecondLevelFills = SystemInfo.SecondLevelTbFills - PerfInfo->SecondLevelFills;
|
|||
|
SystemCalls = SystemInfo.SystemCalls - PerfInfo->SystemCalls;
|
|||
|
printf(" First Level TB Fills %d\n", FirstLevelFills);
|
|||
|
printf(" Second Level TB Fills %d\n", SecondLevelFills);
|
|||
|
printf(" Total Context Switches %d\n", ContextSwitches);
|
|||
|
printf(" Number of System Calls %d\n", SystemCalls);
|
|||
|
|
|||
|
printf("*** End of Test ***\n\n");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
StartBenchMark (
|
|||
|
IN PCHAR Title,
|
|||
|
IN ULONG Iterations,
|
|||
|
IN PPERFINFO PerfInfo
|
|||
|
)
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
NTSTATUS Status;
|
|||
|
SYSTEM_PERFORMANCE_INFORMATION SystemInfo;
|
|||
|
|
|||
|
//
|
|||
|
// Announce start of test and the number of iterations.
|
|||
|
//
|
|||
|
|
|||
|
printf("*** Start of test ***\n %s\n", Title);
|
|||
|
PerfInfo->Title = Title;
|
|||
|
PerfInfo->Iterations = Iterations;
|
|||
|
NtQuerySystemTime((PLARGE_INTEGER)&PerfInfo->StartTime);
|
|||
|
Status = NtQuerySystemInformation(SystemPerformanceInformation,
|
|||
|
(PVOID)&SystemInfo,
|
|||
|
sizeof(SYSTEM_PERFORMANCE_INFORMATION),
|
|||
|
NULL);
|
|||
|
|
|||
|
if (NT_SUCCESS(Status) == FALSE) {
|
|||
|
printf("Failed to query performance information, status = %lx\n", Status);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
PerfInfo->ContextSwitches = SystemInfo.ContextSwitches;
|
|||
|
PerfInfo->FirstLevelFills = SystemInfo.FirstLevelTbFills;
|
|||
|
PerfInfo->SecondLevelFills = SystemInfo.SecondLevelTbFills;
|
|||
|
PerfInfo->SystemCalls = SystemInfo.SystemCalls;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
ScrollTest()
|
|||
|
{
|
|||
|
COORD dest,cp;
|
|||
|
SMALL_RECT Sm;
|
|||
|
CHAR_INFO ci;
|
|||
|
CONSOLE_SCREEN_BUFFER_INFO sbi;
|
|||
|
HANDLE ScreenHandle;
|
|||
|
SMALL_RECT Window;
|
|||
|
|
|||
|
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &sbi);
|
|||
|
|
|||
|
Window.Left = 0;
|
|||
|
Window.Top = 0;
|
|||
|
Window.Right = 79;
|
|||
|
Window.Bottom = 49;
|
|||
|
|
|||
|
dest.X = 0;
|
|||
|
dest.Y = 0;
|
|||
|
|
|||
|
ci.Char.AsciiChar = ' ';
|
|||
|
ci.Attributes = sbi.wAttributes;
|
|||
|
|
|||
|
SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE),
|
|||
|
TRUE,
|
|||
|
&Window);
|
|||
|
|
|||
|
cp.X = 0;
|
|||
|
cp.Y = 0;
|
|||
|
|
|||
|
Sm.Left = 0;
|
|||
|
Sm.Top = 1;
|
|||
|
Sm.Right = 79;
|
|||
|
Sm.Bottom = 49;
|
|||
|
|
|||
|
ScrollConsoleScreenBuffer(GetStdHandle(STD_OUTPUT_HANDLE),
|
|||
|
&Sm,
|
|||
|
NULL,
|
|||
|
dest,
|
|||
|
&ci);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
WinWordOpenFileTest()
|
|||
|
{
|
|||
|
PERFINFO PerfInfo;
|
|||
|
ULONG Index;
|
|||
|
OFSTRUCT ofstr;
|
|||
|
HANDLE iFile;
|
|||
|
|
|||
|
StartBenchMark("WinWord OpenFile)",
|
|||
|
3,
|
|||
|
&PerfInfo);
|
|||
|
|
|||
|
for ( Index=0;Index<3;Index++){
|
|||
|
iFile = (HANDLE)OpenFile("foo",&ofstr, OF_PARSE);
|
|||
|
iFile = (HANDLE)OpenFile("E:\\xxxxxxx\\winword.ini",&ofstr, 0x20);
|
|||
|
iFile = (HANDLE)OpenFile("E:\\xxxxxxx\\perftest.doc",&ofstr, 0x22);
|
|||
|
iFile = (HANDLE)OpenFile("E:foo",&ofstr, OF_PARSE);
|
|||
|
iFile = (HANDLE)OpenFile("E:foo",&ofstr, OF_PARSE);
|
|||
|
iFile = (HANDLE)OpenFile("E:foo",&ofstr, OF_PARSE);
|
|||
|
iFile = (HANDLE)OpenFile("E:foo",&ofstr, OF_PARSE);
|
|||
|
iFile = (HANDLE)OpenFile("E:\\xxxxxxx\\custom.dic",&ofstr, 0x4022 );
|
|||
|
iFile = (HANDLE)OpenFile("E:\\xxxxxxx\\sp_am.exc",&ofstr, 0x4040 );
|
|||
|
iFile = (HANDLE)OpenFile("E:foo",&ofstr, OF_PARSE);
|
|||
|
iFile = (HANDLE)OpenFile("foo",&ofstr, OF_PARSE);
|
|||
|
iFile = (HANDLE)OpenFile("E:~doc3d08.tmp",&ofstr, 0x1022);
|
|||
|
iFile = (HANDLE)OpenFile("E:\\xxxxxxx\\tempx.doc",&ofstr, 0xa022 );
|
|||
|
iFile = (HANDLE)OpenFile("E:\\xxxxxxx\\~$rftest.doc",&ofstr, 0x4012 );
|
|||
|
iFile = (HANDLE)OpenFile("foo",&ofstr, OF_PARSE);
|
|||
|
iFile = (HANDLE)OpenFile("E:~doc391f.tmp",&ofstr, 0x1022);
|
|||
|
iFile = (HANDLE)OpenFile("E:\\xxxxxxx\\tempy.doc",&ofstr, 0xa022 );
|
|||
|
iFile = (HANDLE)OpenFile("E:\\xxxxxxx\\winword.ini",&ofstr, 0x12);
|
|||
|
}
|
|||
|
|
|||
|
FinishBenchMark(&PerfInfo);
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
gettictst(int x)
|
|||
|
{
|
|||
|
PERFINFO PerfInfo;
|
|||
|
ULONG i,j;
|
|||
|
ULONG tnt,tw32;
|
|||
|
|
|||
|
if ( !x ) {
|
|||
|
StartBenchMark("NtGetTickCount)",
|
|||
|
100000,
|
|||
|
&PerfInfo);
|
|||
|
for ( i=0;i<100000;i++){
|
|||
|
j = GetTickCount();
|
|||
|
}
|
|||
|
|
|||
|
FinishBenchMark(&PerfInfo);
|
|||
|
|
|||
|
}
|
|||
|
else {
|
|||
|
while(1)GetTickCount();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
latst()
|
|||
|
{
|
|||
|
PERFINFO PerfInfo;
|
|||
|
ULONG i,j;
|
|||
|
HANDLE h1, h2, h3, h4, h5;
|
|||
|
|
|||
|
StartBenchMark("LocalAlloc/Free)",
|
|||
|
200,
|
|||
|
&PerfInfo);
|
|||
|
for ( i=0;i<200/5;i++){
|
|||
|
h1 = LocalAlloc(0, 500);
|
|||
|
h2 = LocalAlloc(0, 600);
|
|||
|
h3 = LocalAlloc(0, 700);
|
|||
|
LocalFree(h2);
|
|||
|
h4 = LocalAlloc(0, 1000);
|
|||
|
h5 = LocalAlloc(0, 100);
|
|||
|
LocalFree(h1);
|
|||
|
LocalFree(h3);
|
|||
|
LocalFree(h4);
|
|||
|
LocalFree(h5);
|
|||
|
}
|
|||
|
|
|||
|
FinishBenchMark(&PerfInfo);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
WinWordGetDriveTypeTest()
|
|||
|
{
|
|||
|
PERFINFO PerfInfo;
|
|||
|
ULONG Index,Reps;
|
|||
|
OFSTRUCT ofstr;
|
|||
|
HANDLE iFile;
|
|||
|
CHAR DiskName[4];
|
|||
|
WCHAR WDiskName[4];
|
|||
|
|
|||
|
// StartBenchMark("WinWord GetDriveType (1-26)",
|
|||
|
// 26,
|
|||
|
// &PerfInfo);
|
|||
|
//
|
|||
|
// for ( Index=1;Index<27;Index++){
|
|||
|
// GetDriveType(Index);
|
|||
|
// }
|
|||
|
//
|
|||
|
// FinishBenchMark(&PerfInfo);
|
|||
|
|
|||
|
DiskName[0]='a';
|
|||
|
DiskName[1]=':';
|
|||
|
DiskName[2]='\\';
|
|||
|
DiskName[3]='\0';
|
|||
|
StartBenchMark("WinWord GetDriveTypeA (a-z)",
|
|||
|
100,
|
|||
|
&PerfInfo);
|
|||
|
|
|||
|
for(Reps=0;Reps<100;Reps++){
|
|||
|
for ( Index=0;Index<26;Index++){
|
|||
|
DiskName[0]='a'+Index;
|
|||
|
GetDriveTypeA(DiskName);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
FinishBenchMark(&PerfInfo);
|
|||
|
|
|||
|
WDiskName[0]=(WCHAR)'a';
|
|||
|
WDiskName[1]=(WCHAR)':';
|
|||
|
WDiskName[2]=(WCHAR)'\\';
|
|||
|
WDiskName[3]=(WCHAR)'\0';
|
|||
|
StartBenchMark("WinWord GetDriveTypeW (a-z)",
|
|||
|
100,
|
|||
|
&PerfInfo);
|
|||
|
|
|||
|
for(Reps=0;Reps<100;Reps++){
|
|||
|
for ( Index=0;Index<26;Index++){
|
|||
|
WDiskName[0]=(WCHAR)'a'+Index;
|
|||
|
GetDriveTypeW(WDiskName);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
FinishBenchMark(&PerfInfo);
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
BogusOrdinalTest()
|
|||
|
{
|
|||
|
HANDLE hBase;
|
|||
|
FARPROC z;
|
|||
|
|
|||
|
WaitForSingleObject(0,-2);
|
|||
|
hBase = GetModuleHandle("base");
|
|||
|
xassert(hBase);
|
|||
|
z = GetProcAddress(hBase,0x00001345);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
NullServerSwitchTest (
|
|||
|
VOID
|
|||
|
)
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
PERFINFO PerfInfo;
|
|||
|
NTSTATUS Status;
|
|||
|
ULONG Index;
|
|||
|
|
|||
|
StartBenchMark("Null Server Call Benchmark)",
|
|||
|
NULL_SERVER_SWITCHES,
|
|||
|
&PerfInfo);
|
|||
|
|
|||
|
|
|||
|
for (Index = 0; Index < NULL_SERVER_SWITCHES; Index += 1) {
|
|||
|
CsrIdentifyAlertableThread();
|
|||
|
}
|
|||
|
//
|
|||
|
// Print out performance statistics.
|
|||
|
//
|
|||
|
|
|||
|
FinishBenchMark(&PerfInfo);
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
PathConvertTest (
|
|||
|
VOID
|
|||
|
)
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
PERFINFO PerfInfo;
|
|||
|
NTSTATUS Status;
|
|||
|
ULONG Index;
|
|||
|
UNICODE_STRING FileName;
|
|||
|
BOOLEAN TranslationStatus;
|
|||
|
RTL_RELATIVE_NAME RelativeName;
|
|||
|
|
|||
|
StartBenchMark("Path Conversion Test (foo)",
|
|||
|
PATH_CONVERSION_TEST,
|
|||
|
&PerfInfo);
|
|||
|
|
|||
|
|
|||
|
for (Index = 0; Index < PATH_CONVERSION_TEST; Index += 1) {
|
|||
|
RtlDosPathNameToNtPathName_U(
|
|||
|
L"foo",
|
|||
|
&FileName,
|
|||
|
NULL,
|
|||
|
&RelativeName
|
|||
|
);
|
|||
|
RtlFreeHeap(RtlProcessHeap(),FileName.Buffer);
|
|||
|
}
|
|||
|
//
|
|||
|
// Print out performance statistics.
|
|||
|
//
|
|||
|
|
|||
|
FinishBenchMark(&PerfInfo);
|
|||
|
|
|||
|
StartBenchMark("Path Conversion Test (e:\\nt\\windows\\foo)",
|
|||
|
PATH_CONVERSION_TEST,
|
|||
|
&PerfInfo);
|
|||
|
|
|||
|
|
|||
|
for (Index = 0; Index < PATH_CONVERSION_TEST; Index += 1) {
|
|||
|
RtlDosPathNameToNtPathName_U(
|
|||
|
L"e:\\nt\\windows\\foo",
|
|||
|
&FileName,
|
|||
|
NULL,
|
|||
|
&RelativeName
|
|||
|
);
|
|||
|
RtlFreeHeap(RtlProcessHeap(),FileName.Buffer);
|
|||
|
}
|
|||
|
//
|
|||
|
// Print out performance statistics.
|
|||
|
//
|
|||
|
|
|||
|
FinishBenchMark(&PerfInfo);
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
z(){}
|
|||
|
|
|||
|
bar()
|
|||
|
{
|
|||
|
for (i=0;i<2*BASESPIN;i++)j = i++;
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
}
|
|||
|
foo()
|
|||
|
{
|
|||
|
for (i=0;i<BASESPIN;i++)j = i++;
|
|||
|
bar();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
}
|
|||
|
proftst()
|
|||
|
{
|
|||
|
for (i=0;i<BASESPIN;i++)j = i++;
|
|||
|
foo();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
z();
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
probtst(
|
|||
|
VOID
|
|||
|
)
|
|||
|
{
|
|||
|
LPVOID ReadOnly;
|
|||
|
LPVOID ReadWrite;
|
|||
|
LPVOID ReadWrite2;
|
|||
|
LPVOID NoReadWrite;
|
|||
|
LPVOID MappedReadWrite;
|
|||
|
LPVOID p;
|
|||
|
HANDLE MappedFile;
|
|||
|
LPSTR l;
|
|||
|
LPWSTR w;
|
|||
|
BOOL b;
|
|||
|
|
|||
|
ReadOnly = VirtualAlloc(NULL,4096,MEM_COMMIT,PAGE_READONLY);
|
|||
|
ASSERT(ReadOnly);
|
|||
|
|
|||
|
ASSERT(!IsBadReadPtr(ReadOnly,1024));
|
|||
|
ASSERT(!IsBadReadPtr(ReadOnly,4096));
|
|||
|
ASSERT(IsBadReadPtr(ReadOnly,4097));
|
|||
|
ASSERT(!IsBadHugeReadPtr(ReadOnly,1024));
|
|||
|
ASSERT(!IsBadHugeReadPtr(ReadOnly,4096));
|
|||
|
ASSERT(IsBadHugeReadPtr(ReadOnly,4097));
|
|||
|
|
|||
|
ASSERT(IsBadWritePtr(ReadOnly,1024));
|
|||
|
ASSERT(IsBadWritePtr(ReadOnly,4096));
|
|||
|
ASSERT(IsBadWritePtr(ReadOnly,4097));
|
|||
|
ASSERT(IsBadHugeWritePtr(ReadOnly,1024));
|
|||
|
ASSERT(IsBadHugeWritePtr(ReadOnly,4096));
|
|||
|
ASSERT(IsBadHugeWritePtr(ReadOnly,4097));
|
|||
|
|
|||
|
ReadWrite = VirtualAlloc(NULL,4096,MEM_COMMIT,PAGE_READWRITE);
|
|||
|
ASSERT(ReadWrite);
|
|||
|
|
|||
|
ASSERT(!IsBadReadPtr(ReadWrite,1024));
|
|||
|
ASSERT(!IsBadReadPtr(ReadWrite,4096));
|
|||
|
ASSERT(IsBadReadPtr(ReadWrite,4097));
|
|||
|
ASSERT(!IsBadHugeReadPtr(ReadWrite,1024));
|
|||
|
ASSERT(!IsBadHugeReadPtr(ReadWrite,4096));
|
|||
|
ASSERT(IsBadHugeReadPtr(ReadWrite,4097));
|
|||
|
|
|||
|
ASSERT(!IsBadWritePtr(ReadWrite,1024));
|
|||
|
ASSERT(!IsBadWritePtr(ReadWrite,4096));
|
|||
|
ASSERT(IsBadWritePtr(ReadWrite,4097));
|
|||
|
ASSERT(!IsBadHugeWritePtr(ReadWrite,1024));
|
|||
|
ASSERT(!IsBadHugeWritePtr(ReadWrite,4096));
|
|||
|
ASSERT(IsBadHugeWritePtr(ReadWrite,4097));
|
|||
|
|
|||
|
NoReadWrite = VirtualAlloc(NULL,4096,MEM_COMMIT,PAGE_NOACCESS);
|
|||
|
ASSERT(NoReadWrite);
|
|||
|
|
|||
|
ASSERT(IsBadReadPtr(NoReadWrite,1024));
|
|||
|
ASSERT(IsBadReadPtr(NoReadWrite,4096));
|
|||
|
ASSERT(IsBadReadPtr(NoReadWrite,4097));
|
|||
|
ASSERT(IsBadHugeReadPtr(NoReadWrite,1024));
|
|||
|
ASSERT(IsBadHugeReadPtr(NoReadWrite,4096));
|
|||
|
ASSERT(IsBadHugeReadPtr(NoReadWrite,4097));
|
|||
|
|
|||
|
ASSERT(IsBadWritePtr(NoReadWrite,1024));
|
|||
|
ASSERT(IsBadWritePtr(NoReadWrite,4096));
|
|||
|
ASSERT(IsBadWritePtr(NoReadWrite,4097));
|
|||
|
ASSERT(IsBadHugeWritePtr(NoReadWrite,1024));
|
|||
|
ASSERT(IsBadHugeWritePtr(NoReadWrite,4096));
|
|||
|
ASSERT(IsBadHugeWritePtr(NoReadWrite,4097));
|
|||
|
|
|||
|
l = ReadWrite;
|
|||
|
l[4092]='a';
|
|||
|
l[4093]='b';
|
|||
|
l[4094]='c';
|
|||
|
l[4095]='\0';
|
|||
|
ASSERT(!IsBadStringPtrA(&l[4092],2));
|
|||
|
ASSERT(!IsBadStringPtrA(&l[4092],3));
|
|||
|
ASSERT(!IsBadStringPtrA(&l[4092],4));
|
|||
|
ASSERT(!IsBadStringPtrA(&l[4092],5));
|
|||
|
l[4095]='d';
|
|||
|
ASSERT(!IsBadStringPtrA(&l[4092],2));
|
|||
|
ASSERT(!IsBadStringPtrA(&l[4092],3));
|
|||
|
ASSERT(!IsBadStringPtrA(&l[4092],4));
|
|||
|
ASSERT(IsBadStringPtrA(&l[4092],5));
|
|||
|
|
|||
|
w = ReadWrite;
|
|||
|
w[2044]=(WCHAR)'a';
|
|||
|
w[2045]=(WCHAR)'b';
|
|||
|
w[2046]=(WCHAR)'c';
|
|||
|
w[2047]=UNICODE_NULL;
|
|||
|
ASSERT(!IsBadStringPtrW(&w[2044],2));
|
|||
|
ASSERT(!IsBadStringPtrW(&w[2044],3));
|
|||
|
ASSERT(!IsBadStringPtrW(&w[2044],4));
|
|||
|
ASSERT(!IsBadStringPtrW(&w[2044],5));
|
|||
|
w[2047]=(WCHAR)'d';
|
|||
|
ASSERT(!IsBadStringPtrW(&w[2044],2));
|
|||
|
ASSERT(!IsBadStringPtrW(&w[2044],3));
|
|||
|
ASSERT(!IsBadStringPtrW(&w[2044],4));
|
|||
|
ASSERT(IsBadStringPtrW(&w[2044],5));
|
|||
|
|
|||
|
ReadWrite2 = VirtualAlloc(NULL,4096,MEM_COMMIT,PAGE_READWRITE);
|
|||
|
ASSERT(ReadWrite2);
|
|||
|
|
|||
|
ASSERT(VirtualLock(ReadWrite2,4096));
|
|||
|
ASSERT(VirtualUnlock(ReadWrite2,4));
|
|||
|
ASSERT(!VirtualUnlock(ReadWrite2,4));
|
|||
|
ASSERT(!VirtualLock(ReadWrite2,4097));
|
|||
|
ASSERT(!VirtualUnlock(ReadWrite2,4097));
|
|||
|
ASSERT(VirtualLock(ReadWrite2,4096));
|
|||
|
ASSERT(VirtualUnlock(ReadWrite2,4096));
|
|||
|
ASSERT(!VirtualUnlock(ReadWrite2,4096));
|
|||
|
|
|||
|
MappedFile = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,8192,NULL);
|
|||
|
ASSERT(MappedFile);
|
|||
|
MappedReadWrite = MapViewOfFileEx(MappedFile,FILE_MAP_WRITE,0,0,0,(LPVOID)0x50000000);
|
|||
|
ASSERT(MappedReadWrite);
|
|||
|
|
|||
|
p = MapViewOfFileEx(MappedFile,FILE_MAP_WRITE,0,0,0,(LPVOID)GetModuleHandle(NULL));
|
|||
|
ASSERT(!p);
|
|||
|
|
|||
|
ASSERT(SetPriorityClass(GetCurrentProcess(),IDLE_PRIORITY_CLASS));
|
|||
|
ASSERT(GetPriorityClass(GetCurrentProcess()) == IDLE_PRIORITY_CLASS);
|
|||
|
|
|||
|
ASSERT(SetPriorityClass(GetCurrentProcess(),NORMAL_PRIORITY_CLASS));
|
|||
|
ASSERT(GetPriorityClass(GetCurrentProcess()) == NORMAL_PRIORITY_CLASS);
|
|||
|
|
|||
|
ASSERT(SetPriorityClass(GetCurrentProcess(),HIGH_PRIORITY_CLASS));
|
|||
|
ASSERT(GetPriorityClass(GetCurrentProcess()) == HIGH_PRIORITY_CLASS);
|
|||
|
|
|||
|
ASSERT(SetPriorityClass(GetCurrentProcess(),NORMAL_PRIORITY_CLASS));
|
|||
|
ASSERT(GetPriorityClass(GetCurrentProcess()) == NORMAL_PRIORITY_CLASS);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void
|
|||
|
notifytst()
|
|||
|
{
|
|||
|
HANDLE nHandle;
|
|||
|
DWORD wret;
|
|||
|
HANDLE fFile;
|
|||
|
WIN32_FIND_DATA FindFileData;
|
|||
|
int n;
|
|||
|
BOOL b;
|
|||
|
|
|||
|
fFile = FindFirstFile(
|
|||
|
"c:\\*.*",
|
|||
|
&FindFileData
|
|||
|
);
|
|||
|
xassert(fFile != INVALID_HANDLE_VALUE);
|
|||
|
n = 0;
|
|||
|
b = TRUE;
|
|||
|
while(b) {
|
|||
|
n++;
|
|||
|
b = FindNextFile(fFile,&FindFileData);
|
|||
|
}
|
|||
|
FindClose(fFile);
|
|||
|
printf("%d files\n",n);
|
|||
|
|
|||
|
nHandle = FindFirstChangeNotification(
|
|||
|
"C:\\",
|
|||
|
TRUE,
|
|||
|
FILE_NOTIFY_CHANGE_NAME
|
|||
|
);
|
|||
|
xassert(nHandle != INVALID_HANDLE_VALUE);
|
|||
|
|
|||
|
wret = WaitForSingleObject(nHandle,-1);
|
|||
|
xassert(wret == 0);
|
|||
|
|
|||
|
fFile = FindFirstFile(
|
|||
|
"c:\\*.*",
|
|||
|
&FindFileData
|
|||
|
);
|
|||
|
xassert(fFile != INVALID_HANDLE_VALUE);
|
|||
|
n = 0;
|
|||
|
b = TRUE;
|
|||
|
while(b) {
|
|||
|
n++;
|
|||
|
b = FindNextFile(fFile,&FindFileData);
|
|||
|
}
|
|||
|
FindClose(fFile);
|
|||
|
printf("%d files\n",n);
|
|||
|
|
|||
|
b = FindNextChangeNotification(nHandle);
|
|||
|
xassert(b);
|
|||
|
|
|||
|
wret = WaitForSingleObject(nHandle,-1);
|
|||
|
xassert(wret == 0);
|
|||
|
|
|||
|
fFile = FindFirstFile(
|
|||
|
"c:\\*.*",
|
|||
|
&FindFileData
|
|||
|
);
|
|||
|
xassert(fFile != INVALID_HANDLE_VALUE);
|
|||
|
n = 0;
|
|||
|
b = TRUE;
|
|||
|
while(b) {
|
|||
|
n++;
|
|||
|
b = FindNextFile(fFile,&FindFileData);
|
|||
|
}
|
|||
|
FindClose(fFile);
|
|||
|
printf("%d files\n",n);
|
|||
|
|
|||
|
xassert(FindCloseChangeNotification(nHandle));
|
|||
|
xassert(!FindCloseChangeNotification(nHandle));
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
openiftst()
|
|||
|
{
|
|||
|
HANDLE NEvent, NSemaphore, NMutex;
|
|||
|
HANDLE sEvent, sSemaphore, sMutex;
|
|||
|
|
|||
|
NEvent = CreateEvent(NULL,TRUE,TRUE,"named-event");
|
|||
|
xassert(NEvent);
|
|||
|
xassert(GetLastError()==0);
|
|||
|
sEvent = CreateEvent(NULL,TRUE,TRUE,"named-event");
|
|||
|
xassert(sEvent);
|
|||
|
xassert(GetLastError()==ERROR_ALREADY_EXISTS);
|
|||
|
NSemaphore = CreateSemaphore(NULL,1,256,"named-event");
|
|||
|
|
|||
|
NSemaphore = CreateSemaphore(NULL,1,256,"named-semaphore");
|
|||
|
xassert(NSemaphore);
|
|||
|
xassert(GetLastError()==0);
|
|||
|
sSemaphore = CreateSemaphore(NULL,1,256,"named-semaphore");
|
|||
|
xassert(sSemaphore);
|
|||
|
xassert(GetLastError()==ERROR_ALREADY_EXISTS);
|
|||
|
|
|||
|
NMutex = CreateMutex(NULL,FALSE,"named-mutex");
|
|||
|
xassert(NMutex);
|
|||
|
xassert(GetLastError()==0);
|
|||
|
sMutex = CreateMutex(NULL,FALSE,"named-mutex");
|
|||
|
xassert(sMutex);
|
|||
|
xassert(GetLastError()==ERROR_ALREADY_EXISTS);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
NewRip(int flag, LPSTR str)
|
|||
|
{
|
|||
|
DWORD ExceptionArguments[3];
|
|||
|
try {
|
|||
|
ExceptionArguments[0]=strlen(str);
|
|||
|
ExceptionArguments[1]=(DWORD)str;
|
|||
|
ExceptionArguments[2]=(DWORD)flag;
|
|||
|
RaiseException(0x0eab7190,0,3,ExceptionArguments);
|
|||
|
}
|
|||
|
except(EXCEPTION_EXECUTE_HANDLER) {
|
|||
|
;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
Ofprompt()
|
|||
|
{
|
|||
|
HFILE h;
|
|||
|
OFSTRUCT of;
|
|||
|
|
|||
|
SetErrorMode(SEM_NOOPENFILEERRORBOX);
|
|||
|
h = OpenFile("e:\\nt\\xt.cfg",&of,OF_PROMPT);
|
|||
|
printf("OpenFile(e:\\nt\\xt.cfg) h = %lx, GLE = %d\n",h,GetLastError());
|
|||
|
|
|||
|
h = OpenFile("e:\\zznt\\xt.cfg",&of,OF_PROMPT);
|
|||
|
printf("OpenFile(e:\\zznt\\xt.cfg) h = %lx, GLE = %d\n",h,GetLastError());
|
|||
|
|
|||
|
h = OpenFile("e:\\nt\\xt.cfg",&of,OF_PROMPT | OF_CANCEL);
|
|||
|
printf("OpenFile(e:\\nt\\xt.cfg) h = %lx, GLE = %d\n",h,GetLastError());
|
|||
|
SetErrorMode(0);
|
|||
|
h = OpenFile("e:\\nt\\xt.cfg",&of,OF_PROMPT);
|
|||
|
printf("OpenFile(e:\\nt\\xt.cfg) h = %lx, GLE = %d\n",h,GetLastError());
|
|||
|
|
|||
|
h = OpenFile("e:\\zznt\\xt.cfg",&of,OF_PROMPT);
|
|||
|
printf("OpenFile(e:\\zznt\\xt.cfg) h = %lx, GLE = %d\n",h,GetLastError());
|
|||
|
|
|||
|
h = OpenFile("e:\\nt\\xt.cfg",&of,OF_PROMPT | OF_CANCEL);
|
|||
|
printf("OpenFile(e:\\nt\\xt.cfg) h = %lx, GLE = %d\n",h,GetLastError());
|
|||
|
}
|
|||
|
void
|
|||
|
rtldevn()
|
|||
|
{
|
|||
|
UNICODE_STRING ustr;
|
|||
|
ANSI_STRING astr;
|
|||
|
CHAR buf[256];
|
|||
|
DWORD dw;
|
|||
|
|
|||
|
printf("name -> ");
|
|||
|
scanf("%s",buf);
|
|||
|
RtlInitAnsiString(&astr,buf);
|
|||
|
RtlAnsiStringToUnicodeString(&ustr,&astr,TRUE);
|
|||
|
|
|||
|
dw = RtlIsDosDeviceName_U(ustr.Buffer);
|
|||
|
|
|||
|
printf("dw %x Name %s \n",dw,buf);
|
|||
|
}
|
|||
|
|
|||
|
typedef struct _CMDSHOW {
|
|||
|
WORD wMustBe2;
|
|||
|
WORD wShowWindowValue;
|
|||
|
} CMDSHOW, *PCMDSHOW;
|
|||
|
typedef struct _LOAD_MODULE_PARAMS {
|
|||
|
LPSTR lpEnvAddress;
|
|||
|
LPSTR lpCmdLine;
|
|||
|
PCMDSHOW lpCmdShow;
|
|||
|
DWORD dwReserved;
|
|||
|
} LOAD_MODULE_PARAMS, *PLOAD_MODULE_PARAMS;
|
|||
|
|
|||
|
typedef DWORD (*PFNWAITFORINPUTIDLE)(HANDLE hProcess, DWORD dwMilliseconds);
|
|||
|
void
|
|||
|
cptst()
|
|||
|
{
|
|||
|
CHAR buf[256];
|
|||
|
CHAR cline[256];
|
|||
|
DWORD dw;
|
|||
|
STARTUPINFO StartupInfo;
|
|||
|
PROCESS_INFORMATION ProcessInformation;
|
|||
|
LOAD_MODULE_PARAMS lmp;
|
|||
|
CHAR Environment[256];
|
|||
|
CMDSHOW cs;
|
|||
|
PFNWAITFORINPUTIDLE WaitForInputIdleRoutine;
|
|||
|
HANDLE hMod;
|
|||
|
|
|||
|
hMod = LoadLibrary("user32");
|
|||
|
WaitForInputIdleRoutine = GetProcAddress(hMod,"WaitForInputIdle");
|
|||
|
|
|||
|
printf("name -> ");
|
|||
|
scanf("%s",buf);
|
|||
|
|
|||
|
RtlZeroMemory(&StartupInfo,sizeof(StartupInfo));
|
|||
|
StartupInfo.cb = sizeof(StartupInfo);
|
|||
|
SetLastError(0);
|
|||
|
CreateProcess(
|
|||
|
NULL,
|
|||
|
buf,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
FALSE,
|
|||
|
0,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
&StartupInfo,
|
|||
|
&ProcessInformation
|
|||
|
);
|
|||
|
(WaitForInputIdleRoutine)(ProcessInformation.hProcess,10000);
|
|||
|
printf("GLE %d\n",GetLastError());
|
|||
|
SetLastError(0);
|
|||
|
printf("WINEXEC %d\n",WinExec(buf,0));
|
|||
|
|
|||
|
SetLastError(0);
|
|||
|
lmp.lpEnvAddress = Environment;
|
|||
|
lmp.lpCmdLine = cline;
|
|||
|
lmp.dwReserved = 0;
|
|||
|
lmp.lpCmdShow = &cs;
|
|||
|
cs.wMustBe2 = 2;
|
|||
|
cs.wShowWindowValue = 3;
|
|||
|
cline[0] = strlen(buf);
|
|||
|
RtlMoveMemory(&cline[1],buf,cline[0]);
|
|||
|
cline[cline[0]+1] = 0x0d;
|
|||
|
printf("LOADMOD %d\n",LoadModule(buf,&lmp));
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
spawntst()
|
|||
|
{
|
|||
|
CHAR buf[256];
|
|||
|
int i;
|
|||
|
|
|||
|
printf("name -> ");
|
|||
|
scanf("%s",buf);
|
|||
|
i = _spawnlp(_P_WAIT,buf,"-l",NULL);
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
badproctst()
|
|||
|
{
|
|||
|
CHAR buf[256];
|
|||
|
DWORD dw;
|
|||
|
STARTUPINFO StartupInfo;
|
|||
|
PROCESS_INFORMATION ProcessInformation;
|
|||
|
LOAD_MODULE_PARAMS lmp;
|
|||
|
CHAR Environment[256];
|
|||
|
CMDSHOW cs;
|
|||
|
|
|||
|
printf("name -> ");
|
|||
|
scanf("%s",buf);
|
|||
|
|
|||
|
RtlZeroMemory(&StartupInfo,sizeof(StartupInfo));
|
|||
|
StartupInfo.cb = sizeof(StartupInfo);
|
|||
|
SetLastError(0);
|
|||
|
CreateProcess(
|
|||
|
NULL,
|
|||
|
buf,
|
|||
|
NULL,
|
|||
|
NULL,
|
|||
|
FALSE,
|
|||
|
0,
|
|||
|
NULL,
|
|||
|
"*",
|
|||
|
&StartupInfo,
|
|||
|
&ProcessInformation
|
|||
|
);
|
|||
|
printf("GLE %d\n",GetLastError());
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
copytst()
|
|||
|
{
|
|||
|
CHAR src[256];
|
|||
|
CHAR dst[256];
|
|||
|
BOOL b;
|
|||
|
|
|||
|
printf("src -> ");
|
|||
|
scanf("%s",src);
|
|||
|
printf("dst -> ");
|
|||
|
scanf("%s",dst);
|
|||
|
|
|||
|
b = CopyFile(src,dst,FALSE);
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
fftst()
|
|||
|
{
|
|||
|
CHAR buf[256];
|
|||
|
HANDLE fFile;
|
|||
|
WIN32_FIND_DATA FindFileData;
|
|||
|
BOOL b;
|
|||
|
|
|||
|
printf("pattern -> ");
|
|||
|
scanf("%s",buf);
|
|||
|
|
|||
|
fFile = FindFirstFile(
|
|||
|
buf,
|
|||
|
&FindFileData
|
|||
|
);
|
|||
|
if ( fFile == INVALID_HANDLE_VALUE ){
|
|||
|
printf("findfirst %s failed %d\n",buf,GetLastError());
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
b = TRUE;
|
|||
|
while(b) {
|
|||
|
printf("0x%08x %08d %s\n",
|
|||
|
FindFileData.dwFileAttributes,
|
|||
|
FindFileData.nFileSizeLow,
|
|||
|
FindFileData.cFileName
|
|||
|
);
|
|||
|
b = FindNextFile(fFile,&FindFileData);
|
|||
|
}
|
|||
|
FindClose(fFile);
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
oftst()
|
|||
|
{
|
|||
|
OFSTRUCT OfStruct;
|
|||
|
HFILE rv;
|
|||
|
|
|||
|
rv = OpenFile("",&OfStruct, OF_EXIST);
|
|||
|
printf("rv %d\n",rv);
|
|||
|
|
|||
|
rv = OpenFile(NULL,&OfStruct, OF_EXIST);
|
|||
|
printf("rv %d\n",rv);
|
|||
|
|
|||
|
rv = OpenFile(" ",&OfStruct, OF_EXIST);
|
|||
|
printf("rv %d\n",rv);
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
spath()
|
|||
|
{
|
|||
|
|
|||
|
char cbuff[512];
|
|||
|
|
|||
|
SearchPath(
|
|||
|
"c:\\nt;c:\\xytty;c:\\nt\\system",
|
|||
|
"kernel32",
|
|||
|
".dll",
|
|||
|
512,
|
|||
|
cbuff,
|
|||
|
NULL
|
|||
|
);
|
|||
|
printf("%s\n",cbuff);
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
muldivtst()
|
|||
|
{
|
|||
|
int answer,number,numerator,denom,result;
|
|||
|
PERFINFO PerfInfo;
|
|||
|
ULONG Index;
|
|||
|
|
|||
|
StartBenchMark("MulDiv)",
|
|||
|
50000,
|
|||
|
&PerfInfo);
|
|||
|
|
|||
|
for(Index=0;Index<50000;Index++){
|
|||
|
//
|
|||
|
// answer = -24
|
|||
|
//
|
|||
|
number = -18;
|
|||
|
numerator = 96;
|
|||
|
denom = 72;
|
|||
|
answer = -24;
|
|||
|
result = MulDiv(number,numerator,denom);
|
|||
|
if ( answer != result ) printf("MulDiv(%ld,%ld,%ld)=%ld %s\n",number,numerator,denom,result,answer == result ? "SUCCESS" : "FAILED");
|
|||
|
|
|||
|
//
|
|||
|
// answer = -24
|
|||
|
//
|
|||
|
number = 18;
|
|||
|
numerator = -96;
|
|||
|
denom = 72;
|
|||
|
answer = -24;
|
|||
|
result = MulDiv(number,numerator,denom);
|
|||
|
if ( answer != result ) printf("MulDiv(%ld,%ld,%ld)=%ld %s\n",number,numerator,denom,result,answer == result ? "SUCCESS" : "FAILED");
|
|||
|
|
|||
|
//
|
|||
|
// answer = 24
|
|||
|
//
|
|||
|
number = -18;
|
|||
|
numerator = -96;
|
|||
|
denom = 72;
|
|||
|
answer = 24;
|
|||
|
result = MulDiv(number,numerator,denom);
|
|||
|
if ( answer != result ) printf("MulDiv(%ld,%ld,%ld)=%ld %s\n",number,numerator,denom,result,answer == result ? "SUCCESS" : "FAILED");
|
|||
|
|
|||
|
//
|
|||
|
// answer = -24
|
|||
|
//
|
|||
|
number = -18;
|
|||
|
numerator = -96;
|
|||
|
denom = -72;
|
|||
|
answer = -24;
|
|||
|
result = MulDiv(number,numerator,denom);
|
|||
|
if ( answer != result ) printf("MulDiv(%ld,%ld,%ld)=%ld %s\n",number,numerator,denom,result,answer == result ? "SUCCESS" : "FAILED");
|
|||
|
|
|||
|
//
|
|||
|
// answer = -24
|
|||
|
//
|
|||
|
number = -18;
|
|||
|
numerator = -96;
|
|||
|
denom = -72;
|
|||
|
answer = -24;
|
|||
|
result = MulDiv(number,numerator,denom);
|
|||
|
if ( answer != result ) printf("MulDiv(%ld,%ld,%ld)=%ld %s\n",number,numerator,denom,result,answer == result ? "SUCCESS" : "FAILED");
|
|||
|
|
|||
|
//
|
|||
|
// answer = 24
|
|||
|
//
|
|||
|
number = 18;
|
|||
|
numerator = -96;
|
|||
|
denom = -72;
|
|||
|
answer = 24;
|
|||
|
result = MulDiv(number,numerator,denom);
|
|||
|
if ( answer != result ) printf("MulDiv(%ld,%ld,%ld)=%ld %s\n",number,numerator,denom,result,answer == result ? "SUCCESS" : "FAILED");
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// answer = 2
|
|||
|
//
|
|||
|
number = 4;
|
|||
|
numerator = 2;
|
|||
|
denom = 5;
|
|||
|
answer = 2;
|
|||
|
result = MulDiv(number,numerator,denom);
|
|||
|
if ( answer != result ) printf("MulDiv(%ld,%ld,%ld)=%ld %s\n",number,numerator,denom,result,answer == result ? "SUCCESS" : "FAILED");
|
|||
|
|
|||
|
//
|
|||
|
// answer = 500
|
|||
|
//
|
|||
|
|
|||
|
number = 100;
|
|||
|
numerator = 10;
|
|||
|
denom = 2;
|
|||
|
answer = 500;
|
|||
|
result = MulDiv(number,numerator,denom);
|
|||
|
if ( answer != result ) printf("MulDiv(%ld,%ld,%ld)=%ld %s\n",number,numerator,denom,result,answer == result ? "SUCCESS" : "FAILED");
|
|||
|
|
|||
|
//
|
|||
|
// answer = 3b9aca00
|
|||
|
//
|
|||
|
|
|||
|
number = 1000000;
|
|||
|
numerator = 1000000;
|
|||
|
denom = 1000;
|
|||
|
answer = 0x3b9aca00;
|
|||
|
result = MulDiv(number,numerator,denom);
|
|||
|
if ( answer != result ) printf("MulDiv(%ld,%ld,%ld)=0x%lx %s\n",number,numerator,denom,result,answer == result ? "SUCCESS" : "FAILED");
|
|||
|
|
|||
|
}
|
|||
|
FinishBenchMark(&PerfInfo);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
dname()
|
|||
|
{
|
|||
|
UNICODE_STRING LinkName;
|
|||
|
UNICODE_STRING DeviceName;
|
|||
|
OBJECT_ATTRIBUTES Obja;
|
|||
|
HANDLE LinkHandle;
|
|||
|
NTSTATUS Status;
|
|||
|
ULONG i;
|
|||
|
PWCHAR p;
|
|||
|
WCHAR DeviceNameBuffer[MAXIMUM_FILENAME_LENGTH];
|
|||
|
|
|||
|
RtlInitUnicodeString(&LinkName,L"\\DosDevices\\A:");
|
|||
|
p = (PWCHAR)LinkName.Buffer;
|
|||
|
p = p+12;
|
|||
|
for(i=0;i<26;i++){
|
|||
|
*p = (WCHAR)'A'+i;
|
|||
|
|
|||
|
InitializeObjectAttributes(
|
|||
|
&Obja,
|
|||
|
&LinkName,
|
|||
|
OBJ_CASE_INSENSITIVE,
|
|||
|
NULL,
|
|||
|
NULL
|
|||
|
);
|
|||
|
Status = NtOpenSymbolicLinkObject(
|
|||
|
&LinkHandle,
|
|||
|
SYMBOLIC_LINK_QUERY,
|
|||
|
&Obja
|
|||
|
);
|
|||
|
if (NT_SUCCESS( Status )) {
|
|||
|
|
|||
|
//
|
|||
|
// Open succeeded, Now get the link value
|
|||
|
//
|
|||
|
|
|||
|
DeviceName.Length = 0;
|
|||
|
DeviceName.MaximumLength = sizeof(DeviceNameBuffer);
|
|||
|
DeviceName.Buffer = DeviceNameBuffer;
|
|||
|
|
|||
|
Status = NtQuerySymbolicLinkObject(
|
|||
|
LinkHandle,
|
|||
|
&DeviceName,
|
|||
|
NULL
|
|||
|
);
|
|||
|
NtClose(LinkHandle);
|
|||
|
if ( NT_SUCCESS(Status) ) {
|
|||
|
printf("%wZ -> %wZ\n",&LinkName,&DeviceName);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
mfextst()
|
|||
|
{
|
|||
|
MoveFileExW(L"C:\\tmp\\xx.xx", NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
|
|||
|
}
|
|||
|
|
|||
|
CRITICAL_SECTION cs;
|
|||
|
|
|||
|
VOID
|
|||
|
StartBounce(PVOID pThreadBlockInfo)
|
|||
|
{
|
|||
|
EnterCriticalSection(&cs);
|
|||
|
Sleep(-1);
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
lockuptst()
|
|||
|
{
|
|||
|
HANDLE hThread;
|
|||
|
DWORD id;
|
|||
|
|
|||
|
InitializeCriticalSection(&cs);
|
|||
|
|
|||
|
hThread = CreateThread(
|
|||
|
NULL,
|
|||
|
0,
|
|||
|
(LPTHREAD_START_ROUTINE)StartBounce,
|
|||
|
0,
|
|||
|
0,
|
|||
|
&id
|
|||
|
);
|
|||
|
EnterCriticalSection(&cs);
|
|||
|
Sleep(-1);
|
|||
|
}
|
|||
|
void
|
|||
|
getdisktst()
|
|||
|
{
|
|||
|
BOOL b;
|
|||
|
DWORD spc,bps,fc,tc;
|
|||
|
|
|||
|
b = GetDiskFreeSpace(NULL,&spc,&bps,&fc,&tc);
|
|||
|
printf("GetDiskFreeSpace NULL %s\n",b ? "WORKED" : "FAILED" );
|
|||
|
|
|||
|
b = GetDiskFreeSpace("C:\\",&spc,&bps,&fc,&tc);
|
|||
|
printf("GetDiskFreeSpace C:\\ %s\n",b ? "WORKED" : "FAILED" );
|
|||
|
|
|||
|
b = GetDiskFreeSpace("C:\\WINNT\\",&spc,&bps,&fc,&tc);
|
|||
|
printf("GetDiskFreeSpace C:\\winnt\\ %s\n",b ? "WORKED" : "FAILED" );
|
|||
|
}
|
|||
|
|
|||
|
void
|
|||
|
DoChoice(
|
|||
|
int Choice
|
|||
|
)
|
|||
|
{
|
|||
|
NTSTATUS Status;
|
|||
|
LONG *p;
|
|||
|
|
|||
|
top:
|
|||
|
printf("exception test\n");
|
|||
|
printf("1 Access Violation(r)\n");
|
|||
|
printf("2 Access Violation(w)\n");
|
|||
|
printf("3 Array Bounds \n");
|
|||
|
printf("4 Int Divide By Zero\n");
|
|||
|
printf("5 Software 0x77\n");
|
|||
|
printf("6 bigpath\n");
|
|||
|
printf("7 set default harderror\n");
|
|||
|
printf("8 proftests\n");
|
|||
|
printf("9 probetests\n");
|
|||
|
printf("10 notifytests\n");
|
|||
|
printf("11 openif\n");
|
|||
|
printf("12 null server\n");
|
|||
|
printf("13 path convert\n");
|
|||
|
printf("14 bogus ordinal\n");
|
|||
|
printf("15 winword openfile\n");
|
|||
|
printf("16 scroll test\n");
|
|||
|
printf("17 winword getdrivetype\n");
|
|||
|
printf("18 dorip\n");
|
|||
|
printf("19 Ofprompt\n");
|
|||
|
printf("20 rtldevn\n");
|
|||
|
printf("21 cptst\n");
|
|||
|
printf("22 oftst\n");
|
|||
|
printf("23 dname\n");
|
|||
|
printf("24 fftst\n");
|
|||
|
printf("25 copy\n");
|
|||
|
printf("26 badproc\n");
|
|||
|
printf("27 loadlib\n");
|
|||
|
printf("28 gettictst(0)\n");
|
|||
|
printf("29 latst\n");
|
|||
|
printf("30 gettictst(1)\n");
|
|||
|
printf("31 spath\n");
|
|||
|
printf("32 spawntst\n");
|
|||
|
printf("33 muldivtst\n");
|
|||
|
printf("34 mfextst\n");
|
|||
|
printf("35 lockuptst\n");
|
|||
|
printf("36 getdisktst\n");
|
|||
|
|
|||
|
printf("Enter Choice --> ");
|
|||
|
scanf("%d",&Choice);
|
|||
|
printf("Good Choice... %d\n",Choice);
|
|||
|
|
|||
|
switch ( Choice ) {
|
|||
|
case 1:
|
|||
|
SetErrorMode(SEM_NOGPFAULTERRORBOX);
|
|||
|
printf("Good Choice... %d\n",Choice);
|
|||
|
p = (int *)0xbaadadd0;
|
|||
|
Choice = *p;
|
|||
|
break;
|
|||
|
|
|||
|
case 2:
|
|||
|
printf("Good Choice... %d\n",Choice);
|
|||
|
p = (int *)0xbaadadd0;
|
|||
|
*p = Choice;
|
|||
|
break;
|
|||
|
|
|||
|
case 3:
|
|||
|
printf("Good Choice... %d\n",Choice);
|
|||
|
RtlRaiseStatus(STATUS_ARRAY_BOUNDS_EXCEEDED);
|
|||
|
break;
|
|||
|
|
|||
|
case 4:
|
|||
|
printf("Good Choice... %d\n",Choice);
|
|||
|
Choice = Choice/izero;
|
|||
|
break;
|
|||
|
|
|||
|
case 5:
|
|||
|
printf("Good Choice... %d\n",Choice);
|
|||
|
{
|
|||
|
UINT b;
|
|||
|
b = SetErrorMode(SEM_FAILCRITICALERRORS);
|
|||
|
xassert(b == 0);
|
|||
|
b = SetErrorMode(0);
|
|||
|
xassert(b == SEM_FAILCRITICALERRORS);
|
|||
|
}
|
|||
|
RtlRaiseStatus(0x77);
|
|||
|
break;
|
|||
|
|
|||
|
case 6:
|
|||
|
printf("Good Choice... %d\n",Choice);
|
|||
|
{
|
|||
|
DWORD Bsize;
|
|||
|
DWORD Rsize;
|
|||
|
LPSTR Buff;
|
|||
|
LPSTR Ruff;
|
|||
|
DWORD Rvalue;
|
|||
|
LPSTR whocares;
|
|||
|
int i;
|
|||
|
|
|||
|
printf("Enter Size --> ");
|
|||
|
scanf("%d",&Bsize);
|
|||
|
printf("Enter RSize --> ");
|
|||
|
scanf("%d",&Rsize);
|
|||
|
|
|||
|
Buff = LocalAlloc(0,Bsize+1);
|
|||
|
xassert(Buff);
|
|||
|
Ruff = LocalAlloc(0,Bsize+1);
|
|||
|
xassert(Buff);
|
|||
|
RtlFillMemory(Buff,Bsize,'a');
|
|||
|
Buff[0]='c';
|
|||
|
Buff[1]=':';
|
|||
|
Buff[2]='\\';
|
|||
|
Buff[Bsize+1] = '\0';
|
|||
|
Rvalue = GetFullPathName(Buff,Rsize,Ruff,&whocares);
|
|||
|
i = strcmp(Buff,Ruff);
|
|||
|
printf("Bsize %d Rsize %d Rvalue %d i=%d \n",Bsize,Rsize,Rvalue,i);
|
|||
|
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case 7:
|
|||
|
printf("Good Choice... %d\n",Choice);
|
|||
|
Status = NtSetDefaultHardErrorPort(NULL);
|
|||
|
xassert(Status == STATUS_PRIVILEGE_NOT_HELD);
|
|||
|
break;
|
|||
|
case 8:
|
|||
|
printf("Good Choice... %d\n",Choice);
|
|||
|
proftst();
|
|||
|
break;
|
|||
|
case 9:
|
|||
|
printf("Good Choice... %d\n",Choice);
|
|||
|
probtst();
|
|||
|
break;
|
|||
|
|
|||
|
case 10:
|
|||
|
printf("Good Choice... %d\n",Choice);
|
|||
|
notifytst();
|
|||
|
break;
|
|||
|
|
|||
|
case 11:
|
|||
|
printf("Good Choice... %d\n",Choice);
|
|||
|
openiftst();
|
|||
|
break;
|
|||
|
|
|||
|
case 12:
|
|||
|
printf("Good Choice... %d\n",Choice);
|
|||
|
NullServerSwitchTest();
|
|||
|
break;
|
|||
|
|
|||
|
case 13:
|
|||
|
PathConvertTest();
|
|||
|
break;
|
|||
|
|
|||
|
case 14:
|
|||
|
BogusOrdinalTest();
|
|||
|
break;
|
|||
|
|
|||
|
case 15:
|
|||
|
WinWordOpenFileTest();
|
|||
|
break;
|
|||
|
|
|||
|
case 16:
|
|||
|
ScrollTest();
|
|||
|
break;
|
|||
|
|
|||
|
case 17:
|
|||
|
WinWordGetDriveTypeTest();
|
|||
|
break;
|
|||
|
case 18:
|
|||
|
NewRip(0,"Just a warning\n");
|
|||
|
NewRip(1,"We Are Hosed\n");
|
|||
|
break;
|
|||
|
|
|||
|
case 19:
|
|||
|
Ofprompt();
|
|||
|
break;
|
|||
|
|
|||
|
case 20:
|
|||
|
rtldevn();
|
|||
|
break;
|
|||
|
|
|||
|
case 21:
|
|||
|
cptst();
|
|||
|
break;
|
|||
|
|
|||
|
case 22:
|
|||
|
oftst();
|
|||
|
break;
|
|||
|
|
|||
|
case 23:
|
|||
|
dname();
|
|||
|
break;
|
|||
|
|
|||
|
case 24:
|
|||
|
fftst();
|
|||
|
break;
|
|||
|
|
|||
|
case 25:
|
|||
|
copytst();
|
|||
|
break;
|
|||
|
|
|||
|
case 26:
|
|||
|
badproctst();
|
|||
|
break;
|
|||
|
|
|||
|
case 27:
|
|||
|
{
|
|||
|
HANDLE hmods,hmodc,hmodw;
|
|||
|
hmods = LoadLibrary("shell32");
|
|||
|
hmodc = LoadLibrary("cmd.exe");
|
|||
|
hmodw = LoadLibrary("winspool.drv");
|
|||
|
FreeLibrary(hmods);
|
|||
|
FreeLibrary(hmodc);
|
|||
|
FreeLibrary(hmodw);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case 28:
|
|||
|
gettictst(0);
|
|||
|
break;
|
|||
|
|
|||
|
case 29:
|
|||
|
latst();
|
|||
|
break;
|
|||
|
|
|||
|
case 30:
|
|||
|
gettictst(1);
|
|||
|
break;
|
|||
|
|
|||
|
case 31:
|
|||
|
spath();
|
|||
|
break;
|
|||
|
|
|||
|
case 32:
|
|||
|
spawntst();
|
|||
|
break;
|
|||
|
|
|||
|
case 33:
|
|||
|
muldivtst();
|
|||
|
break;
|
|||
|
|
|||
|
case 34:
|
|||
|
mfextst();
|
|||
|
break;
|
|||
|
|
|||
|
case 35:
|
|||
|
lockuptst();
|
|||
|
break;
|
|||
|
|
|||
|
case 36:
|
|||
|
getdisktst();
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
printf( "Bad choice: %d\n", Choice );
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
//#define NtCurrentTebAsm() {PTEB Teb;_asm{mov eax,fs:[0x24]};,Teb;}
|
|||
|
|
|||
|
DWORD
|
|||
|
_cdecl
|
|||
|
main(
|
|||
|
int argc,
|
|||
|
char *argv[],
|
|||
|
char *envp[]
|
|||
|
)
|
|||
|
{
|
|||
|
int Choice;
|
|||
|
char b[512];
|
|||
|
|
|||
|
|
|||
|
// PTEB x;
|
|||
|
//
|
|||
|
// x = NtCurrentTebAsm();
|
|||
|
|
|||
|
GetDriveTypeW(L"A:\\");
|
|||
|
xassert(SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST));
|
|||
|
xassert(GetThreadPriority(GetCurrentThread()) == THREAD_PRIORITY_HIGHEST);
|
|||
|
xassert(SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_LOWEST));
|
|||
|
xassert(GetThreadPriority(GetCurrentThread()) == THREAD_PRIORITY_LOWEST);
|
|||
|
xassert(SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_ABOVE_NORMAL));
|
|||
|
xassert(GetThreadPriority(GetCurrentThread()) == THREAD_PRIORITY_ABOVE_NORMAL);
|
|||
|
xassert(SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_BELOW_NORMAL));
|
|||
|
xassert(GetThreadPriority(GetCurrentThread()) == THREAD_PRIORITY_BELOW_NORMAL);
|
|||
|
xassert(SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL));
|
|||
|
xassert(GetThreadPriority(GetCurrentThread()) == THREAD_PRIORITY_NORMAL);
|
|||
|
|
|||
|
xassert(SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_IDLE));
|
|||
|
xassert(GetThreadPriority(GetCurrentThread()) == THREAD_PRIORITY_IDLE);
|
|||
|
xassert(SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL));
|
|||
|
xassert(GetThreadPriority(GetCurrentThread()) == THREAD_PRIORITY_TIME_CRITICAL);
|
|||
|
|
|||
|
xassert(SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL));
|
|||
|
xassert(GetThreadPriority(GetCurrentThread()) == THREAD_PRIORITY_NORMAL);
|
|||
|
|
|||
|
xassert(!SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST+1));
|
|||
|
xassert(GetThreadPriority(GetCurrentProcess()) == THREAD_PRIORITY_ERROR_RETURN);
|
|||
|
|
|||
|
SetErrorMode(0);
|
|||
|
|
|||
|
GetSystemDirectory(b,512);
|
|||
|
printf("%s\n",b);
|
|||
|
GetWindowsDirectory(b,512);
|
|||
|
printf("%s\n",b);
|
|||
|
printf("TEBSIZE %d\n",sizeof(TEB));
|
|||
|
Choice = GetModuleFileName(NULL,b,512);
|
|||
|
if ( strlen(b) != Choice ) {
|
|||
|
printf("BAD strlen(b) = %d Choice %d b= %s\n",strlen(b),Choice,b);
|
|||
|
}
|
|||
|
else {
|
|||
|
printf("OK strlen(b) = %d Choice %d b= %s\n",strlen(b),Choice,b);
|
|||
|
}
|
|||
|
if (argc > 1) {
|
|||
|
while (--argc) {
|
|||
|
DoChoice( atoi( *++argv ) );
|
|||
|
}
|
|||
|
}
|
|||
|
else {
|
|||
|
while (TRUE) {
|
|||
|
DoChoice( Choice );
|
|||
|
}
|
|||
|
}
|
|||
|
//GetUserNameW(b,1);
|
|||
|
return 0;
|
|||
|
}
|