WindowsXP-SP1/base/fs/ntfs/tests/findfile.cxx

271 lines
6.6 KiB
C++
Raw Permalink Normal View History

2001-01-01 00:00:00 +01:00
/*++
Copyright (c) 1989-1997 Microsoft Corporation
Module Name:
findfile.cxx
Abstract:
This module contains tests for finding files by sid
--*/
extern "C" {
#include <nt.h>
#include <ntioapi.h>
#include <ntrtl.h>
#include <nturtl.h>
}
#include <windows.h>
#include <stdio.h>
#define SID_MAX_LENGTH \
(FIELD_OFFSET(SID, SubAuthority) + sizeof(ULONG) * SID_MAX_SUB_AUTHORITIES)
__inline
VOID *
Add2Ptr(VOID *pv, ULONG cb)
{
return((BYTE *) pv + cb);
}
__inline
ULONG
QuadAlign( ULONG Value )
{
return (Value + 7) & ~7;
}
//
// Simple wrapper for NtCreateFile
//
NTSTATUS
OpenObject (
WCHAR const *pwszFile,
HANDLE RelatedObject,
ULONG CreateOptions,
ULONG DesiredAccess,
ULONG ShareAccess,
ULONG CreateDisposition,
HANDLE *ph)
{
NTSTATUS Status;
OBJECT_ATTRIBUTES oa;
UNICODE_STRING str;
IO_STATUS_BLOCK isb;
if (RelatedObject == NULL) {
RtlDosPathNameToNtPathName_U(pwszFile, &str, NULL, NULL);
} else {
RtlInitUnicodeString(&str, pwszFile);
}
InitializeObjectAttributes(
&oa,
&str,
OBJ_CASE_INSENSITIVE,
RelatedObject,
NULL);
Status = NtCreateFile(
ph,
DesiredAccess | SYNCHRONIZE,
&oa,
&isb,
NULL, // pallocationsize (none!)
FILE_ATTRIBUTE_NORMAL,
ShareAccess,
CreateDisposition,
CreateOptions,
NULL, // EA buffer (none!)
0);
RtlFreeHeap(RtlProcessHeap(), 0, str.Buffer);
return(Status);
}
void
SzToWsz (
OUT WCHAR *Unicode,
IN char *Ansi
)
{
while (*Unicode++ = *Ansi++)
;
}
int __cdecl
main (
int argc,
char **argv)
{
if (argc != 3) {
printf( "Usage: findfile [user] [dir]\n" );
return 1;
}
WCHAR FileName[MAX_PATH];
SzToWsz( FileName, argv[2] );
HANDLE Handle;
NTSTATUS Status = OpenObject( FileName,
NULL,
FILE_SYNCHRONOUS_IO_NONALERT,
FILE_READ_ATTRIBUTES,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_OPEN,
&Handle );
if (!NT_SUCCESS( Status )) {
printf( "OpenObject returned %x\n", Status );
return 1;
}
struct {
ULONG Restart;
BYTE Sid[SID_MAX_LENGTH];
} FsCtlInput;
ULONG SidLength = sizeof( FsCtlInput.Sid );
CHAR Domain[MAX_PATH];
ULONG DomainLength = sizeof( Domain );
SID_NAME_USE SidNameUse;
if (!LookupAccountName( NULL,
argv[1],
FsCtlInput.Sid,
&SidLength,
Domain,
&DomainLength,
&SidNameUse )
) {
printf( "LookupAccountName failed %x\n", GetLastError( ));
return 1;
}
IO_STATUS_BLOCK Iosb;
FsCtlInput.Restart = 1;
BYTE Output[MAX_PATH + 10];
while (TRUE) {
Status = NtFsControlFile(
Handle,
NULL,
NULL,
NULL,
&Iosb,
FSCTL_FIND_FILES_BY_SID,
&FsCtlInput,
sizeof( FsCtlInput ),
NULL,
sizeof( Output ));
Status = NtFsControlFile(
Handle,
NULL,
NULL,
NULL,
&Iosb,
FSCTL_FIND_FILES_BY_SID,
&FsCtlInput,
sizeof( FsCtlInput ),
Output,
sizeof( Output ));
FsCtlInput.Restart = 0;
if (!NT_SUCCESS( Status ) && Status != STATUS_BUFFER_OVERFLOW) {
printf( "NtfsControlFile returned %x\n", Status );
return 1;
}
//
// Display output buffer
//
printf( "Length is %x\n", Iosb.Information );
if (Iosb.Information == 0) {
break;
}
PFILE_NAME_INFORMATION FileNameInfo = (PFILE_NAME_INFORMATION) Output;
while ((PBYTE)FileNameInfo < Output + Iosb.Information) {
ULONG Length =
sizeof( FILE_NAME_INFORMATION ) - sizeof( WCHAR ) +
FileNameInfo->FileNameLength;
printf( "%d: '%.*ws' ",
FileNameInfo->FileNameLength,
FileNameInfo->FileNameLength / sizeof( WCHAR ),
FileNameInfo->FileName );
HANDLE ChildHandle;
WCHAR ChildFileName[ MAX_PATH ];
RtlMoveMemory( ChildFileName, FileNameInfo->FileName, FileNameInfo->FileNameLength );
ChildFileName[FileNameInfo->FileNameLength / sizeof( WCHAR )] = L'\0';
Status = OpenObject( ChildFileName,
Handle,
FILE_SYNCHRONOUS_IO_NONALERT,
FILE_READ_ATTRIBUTES,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_OPEN,
&ChildHandle );
if (!NT_SUCCESS( Status )) {
printf( "\nUnable to open child - %x\n", Status );
} else {
BYTE FileName[MAX_PATH+10];
IO_STATUS_BLOCK Iosb2;
Status = NtQueryInformationFile(
ChildHandle,
&Iosb2,
FileName,
sizeof( FileName ),
FileNameInformation );
if (!NT_SUCCESS( Status )) {
printf( "\nNtQUeryInformationFile failed - %x\n", Status );
} else {
PFILE_NAME_INFORMATION fn = (PFILE_NAME_INFORMATION) FileName;
printf( "%.*ws\n", fn->FileNameLength / sizeof( WCHAR ), fn->FileName );
}
NtClose( ChildHandle );
}
FileNameInfo =
(PFILE_NAME_INFORMATION) Add2Ptr( FileNameInfo, QuadAlign( Length ));
}
}
//
// Close the file
//
Status = NtClose( Handle );
if (!NT_SUCCESS( Status )) {
printf( "Unable to close %s - %x\n", FileName, Status );
}
}