mirror of
https://github.com/stasenso/SHA256.git
synced 2026-06-27 05:42:43 +03:00
Исправно компилируется в DLL, но нет соглашения о вызовах
This commit is contained in:
@@ -0,0 +1,218 @@
|
||||
;Основные понятия базы данных.
|
||||
;1. База данных - хранилище директорий и файлов с произвольным содержанием.
|
||||
;Теоретически размер базы данных может изменяться от 104 байт (пустая база) до 2^64 байт.
|
||||
;2. Индекс - номер файлового смещения в базе данных. Используется в качестве относительного указателя на
|
||||
;директории, файлы и строки внутри базы данных. Исчисление индексов начинается с еденицы, а нулевой индекс
|
||||
;отмечает отсутствие директории, файла или строки с именем.
|
||||
;3. Директория - папка базы данных. Содержит массив номеров индексов других директорий, а также файлов
|
||||
;базы данных.
|
||||
;4. Файл базы данных - бинарные данные произвольного содержания.
|
||||
|
||||
;Основные структуры базы данных
|
||||
;1. Структура хранящая файловое смещение для определенного объекта.
|
||||
OBJ_INDEX struc
|
||||
Index ULONG64 ? ;Номер индекса
|
||||
BaseOffset ULONG64 ? ;Файловый оффсет на определенный объект (директорию, файл)
|
||||
NameInd ULONG64 ? ;Индекс строки содержащей имя объекта
|
||||
HostInd ULONG64 ? ;Номер индекса "директории владельца",
|
||||
;при удалении "директории владельца", её собственные
|
||||
;дочернии директории и файлы тоже удаляются
|
||||
FileSize ULONG64 ? ;размер директории или файла
|
||||
OBJ_INDEX ends
|
||||
LPOBJ_INDEX TYPEDEF PTR OBJ_INDEX
|
||||
;2. Структура хранящая файловое смещение на строку оканчивающуюся нулём.
|
||||
STR_INDEX struc
|
||||
Index ULONG64 ? ;Номер индекса
|
||||
BaseOffset ULONG64 ? ;Файловый оффсет для базы данных на строку
|
||||
UseCount ULONG64 ? ;Количество объектов использующих эту строку как имя
|
||||
STR_INDEX ends
|
||||
LPSTR_INDEX TYPEDEF PTR STR_INDEX
|
||||
;3. Заголовок файла базы данных с индексом корневой директории.
|
||||
DSM_VER_BASE equ -1
|
||||
BHEAD struc
|
||||
Signature CHAR "DSMBASE",0 ;Сигнатура файла базы
|
||||
RootIndex ULONG64 ? ;Индекс корневой директории
|
||||
IndStrCnt ULONG64 ? ;Количество индексов строк с именами директорий и файлов
|
||||
IndDirCnt ULONG64 ? ;Количество индексов директорий
|
||||
IndFileCnt ULONG64 ? ;Количество индексов файлов
|
||||
ErasedCnt ULONG64 ? ;Ранее удаленные индексы
|
||||
;т.е. это индексы которые снова могут быть использованны
|
||||
MaxIndex ULONG64 ? ;Номер самого большого использованного индекса
|
||||
;Начиная с 0.4 версии библиотеки dsmbase
|
||||
VersionID SQWORD DSM_VER_BASE ;ID версии формата базы данных
|
||||
IndStrRes ULONG64 ? ;Количество зарезервированных индексов строк
|
||||
IndDirRes ULONG64 ? ;Количество зарезервированных индексов директорий
|
||||
IndFileRes ULONG64 ? ;Количество зарезервированных индексов файлов
|
||||
ErasedRes ULONG64 ? ;Количество QWORD`ов зарезервированное для номеров удаляемых индексов
|
||||
BDirRes ULONG64 ? ;Количество QWORD`ов зарезервированное для новых директорий
|
||||
BHEAD ends
|
||||
PBHEAD TYPEDEF PTR BHEAD
|
||||
BASE_HEADER struc
|
||||
Signature CHAR "DSMBASE",0
|
||||
RootIndex ULONG64 ?
|
||||
IndStrCnt ULONG64 ?
|
||||
IndDirCnt ULONG64 ?
|
||||
IndFileCnt ULONG64 ?
|
||||
ErasedCnt ULONG64 ?
|
||||
MaxIndex ULONG64 ?
|
||||
BASE_HEADER ends
|
||||
LPBASE_HEADER TYPEDEF PTR BASE_HEADER
|
||||
;Сразу после заголовка распологается массив из IndStrCnt структур STR_INDEX,
|
||||
;далее идет массив индексов директорий OBJ_INDEX,
|
||||
;после массив индексов файлов OBJ_INDEX,
|
||||
;и в конце массив 64-битных чисел ранее использованных номеров индексов
|
||||
;Всё остальное будет приходиться на бинарные данные
|
||||
;Обобщенная структура индекса на случай директории, файла или строки
|
||||
INDEX struc
|
||||
Index ULONG64 ?
|
||||
BaseOffset ULONG64 ?
|
||||
union
|
||||
UseCount ULONG64 ?
|
||||
struc
|
||||
NameInd ULONG64 ?
|
||||
HostInd ULONG64 ?
|
||||
FileSize ULONG64 ?
|
||||
ends
|
||||
ends
|
||||
INDEX ends
|
||||
LPINDEX TYPEDEF PTR INDEX
|
||||
;Хэндл базы данных
|
||||
dsmbase struc
|
||||
hFile HANDLE ? ;хэндл файла
|
||||
hMap HANDLE ? ;хэндл мапирования
|
||||
lpBase LPBASE_HEADER ? ;указатель на мапированную базу данных
|
||||
BaseSize ULONG64 ? ;текущий размер базы данных
|
||||
FileSize ULONG64 ? ;текущий размер маппированного файла
|
||||
flProtect DWORD ? ;зарезервированно для перемапирования
|
||||
dwDesiredAccess DWORD ? ;зарезервированно для перемапирования
|
||||
dsmbase ends
|
||||
HDBASE TYPEDEF PTR dsmbase
|
||||
;Функции выполняют следующие операции
|
||||
;hBase - везде хэндл базы данных
|
||||
; 1. Создание новой или открытие существующей базы данных, обёртка вокруг CreateFileA
|
||||
;в rax возвращает хэндл базы данных
|
||||
CreateDataBase PROTO lpBaseName:LPSTR,dwDesiredAccess:DWORD,dwShareMode:DWORD,\
|
||||
lpSecurityAttributes:LPSECURITY_ATTRIBUTES,dwCreationDisposition:DWORD,\
|
||||
dwFlagsAndAttributes:DWORD,hTemplateFile:HANDLE
|
||||
; 2. Создание именной строки
|
||||
;AsciiStr - указатель на строку
|
||||
;UseCount - это обычно должно равняться нулю, записывается в поле STR_INDEX.UseCount
|
||||
;AsciiStrLen - длина строки AsciiStr
|
||||
;в rax возвращает номер индекса именной строки
|
||||
AddString PROTO hBase:HDBASE,AsciiStr:LPSTR,UseCount:ULONG64
|
||||
AddStringEx PROTO hBase:HDBASE,AsciiStr:LPSTR,UseCount:ULONG64,AsciiStrLen:ULONG64
|
||||
; 3. Удаление именной строки
|
||||
;sIndex - номер индекса строки
|
||||
DeleteStringEx PROTO hBase:HDBASE,sIndex:ULONG64,UseCount:ULONG64
|
||||
DeleteString PROTO hBase:HDBASE,sIndex:ULONG64
|
||||
; 4. Добавление файла
|
||||
;BinData - указатель на бинарные данные
|
||||
;SizeOfData - размер в байтах бинарных данных
|
||||
;HostInd - индекс "директории владельца"
|
||||
;FileName - указатель на имя файла
|
||||
;NameInd - номер индекса именной строки
|
||||
;в rax возвращает номер индекса файла или 0 если не получилось создать
|
||||
NewFile PROTO hBase:HDBASE,BinData:LPVOID,SizeOfData:ULONG64,HostInd:ULONG64,FileName:LPSTR
|
||||
AddFile PROTO hBase:HDBASE,BinData:LPVOID,SizeOfData:ULONG64,HostInd:ULONG64,NameInd:ULONG64
|
||||
; 5. Удаление файла
|
||||
;fIndex - номер индекса файла, который нужно удалить
|
||||
;HostIndex - номер индекса "директории владельца", если равно нулю то файл обязательно удаляется
|
||||
;в противном случае этот номер должен быть равен полю OBJ_INDEX.HostInd
|
||||
DelFile PROTO hBase:HDBASE,fIndex:ULONG64,HostIndex:ULONG64
|
||||
; 6. Создание директории
|
||||
;всё также как и для NewFile/AddFile
|
||||
;BinData здесь это указатель на список номеров индексов, обычно равняется нулю
|
||||
;SizeOfData должно быть кратно 8 и обычно равно нулю, т.е. в начале создается пустая директория
|
||||
;если HostInd равно нулю, то номер индекса создаваемой директории заносится в поле BASE_HEADER.RootIndex
|
||||
;в rax возвращает номер индекса созданной диретории или 0 если не получилось создать
|
||||
NewDirectory PROTO hBase:HDBASE,BinData:PULONG64,SizeOfData:ULONG64,HostInd:ULONG64,DirName:LPSTR
|
||||
AddDirectory PROTO hBase:HDBASE,BinData:PULONG64,SizeOfData:ULONG64,HostInd:ULONG64,NameInd:ULONG64
|
||||
; 7. Удаление директории
|
||||
;drIndex - номер индекса директории, которую нужно удалить
|
||||
;HostIndex - номер индекса "директории владельца", если равно нулю то директория обязательно удаляется
|
||||
;в противном случае этот номер должен быть равен полю OBJ_INDEX.HostInd
|
||||
DelDirectory PROTO hBase:HDBASE,drIndex:ULONG64,HostIndex:ULONG64
|
||||
; 8. Получение типа индекса
|
||||
curr_id=0
|
||||
enf NULL_TYPE, STR_TYPE, DIR_TYPE,FILE_TYPE
|
||||
enf OBJ_INCREASE,OBJ_DECREASE, IMM_SIZE
|
||||
;lpIndex - указатель на структуру INDEX
|
||||
;перед вызовом в структуре INDEX нужно указать номер индекса INDEX.Index остальное функция сама всё заполнит
|
||||
;в rax возвращает тип индекса STR_TYPE для строки, DIR_TYPE для директории,
|
||||
;FILE_TYPE для файла и 0 если если нету запрошенного индекса
|
||||
GetIndexType PROTO hBase:HDBASE,lpIndex:LPINDEX
|
||||
PPINDEX TYPEDEF PTR LPINDEX
|
||||
GetIndexTypeEx PROTO hBase:HDBASE,lpIndex:LPINDEX,ImmIndex:PPINDEX
|
||||
; 9. Получение индекса строки
|
||||
;lpIndex - указатель на структуру STR_INDEX
|
||||
;__buffer - если поле STR_INDEX.Index не равно нулю то это указатель на буфер для приёма строки иначе это
|
||||
; указатель на строку по которой будет искаться индекс
|
||||
;buf_size - размер буффера для приёма строки, если поле STR_INDEX.Index равно нулю то никак не используется
|
||||
;в rax возвращает размер строки
|
||||
GetString PROTO hBase:HDBASE,lpIndex:LPSTR_INDEX,__buffer:LPSTR,buf_size:ULONG64
|
||||
;10. Установка строки
|
||||
;__Index - номер индекса строки
|
||||
;__string - указатель на строку
|
||||
;в eax возвращает 1 если всё прошло успешно и 0 в противном случае
|
||||
SetString PROTO hBase:HDBASE,__Index:ULONG64,__string:LPSTR
|
||||
;11. Установка нового размера объекта, директории или файла
|
||||
;__Index - индекс директории или файла
|
||||
;__Type - указавает тип объекта DIR_TYPE или FILE_TYPE плюс способ изменения размера
|
||||
;OBJ_INCREASE увеличение на __Size байт
|
||||
;OBJ_DECREASE уменьшение на __Size байт
|
||||
;IMM_SIZE непосредственно новый размер __Size байт
|
||||
;NewSize - указатель на переменную для сохранения нового размера
|
||||
;в rax файловый указатель на объект, если к нему прибавить dsmbase.lpBase то это будет просто указатель на
|
||||
;тело объекта
|
||||
SetObjectSize PROTO hBase:HDBASE,__Index:ULONG64,__Type:DWORD,__Size:ULONG64,NewSize:PULONG64
|
||||
;11. Получение индекса из имени/пути объекта
|
||||
;RootDir - номер индекса базовой директории, может равняться нулю, тогда строка пути должна
|
||||
;будет начинаться с имени корневой директории
|
||||
;lpPath - указатель на строку пути, символы / и \ разделяют имена директорий и файлов
|
||||
;каких-то ограничений на использование определённых символов пока не предусмотренно, но это может измениться
|
||||
PathToIndex PROTO hBase:HDBASE,RootDir:ULONG64,lpPath:LPSTR
|
||||
PathToIndexEx PROTO hBase:HDBASE,RootDir:ULONG64,lpPath:LPSTR,PathSize:ULONG64
|
||||
;12. Получение имени/пути из индекса объекта
|
||||
;__Index - номер индекса директории или файла
|
||||
;lpPath - указатель на буфер для сохранения пути
|
||||
;PathSize - размер буфера
|
||||
;в eax 1 если все получилось, 0 если индекса не существует и -1 (0FFFFFFFFh) если буфер слишком мал
|
||||
IndexToPath PROTO hBase:HDBASE,__Index:ULONG64,lpPath:LPSTR,PathSize:ULONG64
|
||||
;13. Закрытие базы данных
|
||||
CloseDataBase PROTO hBase:HDBASE
|
||||
;14. Увеличение базы данных
|
||||
;Для оптимизации лучше увеличивать размер базы данных за ранее перед добавлением
|
||||
;большого количества файлов и директорий, особенно если есть возможность примерной оценки их общего размера
|
||||
IncreaseDataBase PROTO hBase:HDBASE,NumOfBytes:ULONG64
|
||||
;15. Увеличение базы данных
|
||||
DecreaseDataBase PROTO hBase:HDBASE,NumOfBytes:ULONG64
|
||||
;16. Получение/установка порядка объекта в своей "директории владельце"
|
||||
GetOrder PROTO hBase:HDBASE,objIndex:ULONG64,objOrder:PULONG64
|
||||
SetOrder PROTO hBase:HDBASE,objIndex:ULONG64,NewOrder:ULONG64
|
||||
;17. Переименование объекта.
|
||||
RenameObject PROTO hBase:HDBASE,objIndex:ULONG64,NewHost:ULONG64,NameInd:ULONG64
|
||||
;18. Добавление индекса в директорию
|
||||
AddRef PROTO hBase:HDBASE,drIndex:ULONG64,objIndex:ULONG64,objOrder:ULONG64
|
||||
;19. Удаление индекса из директории
|
||||
DeleteRef PROTO hBase:HDBASE,drIndex:ULONG64,objIndex:ULONG64,objOrder:ULONG64
|
||||
;20. Сортировка индексов строк для соблюдения алфавитного порядка
|
||||
SortStringIndices PROTO hBase:HDBASE
|
||||
;16. Получение/установка порядка ссылки на объект в определённой директории
|
||||
GetRefOrder PROTO hBase:HDBASE,drIndex:ULONG64,objIndex:ULONG64,objOrder:PULONG64
|
||||
SetRefOrder PROTO hBase:HDBASE,drIndex:ULONG64,objOrder:ULONG64,NewOrder:ULONG64
|
||||
;получение номера индекса по его порядку
|
||||
GetRefByOrder PROTO hBase:HDBASE,drIndex:ULONG64,objOrder:ULONG64
|
||||
GetFileIndexByNameInd PROTO hBase:HDBASE,lpIndex:LPINDEX,ImmIndex:PPINDEX
|
||||
GetDirIndex PROTO hBase:HDBASE,lpIndex:LPINDEX,ImmIndex:PPINDEX
|
||||
GetDirIndexAndUp PROTO hBase:HDBASE,lpIndex:LPINDEX,ImmIndex:PPINDEX
|
||||
SetStringEx PROTO hBase:HDBASE,__Index:ULONG64,__string:LPSTR,AsciiStrLen:ULONG64
|
||||
IncreaseStrRes PROTO hBase:HDBASE,StrRes:ULONG64
|
||||
IncreaseDirRes PROTO hBase:HDBASE,DirRes:ULONG64
|
||||
IncreaseFileRes PROTO hBase:HDBASE,FileRes:ULONG64
|
||||
IncreaseErasedRes PROTO hBase:HDBASE,ErdRes:ULONG64
|
||||
IncreaseBDirRes PROTO hBase:HDBASE,BDirRes:ULONG64
|
||||
GetFilePtr PROTO hBase:HDBASE,FileName:LPSTR,Host:ULONG64,FileSize:PULONG64
|
||||
;Закрытие базы данных, с определением формата
|
||||
curr_id=0
|
||||
enf B_COMPACT,B_LEGACY
|
||||
CloseDataBaseEx PROTO hdBase:HDBASE,dwFlags:DWORD
|
||||
Reference in New Issue
Block a user