mirror of https://github.com/lianthony/NT4.0
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.
210 lines
4.3 KiB
210 lines
4.3 KiB
/*++
|
|
|
|
Copyright (c) 1993 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
fileio.c
|
|
|
|
Abstract:
|
|
|
|
User mode test program for the Microsoft Netware redir file system.
|
|
|
|
This test program can be built from the command line using the
|
|
command 'nmake UMTEST=fileio'.
|
|
|
|
Author:
|
|
|
|
Manny Weiser (mannyw) 17-May-1993
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
|
|
//
|
|
// Local definitions
|
|
//
|
|
|
|
VOID
|
|
DisplayUsage(
|
|
PSZ ProgramName
|
|
);
|
|
|
|
|
|
BOOLEAN
|
|
OpenFile(
|
|
PSZ Name,
|
|
PHANDLE Handle
|
|
);
|
|
|
|
QueryFileInfo(
|
|
IN HANDLE Handle
|
|
);
|
|
|
|
|
|
cdecl
|
|
main(
|
|
int argc,
|
|
char *argv[],
|
|
)
|
|
{
|
|
HANDLE handle;
|
|
BOOLEAN success;
|
|
char *fileName;
|
|
|
|
if ( argc > 1) {
|
|
fileName = argv[1];
|
|
} else {
|
|
fileName = "testfile.txt";
|
|
}
|
|
|
|
success = OpenFile( fileName, &handle );
|
|
if ( !success) {
|
|
return 1;
|
|
}
|
|
|
|
success = QueryFileInfo( handle );
|
|
if ( !success) {
|
|
return 1;
|
|
}
|
|
|
|
printf( "%s exiting\n", argv[0]);
|
|
return 0;
|
|
}
|
|
|
|
|
|
VOID
|
|
DisplayUsage(
|
|
PSZ ProgramName
|
|
)
|
|
{
|
|
printf( "Usage: %s [filename]", ProgramName);
|
|
}
|
|
|
|
|
|
BOOLEAN
|
|
OpenFile(
|
|
PSZ Name,
|
|
PHANDLE Handle
|
|
)
|
|
{
|
|
UNICODE_STRING nameString;
|
|
NTSTATUS status;
|
|
OBJECT_ATTRIBUTES objectAttributes;
|
|
IO_STATUS_BLOCK ioStatusBlock;
|
|
RTL_RELATIVE_NAME RelativeName;
|
|
STRING AnsiFileName;
|
|
UNICODE_STRING FileName;
|
|
BOOLEAN TranslationStatus;
|
|
|
|
RtlInitString( &AnsiFileName, Name );
|
|
RtlOemStringToUnicodeString( &FileName, &AnsiFileName, TRUE );
|
|
|
|
TranslationStatus = RtlDosPathNameToNtPathName_U(
|
|
FileName.Buffer,
|
|
&FileName,
|
|
NULL,
|
|
&RelativeName
|
|
);
|
|
|
|
if ( !TranslationStatus ) {
|
|
return FALSE;
|
|
}
|
|
|
|
if ( RelativeName.RelativeName.Length ) {
|
|
FileName = *(PUNICODE_STRING)&RelativeName.RelativeName;
|
|
} else {
|
|
RelativeName.ContainingDirectory = NULL;
|
|
}
|
|
|
|
//
|
|
// Open the file
|
|
//
|
|
|
|
InitializeObjectAttributes(
|
|
&objectAttributes,
|
|
&FileName,
|
|
OBJ_CASE_INSENSITIVE,
|
|
RelativeName.ContainingDirectory,
|
|
NULL
|
|
);
|
|
|
|
status = NtOpenFile (
|
|
Handle,
|
|
FILE_GENERIC_READ,
|
|
&objectAttributes,
|
|
&ioStatusBlock,
|
|
FILE_SHARE_WRITE | FILE_SHARE_READ,
|
|
0L
|
|
);
|
|
|
|
if (!NT_SUCCESS(status) ) {
|
|
printf( "Open status = %x for file %Z\n", status, &nameString );
|
|
}
|
|
|
|
RtlFreeHeap(RtlProcessHeap(), 0, FileName.Buffer );
|
|
return ( (BOOLEAN) NT_SUCCESS( status ) );
|
|
}
|
|
|
|
|
|
DoSleep(
|
|
IN ULONG time
|
|
)
|
|
{
|
|
ULONG ms;
|
|
LARGE_INTEGER delayTime;
|
|
|
|
ms = time * 100;
|
|
delayTime = RtlEnlargedIntegerMultiply( ms, -10000 );
|
|
NtDelayExecution( TRUE, (PLARGE_INTEGER)&delayTime );
|
|
|
|
return( 0 );
|
|
}
|
|
|
|
QueryFileInfo(
|
|
IN HANDLE Handle
|
|
)
|
|
{
|
|
NTSTATUS status;
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
char buffer[200];
|
|
PFILE_ALL_INFORMATION allInfo = (PFILE_ALL_INFORMATION)buffer;
|
|
|
|
status = NtQueryInformationFile(
|
|
Handle,
|
|
&IoStatusBlock,
|
|
allInfo,
|
|
200,
|
|
FileAllInformation );
|
|
|
|
if ( NT_SUCCESS( status ) ) {
|
|
status = IoStatusBlock.Status;
|
|
}
|
|
|
|
if ( !NT_SUCCESS( status ) ) {
|
|
printf("NtQueryInformation file returns %08lx\n", status );
|
|
return( status );
|
|
}
|
|
|
|
printf( "File attributes = %x\n", allInfo->BasicInformation.FileAttributes );
|
|
printf( "File size = %d\n", allInfo->StandardInformation.AllocationSize.LowPart );
|
|
printf( "Is a dir = %d\n", allInfo->StandardInformation.Directory );
|
|
printf( "Index = %x\n", allInfo->InternalInformation.IndexNumber );
|
|
printf( "Easiz = %d\n", allInfo->EaInformation.EaSize );
|
|
printf( "Access flags = %x\n", allInfo->AccessInformation.AccessFlags );
|
|
printf( "Current offset = %d\n", allInfo->PositionInformation.CurrentByteOffset.LowPart );
|
|
printf( "Mode = %x\n", allInfo->ModeInformation.Mode );
|
|
printf( "Alignment info = %d\n", allInfo->AlignmentInformation.AlignmentRequirement );
|
|
allInfo->NameInformation.FileName[ allInfo->NameInformation.FileNameLength / 2 ] = '\0';
|
|
printf( "Name = %ws\n", allInfo->NameInformation.FileName );
|
|
|
|
return( status );
|
|
}
|
|
|
|
|