318 lines
6.3 KiB
C++
318 lines
6.3 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1996.
|
|
//
|
|
// File: ttunnel.cxx
|
|
//
|
|
// Contents: Utility for multi-thread tunnel tests
|
|
//
|
|
// Codework:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
#include <pch.cxx>
|
|
#pragma hdrstop
|
|
|
|
#define TRKDATA_ALLOCATE // This is the main module, trigger trkwks.hxx to do definitions
|
|
|
|
#include <trkwks.hxx>
|
|
|
|
typedef struct
|
|
{
|
|
ULONG Vol;
|
|
int file1;
|
|
int file2;
|
|
} PARAMS;
|
|
|
|
class THREAD_FILE_NAME
|
|
{
|
|
public:
|
|
THREAD_FILE_NAME(LPVOID pv)
|
|
{
|
|
PARAMS *params = (PARAMS*)pv;
|
|
|
|
wsprintf(Name1, TEXT("%d"), params->file1);
|
|
wsprintf(Name2, TEXT("%d"), params->file2);
|
|
|
|
Vol = params->Vol;
|
|
}
|
|
|
|
TCHAR Name1[MAX_PATH];
|
|
TCHAR Name2[MAX_PATH];
|
|
|
|
ULONG Vol;
|
|
};
|
|
|
|
void
|
|
PrintThreadId()
|
|
{
|
|
printf("[%d]", GetCurrentThreadId());
|
|
}
|
|
|
|
// dis app
|
|
// --- ---
|
|
// ren ren
|
|
// ren cre
|
|
// del cre
|
|
// del ren
|
|
//
|
|
|
|
void
|
|
CreateWithId( TCHAR * Name, CDomainRelativeObjId * pdroid )
|
|
{
|
|
CDomainRelativeObjId droidBirth;
|
|
|
|
HANDLE h = CreateFile(
|
|
Name,
|
|
GENERIC_READ|GENERIC_WRITE,
|
|
0,
|
|
NULL,
|
|
CREATE_NEW,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL );
|
|
|
|
if (h!=INVALID_HANDLE_VALUE)
|
|
{
|
|
GetDroids(h, pdroid, &droidBirth, RGO_READ_OBJECTID);
|
|
GetDroids(h, pdroid, &droidBirth, RGO_GET_OBJECTID);
|
|
|
|
DelObjId( h );
|
|
GetDroids(h, pdroid, &droidBirth, RGO_READ_OBJECTID);
|
|
|
|
GetDroids(h, pdroid, &droidBirth, RGO_GET_OBJECTID);
|
|
CloseHandle(h);
|
|
}
|
|
}
|
|
|
|
void
|
|
OpenById(ULONG Vol, const CDomainRelativeObjId & droidCurrent)
|
|
{
|
|
NTSTATUS Status;
|
|
HANDLE h;
|
|
|
|
Status = OpenFileById( Vol,
|
|
droidCurrent.GetObjId(),
|
|
SYNCHRONIZE | FILE_READ_ATTRIBUTES,
|
|
0,
|
|
0,
|
|
&h );
|
|
if ( NT_SUCCESS(Status) )
|
|
{
|
|
CloseHandle(h);
|
|
}
|
|
}
|
|
|
|
DWORD
|
|
WINAPI
|
|
RenRen( LPVOID pvParam )
|
|
{
|
|
THREAD_FILE_NAME Names(pvParam);
|
|
CDomainRelativeObjId droidCurrent;
|
|
|
|
printf("RenRen( %s %s )\n", Names.Name1, Names.Name2);
|
|
|
|
while (1)
|
|
{
|
|
PrintThreadId();
|
|
CreateWithId( Names.Name1, &droidCurrent );
|
|
OpenById( Names.Vol, droidCurrent );
|
|
|
|
MoveFile( Names.Name1, Names.Name2 );
|
|
|
|
OpenById( Names.Vol, droidCurrent );
|
|
|
|
MoveFile( Names.Name2, Names.Name1 );
|
|
|
|
OpenById( Names.Vol, droidCurrent );
|
|
|
|
DeleteFile( Names.Name1 );
|
|
OpenById( Names.Vol, droidCurrent );
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
DWORD
|
|
WINAPI
|
|
RenCre( LPVOID pvParam )
|
|
{
|
|
THREAD_FILE_NAME Names(pvParam);
|
|
CDomainRelativeObjId droidCurrent;
|
|
|
|
printf("RenCre( %s %s )\n", Names.Name1, Names.Name2);
|
|
|
|
while (1)
|
|
{
|
|
PrintThreadId();
|
|
CreateWithId( Names.Name1, &droidCurrent );
|
|
OpenById( Names.Vol, droidCurrent );
|
|
|
|
MoveFile( Names.Name1, Names.Name2 );
|
|
|
|
OpenById( Names.Vol, droidCurrent );
|
|
|
|
CreateWithId( Names.Name1, &droidCurrent );
|
|
|
|
OpenById( Names.Vol, droidCurrent );
|
|
|
|
DeleteFile( Names.Name1 );
|
|
DeleteFile( Names.Name2 );
|
|
|
|
OpenById( Names.Vol, droidCurrent );
|
|
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
DWORD
|
|
WINAPI
|
|
DelCre( LPVOID pvParam )
|
|
{
|
|
THREAD_FILE_NAME Names(pvParam);
|
|
CDomainRelativeObjId droidCurrent;
|
|
|
|
printf("DelCre( %s %s )\n", Names.Name1, Names.Name2);
|
|
|
|
while (1)
|
|
{
|
|
PrintThreadId();
|
|
CreateWithId( Names.Name1, &droidCurrent );
|
|
|
|
OpenById( Names.Vol, droidCurrent );
|
|
|
|
DeleteFile( Names.Name1 );
|
|
|
|
OpenById( Names.Vol, droidCurrent );
|
|
|
|
CreateWithId( Names.Name1, &droidCurrent );
|
|
|
|
OpenById( Names.Vol, droidCurrent );
|
|
|
|
DeleteFile( Names.Name1 );
|
|
|
|
OpenById( Names.Vol, droidCurrent );
|
|
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
DWORD
|
|
WINAPI
|
|
DelRen( LPVOID pvParam )
|
|
{
|
|
THREAD_FILE_NAME Names(pvParam);
|
|
CDomainRelativeObjId droidCurrent;
|
|
|
|
printf("DelRen( %s %s )\n", Names.Name1, Names.Name2);
|
|
|
|
while (1)
|
|
{
|
|
PrintThreadId();
|
|
CreateWithId( Names.Name1, &droidCurrent );
|
|
OpenById( Names.Vol, droidCurrent );
|
|
|
|
DeleteFile( Names.Name1 );
|
|
|
|
OpenById( Names.Vol, droidCurrent );
|
|
|
|
CreateWithId( Names.Name2, &droidCurrent );
|
|
|
|
OpenById( Names.Vol, droidCurrent );
|
|
|
|
MoveFile( Names.Name2, Names.Name1 );
|
|
|
|
OpenById( Names.Vol, droidCurrent );
|
|
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
LPTHREAD_START_ROUTINE pfn[8] = {
|
|
RenRen,
|
|
RenCre,
|
|
DelRen,
|
|
DelCre
|
|
};
|
|
|
|
#ifdef _UNICODE
|
|
EXTERN_C void __cdecl wmain( int argc, wchar_t **argv )
|
|
#else
|
|
void __cdecl main( int argc, char **argv )
|
|
#endif
|
|
{
|
|
HRESULT hr = S_OK;
|
|
NTSTATUS status = 0;
|
|
|
|
TrkDebugCreate( TRK_DBG_FLAGS_WRITE_TO_DBG | TRK_DBG_FLAGS_WRITE_TO_STDOUT, "TTunnel" );
|
|
|
|
|
|
// Convert the option to upper case (options are case-insensitive).
|
|
|
|
__try
|
|
{
|
|
PARAMS params[24];
|
|
|
|
TCHAR tszDir[MAX_PATH];
|
|
|
|
GetCurrentDirectory( sizeof(tszDir)/sizeof(tszDir[0]), tszDir );
|
|
CharUpper(tszDir);
|
|
|
|
for (int i=0;i<24;i++)
|
|
{
|
|
DWORD dw;
|
|
|
|
params[i].Vol = tszDir[0]-TEXT('A');
|
|
|
|
if (i<8)
|
|
{
|
|
// 8 threads on two files
|
|
params[i].file1 = 0;
|
|
params[i].file2 = 1;
|
|
}
|
|
else
|
|
if (i<16)
|
|
{
|
|
// 8 threads on 4 pairs of files
|
|
params[i].file1 = i/2; // 4 .. 7
|
|
params[i].file2 = i/2+1; // 5 .. 8
|
|
}
|
|
else
|
|
{
|
|
// 8 threads on 8 pairs of files
|
|
params[i].file1 = i+8;
|
|
params[i].file2 = i+16;
|
|
}
|
|
|
|
if (i&1)
|
|
{
|
|
int s = params[i].file1;
|
|
params[i].file1 = params[i].file2;
|
|
params[i].file2 = s;
|
|
}
|
|
|
|
HANDLE h = CreateThread(0,NULL,pfn[i%4],¶ms[i],0,&dw);
|
|
if (h)
|
|
{
|
|
CloseHandle(h);
|
|
}
|
|
}
|
|
Sleep(INFINITE);
|
|
}
|
|
|
|
__except( BreakOnDebuggableException() )
|
|
{
|
|
hr = GetExceptionCode();
|
|
}
|
|
|
|
|
|
Exit:
|
|
|
|
if( FAILED(hr) )
|
|
printf( "HR = %08X\n", hr );
|
|
|
|
return;
|
|
|
|
} // main()
|
|
|