|
|
#include <stdio.h>
#include <nt.h>
VOID DisplayUsage( wchar_t *ExeName ) { printf( "This program tests opening a Volume with FILE_OPEN_REPARSE_POINT CreatOptions\n"); printf( "usage: %S [volume]\n", ExeName ); }
//
// Main program for TEST program
//
int _cdecl wmain(int argc, wchar_t *argv[]) { NTSTATUS status; NTSTATUS closeStatus; HANDLE volHandle; IO_STATUS_BLOCK ioStatusBlock; OBJECT_ATTRIBUTES obja; UNICODE_STRING fname; wchar_t nameBuf[128];
if (argc < 2) { DisplayUsage( argv[0] ); return 1; }
//
// Create file normally
//
wcscpy(nameBuf,L"\\??\\"); wcscat(nameBuf,argv[1]);
fname.Buffer = nameBuf; fname.MaximumLength = (USHORT)(sizeof( nameBuf ) * sizeof( wchar_t )); fname.Length = (USHORT)(wcslen( nameBuf ) * sizeof( wchar_t ));
InitializeObjectAttributes( &obja, &fname, OBJ_CASE_INSENSITIVE, NULL, NULL);
status = NtCreateFile( &volHandle, (GENERIC_READ | GENERIC_EXECUTE | SYNCHRONIZE), &obja, &ioStatusBlock, NULL, //Initial allocation size
FILE_ATTRIBUTE_NORMAL, //FileAttributes
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //ShareMode
FILE_OPEN, //CreateDisposition
(FILE_OPEN_FOR_BACKUP_INTENT | //CreateOptions
FILE_SEQUENTIAL_ONLY | FILE_OPEN_NO_RECALL | /*FILE_OPEN_REPARSE_POINT |*/ FILE_SYNCHRONOUS_IO_NONALERT), NULL,0); //ea buffer and length
if (status != 0) { printf("Error opening \"%S\" without FILE_FLAG_OPEN_REPARSE_POINT flag, status=%08x\n",argv[1],status); return 0; }
printf("Successfully opened \"%S\" without FILE_FLAG_OPEN_REPARSE_POINT set\n",argv[1]);
closeStatus = NtClose( volHandle ); if (closeStatus != 0) { printf("Close failed, status=%08x\n",closeStatus); }
//
// Create file with FILE_FLAG_OPEN_REPARSE_POINT flag.
//
status = NtCreateFile( &volHandle, (GENERIC_READ | GENERIC_EXECUTE | SYNCHRONIZE), &obja, &ioStatusBlock, NULL, //Initial allocation size
FILE_ATTRIBUTE_NORMAL, //FileAttributes
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //ShareMode
FILE_OPEN, //CreateDisposition
(FILE_OPEN_FOR_BACKUP_INTENT | //CreateOptions
FILE_SEQUENTIAL_ONLY | FILE_OPEN_NO_RECALL | FILE_OPEN_REPARSE_POINT | FILE_SYNCHRONOUS_IO_NONALERT), NULL,0); //ea buffer and length
if (status != 0) { printf("Error opening \"%S\" with FILE_FLAG_OPEN_REPARSE_POINT flag, status=%08x\n",argv[1],status); return 0; }
printf("Successfully opened \"%S\" with FILE_FLAG_OPEN_REPARSE_POINT set\n",argv[1]);
closeStatus = NtClose( volHandle ); if (closeStatus != 0) { printf("Close failed, status=%08x\n",closeStatus); }
return 0; }
|