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.
159 lines
4.4 KiB
159 lines
4.4 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1998
|
|
//
|
|
// File: idtopath.cxx
|
|
//
|
|
// Contents: Convert file ID to path name
|
|
//
|
|
// History: 16 Jul 1997 DLee Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
extern "C"
|
|
{
|
|
#include <nt.h>
|
|
#include <ntioapi.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
}
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <memory.h>
|
|
#include <process.h>
|
|
#include <fcntl.h>
|
|
#include <string.h>
|
|
|
|
void die( char * pc, NTSTATUS s )
|
|
{
|
|
printf( "fail: 0x%x, '%s'\n", s, pc );
|
|
exit( 1 );
|
|
} //die
|
|
|
|
void OpenById( HANDLE hVol, LONGLONG ll, WCHAR wcVol )
|
|
{
|
|
UNICODE_STRING uScope;
|
|
uScope.Buffer = (WCHAR *) ≪
|
|
uScope.Length = sizeof ll;
|
|
uScope.MaximumLength = sizeof ll;
|
|
|
|
OBJECT_ATTRIBUTES ObjectAttr;
|
|
InitializeObjectAttributes( &ObjectAttr, // Structure
|
|
&uScope, // Name
|
|
OBJ_CASE_INSENSITIVE, // Attributes
|
|
hVol, // Root
|
|
0 ); // Security
|
|
|
|
IO_STATUS_BLOCK IoStatus;
|
|
HANDLE h = INVALID_HANDLE_VALUE;
|
|
NTSTATUS Status = NtOpenFile( &h,
|
|
FILE_READ_ATTRIBUTES,
|
|
&ObjectAttr,
|
|
&IoStatus,
|
|
FILE_SHARE_READ |
|
|
FILE_SHARE_WRITE |
|
|
FILE_SHARE_DELETE,
|
|
FILE_OPEN_BY_FILE_ID );
|
|
|
|
if ( NT_ERROR( Status ) )
|
|
{
|
|
if ( STATUS_INVALID_PARAMETER == Status )
|
|
{
|
|
printf( "no file exists with fileid %#I64x on volume %wc\n", ll, wcVol );
|
|
exit( 1 );
|
|
}
|
|
else
|
|
die( "can't open file", Status );
|
|
}
|
|
|
|
unsigned cbMax = 32768 * sizeof WCHAR + sizeof FILE_NAME_INFORMATION;
|
|
|
|
BYTE * pBuf = new BYTE[cbMax];
|
|
if ( 0 == pBuf )
|
|
return;
|
|
|
|
PFILE_NAME_INFORMATION FileName = (PFILE_NAME_INFORMATION) pBuf;
|
|
FileName->FileNameLength = cbMax - sizeof FILE_NAME_INFORMATION;
|
|
|
|
Status = NtQueryInformationFile( h,
|
|
&IoStatus,
|
|
FileName,
|
|
cbMax,
|
|
FileNameInformation );
|
|
|
|
if ( NT_ERROR( Status ) )
|
|
die( "can't get filename", Status );
|
|
|
|
// This is actually the full path, not the filename
|
|
|
|
FileName->FileName[ FileName->FileNameLength / sizeof WCHAR ] = 0;
|
|
|
|
printf( "fileid %#I64x: '%wc:%ws'\n", ll, wcVol, FileName->FileName );
|
|
|
|
delete [] pBuf;
|
|
|
|
NtClose( h );
|
|
} //OpenById
|
|
|
|
void Usage()
|
|
{
|
|
printf( "usage: idtopath /v:volume /i:fileid\n" );
|
|
printf( " e.g.: idtopath /v:c /i:2000000001a99\n" );
|
|
exit( 1 );
|
|
} //Usage
|
|
|
|
extern "C" int __cdecl wmain( int argc, WCHAR * argv[] )
|
|
{
|
|
WCHAR const *pwcId = 0;
|
|
WCHAR wcVol = 0;
|
|
|
|
for ( int i = 1; i < argc; i++ )
|
|
{
|
|
if ( L'-' == argv[i][0] || L'/' == argv[i][0] )
|
|
{
|
|
WCHAR wc = (WCHAR) toupper( argv[i][1] );
|
|
|
|
if ( ':' != argv[i][2] )
|
|
Usage();
|
|
|
|
if ( 'V' == wc )
|
|
wcVol = argv[i][3];
|
|
else if ( 'I' == wc )
|
|
pwcId = argv[i] + 3;
|
|
else
|
|
Usage();
|
|
}
|
|
else
|
|
Usage();
|
|
}
|
|
|
|
if ( 0 == wcVol || 0 == pwcId )
|
|
Usage();
|
|
|
|
LONGLONG ll = 0;
|
|
swscanf( pwcId, L"%I64x", &ll );
|
|
|
|
WCHAR awcVol[20];
|
|
wcscpy( awcVol, L"\\\\.\\k:" );
|
|
awcVol[4] = wcVol;
|
|
|
|
HANDLE h = CreateFileW( awcVol,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
0,
|
|
OPEN_EXISTING,
|
|
0, 0 );
|
|
|
|
if ( INVALID_HANDLE_VALUE == h )
|
|
die( "can't open volume", GetLastError() );
|
|
|
|
OpenById( h, ll, wcVol );
|
|
|
|
CloseHandle( h );
|
|
return 0;
|
|
} //main
|
|
|
|
|