|
|
// genoid.c
#include "oidtst.h"
int FsTestGenOid( IN HANDLE hFile, IN FILE_OBJECTID_BUFFER *ObjectIdBuffer ) { IO_STATUS_BLOCK IoStatusBlock; NTSTATUS Status;
Status = NtFsControlFile( hFile, // file handle
NULL, // event
NULL, // apc routine
NULL, // apc context
&IoStatusBlock, // iosb
FSCTL_CREATE_OR_GET_OBJECT_ID, // FsControlCode
&hFile, // input buffer
sizeof(HANDLE), // input buffer length
ObjectIdBuffer, // OutputBuffer for data from the FS
sizeof(FILE_OBJECTID_BUFFER) ); // OutputBuffer Length
if (Status == STATUS_SUCCESS) {
printf( "\nOid for this file is %s", ObjectIdBuffer->ObjectId ); FsTestHexDump( ObjectIdBuffer->ObjectId, 16 ); printf( "\nExtended info is %s\n", ObjectIdBuffer->ExtendedInfo ); }
return FsTestDecipherStatus( Status ); }
VOID _cdecl main( int argc, char *argv[] ) { HANDLE File; FILE_OBJECTID_BUFFER ObjectIdBuffer; IO_STATUS_BLOCK IoStatusBlock; char mybuffer[100]; NTSTATUS GetNameStatus;
//
// Get parameters
//
if (argc < 2) { printf("This program finds the object id of a file and generates one if necessary (ntfs only).\n\n"); printf("usage: %s filename\n", argv[0]); return; }
File = CreateFile( argv[1], 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL );
if ( File == INVALID_HANDLE_VALUE ) { printf( "Error opening file %s %x\n", argv[1], GetLastError() ); return; }
GetNameStatus = NtQueryInformationFile( File, &IoStatusBlock, mybuffer, sizeof(mybuffer), FileNameInformation ); printf( "\nGetNameStatus %x, Filename is:", GetNameStatus ); printf( "%S", (mybuffer + 4) );
RtlZeroBytes( &ObjectIdBuffer, sizeof( ObjectIdBuffer ) );
printf( "\nUsing file:%s", argv[1] );
FsTestGenOid( File, &ObjectIdBuffer );
CloseHandle( File ); }
|