Смысл нижеприведенного кода (который выполняется от имени LocalSystem) в том, чтобы к объекту виртуального диска, созданному драйвером, можно было обращаться лишь тому пользователю, который инициировал это создание.
Проблема в том, что необходимый результат достигается в WinXP и не достигается в Win2008R2: в Win2008R2 система будто бы игнорирует атрибуты безопасности объекта устройства при доступе к устройству, хотя все функции выполняются без ошибок и там и там; кроме того, WinObj показывает именно те атрибуты безопасности объекта устройства, которые назначаются ему этим кодом.
// назначаем символическую метку устройству, созданному драйвером
DefineDosDevice( DDD_RAW_TARGET_PATH, _T( "X:" ), _T( "\\Device\\Disk_X" );
// открываем, это устройство для изменения условий доступа к нему
HANDLE diskDeviceHandle = CreateFile( _T( "\\\\.\\Z:" ), STANDARD_RIGHTS_REQUIRED,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
// формируем необходимый нам дескриптор безопастности (accountSIDString здесь - это строка с SID, передаваемая в функцию сверху)
PSECURITY_DESCRIPTOR securityDescriptor = 0;
ConvertStringSecurityDescriptorToSecurityDescriptor(
_T( "D:(A;;GA;;;SY)(A;;RCWDWOGA;;;accountSIDString)" )
, SDDL_REVISION_1
, &securityDescriptor
, 0);
// берем из дескриптора безопастности DACL
BOOL daclPresent = TRUE;
BOOL daclDefaulted = FALSE;
PACL acl = 0;
GetSecurityDescriptorDacl( securityDescriptor, &daclPresent, &acl, &daclDefaulted );
// и собственно, назначаем его объекту
SetSecurityInfo( diskDeviceHandle
, SE_FILE_OBJECT
, DACL_SECURITY_INFORMATION
, 0, 0
, acl
, 0 );
Если кто-нибудь сталкивался с подобной проблемой, прошу откликнуться.
Заранее спасибо!