|
|
// rootattr.c
#include <stdio.h>
#include <string.h>
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <ntioapi.h>
VOID _cdecl main ( int argc, char *argv[] ) { IO_STATUS_BLOCK ioStatusBlock; FILE_BASIC_INFORMATION basicInfo; HANDLE hFile; NTSTATUS status; char buffer[260];
//
// Get parameters
//
if (argc < 2) {
printf("This program returns or sets the attributes for the root directory.\n\n"); printf("usage: %s driveletter [new value]\n", argv[0]); return; }
strcpy( buffer, argv[1] ); strcat( buffer, "\\" );
hFile = CreateFile( buffer, MAXIMUM_ALLOWED, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | SECURITY_IMPERSONATION, NULL );
if ( hFile == INVALID_HANDLE_VALUE ) {
printf( "Error opening directory %s, error %d (decimal)\n", buffer, GetLastError() ); return; }
status = NtQueryInformationFile( hFile, &ioStatusBlock, &basicInfo, sizeof( basicInfo ), FileBasicInformation );
if (!NT_SUCCESS( status )) { printf( "Couldn't get attributes, error status %x\n", status ); CloseHandle( hFile ); return; }
printf( "Attributes for %s are currently: %0x\n", buffer, basicInfo.FileAttributes );
if (argc >= 3) {
//
// Third argument present, must be setting attributes.
//
sscanf( argv[2], "%02x", &basicInfo.FileAttributes );
printf( "Setting attributes for %s to: %0x\n", buffer, basicInfo.FileAttributes );
status = NtSetInformationFile( hFile, &ioStatusBlock, &basicInfo, sizeof( basicInfo ), FileBasicInformation ); if (NT_SUCCESS( status )) {
printf( "Set attributes succesfully\n" );
} else {
printf( "Couldn't set attributes, error status %x\n", status ); } }
CloseHandle( hFile ); return; }
|