232 lines
3.8 KiB
C
232 lines
3.8 KiB
C
// oidtst.c
|
||
|
||
#include "oidtst.h"
|
||
|
||
|
||
int
|
||
FsTestDecipherStatus(
|
||
IN NTSTATUS Status
|
||
)
|
||
{
|
||
int Error;
|
||
|
||
printf( "Status %x -- ", Status );
|
||
|
||
switch(Status) {
|
||
|
||
case STATUS_ACCESS_DENIED:
|
||
printf( "STATUS_ACCESS_DENIED\n" );
|
||
break;
|
||
|
||
case STATUS_NOT_IMPLEMENTED:
|
||
printf( "STATUS_NOT_IMPLEMENTED\n" );
|
||
break;
|
||
|
||
case STATUS_NOT_LOCKED:
|
||
printf( "STATUS_NOT_LOCKED\n" );
|
||
break;
|
||
|
||
case STATUS_OBJECTID_EXISTS:
|
||
printf( "STATUS_OBJECTID_EXISTS\n" );
|
||
break;
|
||
|
||
case STATUS_BUFFER_OVERFLOW:
|
||
printf( "STATUS_BUFFER_OVERFLOW\n" );
|
||
break;
|
||
|
||
case STATUS_NO_MORE_FILES:
|
||
printf( "STATUS_NO_MORE_FILES\n" );
|
||
break;
|
||
|
||
case STATUS_DUPLICATE_NAME:
|
||
printf( "STATUS_DUPLICATE_NAME\n" );
|
||
break;
|
||
|
||
case STATUS_OBJECT_NAME_COLLISION:
|
||
printf( "STATUS_OBJECT_NAME_COLLISION\n" );
|
||
break;
|
||
|
||
case STATUS_OBJECT_NAME_NOT_FOUND:
|
||
printf( "STATUS_OBJECT_NAME_NOT_FOUND\n" );
|
||
break;
|
||
|
||
case STATUS_INVALID_ADDRESS:
|
||
printf( "STATUS_INVALID_ADDRESS\n" );
|
||
break;
|
||
|
||
case STATUS_INVALID_PARAMETER:
|
||
printf( "STATUS_INVALID_PARAMETER\n" );
|
||
break;
|
||
|
||
case STATUS_OBJECT_PATH_NOT_FOUND:
|
||
printf( "STATUS_OBJECT_PATH_NOT_FOUND\n" );
|
||
break;
|
||
|
||
case STATUS_OBJECT_PATH_SYNTAX_BAD:
|
||
printf( "STATUS_OBJECT_PATH_SYNTAX_BAD\n" );
|
||
break;
|
||
|
||
case STATUS_SUCCESS:
|
||
printf( "STATUS_SUCCESS\n" );
|
||
break;
|
||
|
||
default:
|
||
printf( "(unknown status code)\n" );
|
||
break;
|
||
}
|
||
|
||
if (Status != STATUS_SUCCESS) {
|
||
|
||
Error = GetLastError();
|
||
printf( "GetLastError returned (dec): %d\n", Error );
|
||
|
||
return 1;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
void
|
||
FsTestHexDump (
|
||
IN UCHAR *Buffer,
|
||
IN ULONG Size
|
||
)
|
||
{
|
||
ULONG idx;
|
||
|
||
printf( "\n" );
|
||
|
||
for (idx = 0; idx < Size; idx += 1) {
|
||
|
||
// printf( "%02x %c ", Buffer[idx], Buffer[idx] );
|
||
printf( "%02x ", Buffer[idx] );
|
||
}
|
||
}
|
||
|
||
void
|
||
FsTestHexDumpLongs (
|
||
IN ULONG *Buffer,
|
||
IN ULONG SizeInBytes
|
||
)
|
||
{
|
||
ULONG idx;
|
||
ULONG Size = SizeInBytes / 4;
|
||
|
||
printf( "\n" );
|
||
|
||
for (idx = 0; idx < Size; idx += 1) {
|
||
|
||
printf( "%08x ", Buffer[idx] );
|
||
}
|
||
}
|
||
|
||
#if 0
|
||
|
||
void
|
||
FsTestDumpMenu(
|
||
void
|
||
)
|
||
{
|
||
printf( "\n s -- Set object id" );
|
||
printf( "\n g -- Get object id" );
|
||
printf( "\n d -- Delete object id" );
|
||
printf( "\n o -- Open file by object id" );
|
||
printf( "\n q -- Quit" );
|
||
}
|
||
|
||
|
||
int
|
||
FsTestDoCommand(
|
||
IN HANDLE hFile,
|
||
IN OUT OBJECTID *ObjectId
|
||
)
|
||
|
||
{
|
||
char cmd[8];
|
||
int retval = 0;
|
||
HANDLE OpenedFile;
|
||
|
||
printf( "\n -->" );
|
||
|
||
scanf( "%s", cmd);
|
||
|
||
switch(cmd[0]) {
|
||
case 's':
|
||
FsTestSetOid( hFile, *ObjectId );
|
||
break;
|
||
|
||
case 'g':
|
||
FsTestGetOid( hFile, ObjectId );
|
||
break;
|
||
|
||
case 'd':
|
||
FsTestDeleteOid( hFile, *ObjectId );
|
||
break;
|
||
|
||
case 'o':
|
||
FsTestOpenByOid( *ObjectId, &OpenedFile );
|
||
break;
|
||
|
||
case 'q':
|
||
retval = 1;
|
||
break;
|
||
|
||
default:
|
||
printf( "\n Try again" );
|
||
}
|
||
|
||
return retval;
|
||
}
|
||
|
||
|
||
VOID
|
||
main(
|
||
int argc,
|
||
char *argv[]
|
||
)
|
||
{
|
||
HANDLE hFile;
|
||
OBJECTID ObjectId;
|
||
|
||
//
|
||
// Get parameters
|
||
//
|
||
|
||
if (argc < 3) {
|
||
printf("This program tests object ids (ntfs only).\n\n");
|
||
printf("usage: %s filename ObjectId\n", argv[0]);
|
||
return;
|
||
}
|
||
|
||
hFile = CreateFile( argv[1],
|
||
0,
|
||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||
NULL,
|
||
OPEN_EXISTING,
|
||
0,
|
||
NULL );
|
||
|
||
if ( hFile == INVALID_HANDLE_VALUE ) {
|
||
printf( "Error opening file %s %x\n", argv[1], GetLastError() );
|
||
return;
|
||
}
|
||
|
||
RtlZeroBytes( &ObjectId,
|
||
sizeof( ObjectId ) );
|
||
|
||
sscanf( argv[2], "%d", &ObjectId.Lineage.Data1 );
|
||
|
||
printf( "\nUsing file:%s, ObjectId:%d", argv[1], ObjectId.Lineage.Data1 );
|
||
|
||
while (retval == 0) {
|
||
|
||
FsTestDumpMenu();
|
||
retval = FsTestDoCommand( hFile, &ObjectId );
|
||
}
|
||
|
||
CloseHandle( hFile );
|
||
|
||
return;
|
||
}
|
||
#endif
|