Чтение онлайн

на главную

Жанры

Системное программирование в среде Windows

Харт Джонсон М.

Шрифт:

 };

 LPSECURITY_ATTRIBUTES pSa = NULL;

 ModeIndex = Options(argc, argv, _T("fc"), &Force, &CreateNew, NULL);

 GrpIndex = ModeIndex + 2;

 FileIndex = ModeIndex + 1;

 DecMode = _ttoi(argv[ModeIndex]);

 /* Режим защиты представляет собой восьмеричное число. */

 Mode = ((DecMode / 100) % 10) * 64 /*Преобразовать в десятичное число.*/

+ ((DecMode / 10) % 10) * 8 + (DecMode % 10);

 Exists = (_taccess(argv[FileIndex], 0) == 0);

 if (!Exists && CreateNew) {

/*
Файл не существует; создать новый файл. */

GetUserName(UsrNam, &UsrCnt);

pSa = InitializeUnixSA(Mode, UsrNam, argv[GrpIndex], AceMasks, &hSecHeap);

hFile = CreateFile(argv[FileIndex], 0, 0, pSa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

CloseHandle(hFile);

HeapDestroy(hSecHeap); /* Освободить память, занимаемую структурами безопасности. */

 }

 else if (Exists) { /* Файл существует; изменить разрешения доступа. */

Change = ChangeFilePermissions(Mode, argv[FileIndex], AceMasks);

 }

 return 0;

}
 

В программе 15.2 представлена соответствующая часть команды lsFP, а именно, функция Process Item. 

Программа 15.2. lsFP: перечисление разрешений на доступ к файлу 

static BOOL ProcessItem(LPWIN32_FIND_DATA pFileData, DWORD NumFlags, LPBOOL Flags)

/* Вывести список атрибутов с указанием разрешений доступа и владельца. */

/* Требуются NTFS и Windows NT (под управлением Windows 9x программа работать не будет). */

{

 DWORD FType = FileType(pFileData), Mode, i;

 BOOL Long = Flags[1];

 TCHAR GrpNam[ACCT_NAME_SIZE], UsrNam[ACCT_NAME_SIZE];

 SYSTEMTIME LastWrite;

 TCHAR PermString[] = _T("---------");

 const TCHAR RWX[] = {'r','w','x'}, FileTypeChar[] = {' ', 'd'};

 if (FType != TYPE_FILE && FType != TYPE_DIR) return FALSE;

 _tprintf(_T("\n"));

 if (Long) {

Mode = ReadFilePermissions(pFileData->cFileName, UsrNam, GrpNam);

if (Mode == 0xFFFFFFFF) Mode = 0;

for (i = 0; i < 9; i++) {

if (Mode >> (8 – i) & 0x1) PermString[i] = RWX[i % 3];

}

_tprintf(_T("%c%s 18.7s %8.7s%10d"), FileTypeChar[FType – 1], PermString, UsrNam, GrpNam, pFileData->nFileSizeLow);

FileTimeToSystemTime(&(pFileData->ftLastWriteTime), &LastWrite);

_tprintf(_T(" %02d/%02d/%04d %02d:%02d:%02d"), LastWrite.wMonth, LastWrite.wDay, LastWrite.wYear, LastWrite.wHour, LastWrite.wMinute, LastWrite.wSecond);

 }

 _tprintf(_T(" %s"), pFileData->cFileName);

 return TRUE;

}
 

Далее

мы рассмотрим реализацию вспомогательных функций.

Пример: инициализация атрибутов защиты

Программа 15.3 представляет вспомогательную функцию InitializeUnixSA. Эта функция создает структуру атрибутов безопасности, которая содержит ACL с элементами АСЕ, эмулирующими разрешения на доступ к файлам в UNIX. Существует девять АСЕ, предоставляющих или запрещающих доступ по чтению, записи или запуску файлов на выполнение владельцу (owner), группе (group) и прочим пользователям (everyone). Эта структура не является локальной переменной функции и должна распределяться и инициализироваться, а затем возвращаться вызывающей программе; обратите внимание на массив AceMasks в программе 15.1.

Программа 15.3. InitUnFp: инициализация атрибутов защиты 

/* Задание режима доступа в стиле UNIX посредством элементов АСЕ, хранящихся в структуре SECURITY_ATTRIBUTES. */

#include "EvryThng.h"

#define ACL_SIZE 1024

#define INIT_EXCEPTION 0x3

#define CHANGE_EXCEPTION 0x4

#define SID_SIZE LUSIZE

#define DOM_SIZE LUSIZE

LPSECURITY_ATTRIBUTES InitializeUnixSA(DWORD UnixPerms, LPCTSTR UsrNam, LPCTSTR GrpNam, LPDWORD AceMasks, LPHANDLE pHeap) {

 HANDLE SAHeap = HeapCreate(HEAP_GENERATE_EXCEPTIONS, 0, 0);

 LPSECURITY_ATTRIBUTES pSA = NULL;

 PSECURITY_DESCRIPTOR pSD = NULL;

 PACL pAcl = NULL;

 BOOL Success;

 DWORD iBit, iSid, UsrCnt = ACCT_NAME_SIZE;

 /* Таблицы имен пользователя (User), группы (Group) и прочих пользователей (Everyone), идентификаторов SID и так далее для LookupAccountName и создания SID. */

 LPCTSTR pGrpNms[3] = {EMPTY, EMPTY, _T("Everyone")};

 PSID pSidTable[3] = {NULL, NULL, NULL};

 SID_NAME_USE sNamUse[3] = {SidTypeUser, SidTypeGroup, SidTypeWellKnownGroup};

 TCHAR RefDomain[3][DOM_SIZE];

 DWORD RefDomCnt[3] = {DOM_SIZE, DOM_SIZE, DOM_SIZE};

 DWORD SidCnt[3] = {SID_SIZE, SID_SIZE, SID_SIZE};

 __try { /* Блок try-except для исключений при распределении памяти. */

Поделиться:
Популярные книги

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

Карелин Сергей Витальевич
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 7

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец