// rootattr.c #include #include #include #include #include #include #include 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; }