//+------------------------------------------------------------------------- // // 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 #include #include #include } #include #include #include #include #include #include #include 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