windows-nt/Source/XPSP1/NT/base/fs/sis/tools/volreparsetest/volreparsetest.c
2020-09-26 16:20:57 +08:00

120 lines
3.7 KiB
C

#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;
}