Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
7 / 7 / 0
Регистрация: 05.08.2023
Сообщений: 49

Как работать с жестким диском на уровне эквивалетном уровню IRQL DISPATCH или выше?

01.09.2023, 19:25. Показов 5066. Ответов 41

Студворк — интернет-сервис помощи студентам
Всем привет!
Я пишу свой гипервизор и у меня всё-таки возникла необходимость после выхода из гостевой VM писать что-либо на жесткий диск.

строка 55
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
#include <ntddk.h>
 
#include "GuestContext.hpp"
#include "Logger/LogSpin.hpp"
#include "include/HyperVisor/HyperVisor.hpp"
 
HyperVisorSvm objHyperVisorSvm; 
Log objLog;
UINT64 Counter = 0;
 
#define LogInfo(format, ...)  \
    objLog.LogSendMessageToQueue(OPERATION_LOG_INFO_MESSAGE, false, false, "[+] Information (%s:%d) | " format "\n",    \
         __func__, __LINE__, __VA_ARGS__)
 
#define LogInfoImmediate(format, ...)  \
    objLog.LogSendMessageToQueue(OPERATION_LOG_INFO_MESSAGE, TRUE, false, "[+] Information (%s:%d) | " format "\n", \
         __func__, __LINE__, __VA_ARGS__)
 
#define LogWarning(format, ...)  \
    objLog.LogSendMessageToQueue(OPERATION_LOG_WARNING_MESSAGE, TRUE, false, "[-] Warning (%s:%d) | " format "\n",  \
        __func__, __LINE__, __VA_ARGS__)
 
#define LogError(format, ...)  \
    objLog.LogSendMessageToQueue(OPERATION_LOG_ERROR_MESSAGE, TRUE, false, "[!] Error (%s:%d) | " format "\n",  \
         __func__, __LINE__, __VA_ARGS__);  \
        DbgBreakPoint()
 
// Log without any prefix
#define Log(format, ...)  \
    objLog.LogSendMessageToQueue(OPERATION_LOG_INFO_MESSAGE, false, false, format "\n", __VA_ARGS__)
 
SVM::PRIVATE_VM_DATA* Interceptions(
    _Inout_ SVM::PRIVATE_VM_DATA* Private)
{
    Private->Guest.ControlArea.InterceptCpuid = TRUE;
    Private->Guest.ControlArea.InterceptVmrun = TRUE;
    //Private->Guest.ControlArea.InterceptExceptions.Bitmap.InterceptionVectorDB = TRUE;
    Private->Guest.ControlArea.InterceptMsr = TRUE;
    Private->Guest.ControlArea.MsrpmBasePa = reinterpret_cast<UINT64>(PhysicalMemory::GetPhysicalAddress(&Private->Msrpm));
 
    return Private;
}
 
void InjectEvent(__out SVM::VMCB* Guest, unsigned char Vector, unsigned char Type, unsigned int Code)
{
    SVM::EVENTINJ Event = {};
    Event.Bitmap.Vector = Vector;
    Event.Bitmap.Type = Type;
    Event.Bitmap.ErrorCodeValid = TRUE;
    Event.Bitmap.Valid = TRUE;
    Event.Bitmap.ErrorCode = Code;
    Guest->ControlArea.EventInjection = Event.Value;
}
 
extern "C" SVM::VMM_STATUS SvmVmexitHandler(
    _In_ SVM::PRIVATE_VM_DATA * Private,
    _In_ GuestContext * Context)
{
    // Load the host state:
    __svm_vmload(reinterpret_cast<size_t>(Private->VmmStack.Layout.InitialStack.HostVmcbPa));
 
    // Restore the guest's RAX that was overwritten by host's RAX on #VMEXIT:
    Context->Rax = Private->Guest.StateSaveArea.Rax;
 
    SVM::VMM_STATUS Status = SVM::VMM_STATUS::VMM_CONTINUE; 
    LogInfo("ExitCode %x\n", Private->Guest.ControlArea.ExitCode);
    LogInfo("Counter is %p\n", Counter);
    ++Counter;
 
    switch (Private->Guest.ControlArea.ExitCode)
    {
    case SVM::SVM_EXIT_CODE::VMEXIT_CPUID://== 0x72h
    {
        CPUID_REGS Regs = {};
        int Function = static_cast<int>(Context->Rax);
        int SubLeaf = static_cast<int>(Context->Rcx);
        __cpuidex(Regs.Raw, Function, SubLeaf);
 
        if (Function == CPUID_VMM_SHUTDOWN) { Status = SVM::VMM_STATUS::VMM_SHUTDOWN; }
        else 
        {
            Context->Rax = Regs.Regs.Eax;
            Context->Rbx = Regs.Regs.Ebx;
            Context->Rcx = Regs.Regs.Ecx;
            Context->Rdx = Regs.Regs.Edx;
        }
        break;
    }
    case SVM::SVM_EXIT_CODE::VMEXIT_MSR:
    {
        if ((Context->Rcx & MAXUINT32) == static_cast<unsigned int>(AMD::AMD_MSR::MSR_EFER) && Private->Guest.ControlArea.ExitInfo1)
        {
            AMD::EFER Efer = {};
            Efer.Value = ((Context->Rdx & MAXUINT32) << 32) | (Context->Rax & MAXUINT32);
            if (!Efer.Bitmap.SecureVirtualMachineEnable)
            {
                InjectEvent(&Private->Guest, INTERRUPT_VECTOR::GeneralProtection, EXCEPTION_VECTOR::FaultTrapException, 0); // #GP (Vector = 13, Type = Exception)
                break;
            }
            Private->Guest.StateSaveArea.Efer = Efer.Value;
        }
        break;
    }
    case SVM::SVM_EXIT_CODE::VMEXIT_VMRUN:
    {
        InjectEvent(&Private->Guest, INTERRUPT_VECTOR::GeneralProtection, EXCEPTION_VECTOR::FaultTrapException, 0); // #GP (Vector = 13, Type = Exception)
        break;
    }
    }
    
    KdPrint(("Exit code %p\n", Private->Guest.ControlArea.ExitCode));
 
    Private->Guest.StateSaveArea.Rax = Context->Rax;
 
    // Go to the next instruction:
    Private->Guest.StateSaveArea.Rip = Private->Guest.ControlArea.NextRip;
 
    return Status;
}
 
//Define in asm file(in my example)
extern "C" void SvmVmmRun(_In_ void* InitialVmmStackPointer);
 
void DrvUnload(_In_ PDRIVER_OBJECT DriverObj)
{
    UNREFERENCED_PARAMETER(DriverObj);
    KdPrint(("Sample driver Unload called\n"));
}
 
NTSTATUS DrvUnsupported(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
    UNREFERENCED_PARAMETER(DeviceObject);
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
    return STATUS_SUCCESS;
}
 
NTSTATUS DrvCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
    UNREFERENCED_PARAMETER(DeviceObject);
    objHyperVisorSvm.PInterceptions = &Interceptions;
    objHyperVisorSvm.PSvmVmmRun = &SvmVmmRun;
 
    if (objHyperVisorSvm.IsSvmSupported()) { LogInfoImmediate("Hypervisor start =)\n"); objHyperVisorSvm.VirtualizeAllProcessors(); }
 
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
    return STATUS_SUCCESS;
}
 
NTSTATUS DrvDispatchIoControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
    PIO_STACK_LOCATION  IrpStack;
    PREGISTER_EVENT RegisterEvent;
    NTSTATUS    Status;
    UNREFERENCED_PARAMETER(DeviceObject);
 
    IrpStack = IoGetCurrentIrpStackLocation(Irp);
 
    switch (IrpStack->Parameters.DeviceIoControl.IoControlCode)
    {
    case IOCTL_REGISTER_EVENT:
    {
        if (IrpStack->Parameters.DeviceIoControl.InputBufferLength < SIZEOF_REGISTER_EVENT || Irp->AssociatedIrp.SystemBuffer == NULL) {
            Status = STATUS_INVALID_PARAMETER;
            break;
        }
 
        RegisterEvent = (PREGISTER_EVENT)Irp->AssociatedIrp.SystemBuffer;
 
        switch (RegisterEvent->Type)
        {
        case IRP_BASED:
            Status = objLog.LogRegisterIrpBasedNotification(DeviceObject, Irp);
            break;
        case EVENT_BASED:
            Status = objLog.LogRegisterEventBasedNotification(DeviceObject, Irp);
            break;
        default:
            Status = STATUS_INVALID_PARAMETER;
            break;
        }
        break;
    }
    case IOCTL_BUFFER_CHECK:
    {
        RtlCopyBytes(Irp->AssociatedIrp.SystemBuffer, &objLog.BufferIsReady, sizeof(bool));
        Irp->IoStatus.Information = sizeof(bool);
        Irp->IoStatus.Status = STATUS_SUCCESS;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        Status = STATUS_SUCCESS;
 
        break;
    }
    case IOCTL_BUFFER_CHECK_SUCCESS:
    {
        objLog.BufferIsReady = FALSE;
        Irp->IoStatus.Status = STATUS_SUCCESS;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        Status = STATUS_SUCCESS;
 
        break;
    }
    }
    return STATUS_SUCCESS;
}
 
NTSTATUS DrvClose(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
    UNREFERENCED_PARAMETER(DeviceObject);
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
    return STATUS_SUCCESS;
}
 
extern "C" NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
{
    UNREFERENCED_PARAMETER(RegisterPath); NTSTATUS Ntstatus = STATUS_SUCCESS;
    PDEVICE_OBJECT DeviceObject = NULL; UNICODE_STRING DriverName, DosDeviceName;
 
    DbgPrint("[*] LogInitialize is started !\n");
    if (!objLog.LogInitialize()) { DbgPrint("[*] Log buffer is not initialized !\n"); DbgBreakPoint(); }
    DbgPrint("[*] LogInitialize done !\n");
    RtlInitUnicodeString(&DriverName, L"\\Device\\MyHypervisorDevice");
 
    RtlInitUnicodeString(&DosDeviceName, L"\\DosDevices\\MyHypervisorDevice");
    Ntstatus = IoCreateDevice(DriverObject, 0, &DriverName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &DeviceObject);
 
    if (Ntstatus == STATUS_SUCCESS)
    {
        for (UINT64 Index = 0; Index < IRP_MJ_MAXIMUM_FUNCTION; Index++) { DriverObject->MajorFunction[Index] = DrvUnsupported; }
 
        DriverObject->MajorFunction[IRP_MJ_CLOSE] = DrvClose;
        DriverObject->MajorFunction[IRP_MJ_CREATE] = DrvCreate;
        DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DrvDispatchIoControl;
        DriverObject->DriverUnload = DrvUnload;
        IoCreateSymbolicLink(&DosDeviceName, &DriverName);
    }
 
    return STATUS_SUCCESS;
}


https://github.com/Nitr0-G/SVM... in.cpp#L55

Когда я выхожу из гостевой VM и попадаю к себе, то я перехожу к SVMExitHandler(выше показан пример. Раскидываются коды аналогично того как это делает debug main loop по ExitCode, но только я нахожусь на уровне гипервизора, т.е. по сути на Ring -1 и управляю эксепшионами своего ЦП)

Пример с картинкой:



По сути я нахожусь на том месте, который я выделил красным квадратом. Моя задача писать из определенного ExitCode, к примеру DB Exception(single step трассировка) на жесткий диск (строка 70)
(https://github.com/Nitr0-G/SVM... in.cpp#L70)

Использование ZwWriteFile и т.п. API приводит к BSOD из-за того, что они хоть и вызываются формально на IRQL 0, но по сути я нахожусь на максимальном IRQL. В аналогии с Intel это называется VMX root mode(https://docs.hyperdbg.org/tips... -root-mode) у меня соответственно SVM root mode. Так вот встаёт главный вопрос, как драйвер для тех же sata жестких дисков выполняют на них запись? А ещё один вопрос: как происходит запись на RamDisk? Где я могу посмотреть возможные реализации того, что мне нужно и почитать теорию? Т.е. по сути мне нужно написать свою максимально низкоуровневую ZwWriteFile.

P.S.
Делаю это как свой проект. Сначала я пытаюсь вирутализировать свою систему, потом на этих наработках попытаюсь сделать свой гипервизор типа VirtualBox и т.п. с расширенными возможностями и меньшим детектом того, что Винда работает на гипервизоре типа VmWare со стороны системы и различных вирусов.
P.P.S.
Надеюсь на любую помощь:
Начиная с названий различных книг, которые мне помогут в решении проблемы выше и, заканчивая предложением того, что я могу пореверсить для того, чтобы понять как оно работает.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.09.2023, 19:25
Ответы с готовыми решениями:

Материнская плата работает с одним жестким диском и отказывается работать с другим
Всем доброго времени суток. Случилось такое, что материнская плата напрочь отказывается работать с рабочим жестким диском, но при...

Компьютер самостоятельно начинает работать с жестким диском после 20-30 минут простоя
Добрый день. Включенный компьютер, после 20-30 минут простоя начинает активно работать с жестким диском (с характерным звуком и...

Проблемы с компом или жестким диском
Проблема заключается вот в чем: Подключив жесткий диск с довольно старого компа, в первый раз при загрузке, комп его показал, но через...

41
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6215 / 2449 / 403
Регистрация: 29.07.2014
Сообщений: 3,181
Записей в блоге: 4
13.09.2023, 09:01
Студворк — интернет-сервис помощи студентам
Вот псевдодрайвер на fasm, который обходит все шины PCI в поисках ATA/SATA контроллёров.
Поскольку моя Win7-x64 не хочет его загружать с сообщением "Загрузка драйвера была заблокирована",
тестил на вирт.машине VirtualBox - результат на скрине.

Кстати почитать по теме: М.Гук "Интерфейсы устройств хранения: ATA, SCSI и другие"
https://ru.djvu.online/file/dWZH2qKsGdXAG

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
format   pe native at 100000h
include 'win32wx.inc'
entry    DriverEntry
 
section '.code' code executable readable writeable
bus       db  0
dev       db  0
func      db  0
reg       db  0
address   dd  0
 
txt       db  'VID/DID: 0x%08X    BDFR: 0x%08X',0
ata       db  '    ^^^  ATA  controller',0
sata      db  '    ^^^  SATA controller',0
 
align 16
proc   DriverEntry DriverObject, RegistryPath
 
@startScan:
        xor    eax,eax     ;//
        or     ah,80h      ;// AH = бит доступа в 1
        mov    al,[bus]    ;// AL = "Bus"
        shl    eax,16      ;// оформить доступ и шину в CONFIG_ADDRESS!
 
        mov    ah,[dev]    ;// AH = "Device"
        shl    ah,3        ;//
        or     ah,[func]   ;// добавить "Function"
        mov    al,[reg]    ;//
        shl    al,2        ;// AL = "Register"
        mov    [address],eax  ;// запомнить адрес BDFR
 
        mov    dx,0CF8h    ;//
        out    dx,eax      ;// CONFIG_ADDRESS для доступа
        mov    dx,0CFCh    ;//
        in     eax,dx      ;// считать VID/DID из кфг.пространства
        cmp    eax,-1      ;// FFFFFFFFh = нет устройства по данному адресу,
        jz     @nextSpace  ;//
 
;//---- Иначе: покажем VID/DID/BDFR --------------
        rol    eax,16
       cinvoke DbgPrint,txt,eax,[address]
 
;//---- Проверим "Class Code" --------------------
        mov    eax,[address]
        mov    al,2        ;//
        shl    al,2        ;// R=2
        mov    dx,0CF8h    ;//
        out    dx,eax      ;// обновить CONFIG_ADDRESS для доступа
        mov    dx,0CFCh    ;//
        in     eax,dx      ;// считать "Class Code" из CFG
        shr    eax,16      ;// оставить только Class-Subclass
 
        cmp    ax,0101h    ;// тест на ATA контроллёр
        jnz    @f
       cinvoke DbgPrint,ata
        jmp    @nextSpace
 
@@:     cmp    ax,0106h    ;// тест на SATA
        jnz    @nextSpace
       cinvoke DbgPrint,sata
 
;//---- Ставим сл.BDFR в адресе ----------------------
@nextSpace:
        inc    [func]        ;// сл.функция "Func"
        cmp    [func],8      ;// проверить на макс
        jnz    @startScan    ;// продолжить, если не предел
        mov    [func],0      ;// иначе: сбросить "Func" в нуль
 
        inc    [dev]         ;// ...и сл.устройство "Dev"
        cmp    [dev],32      ;//
        jnz    @startScan    ;// продолжить, если не достигли макс
        mov    [dev],0       ;// иначе: сбросить "Dev" в дефолт
 
        inc    [bus]         ;// ...и сл.шина "Bus"
        cmp    [bus],255     ;// все шины проверили?
        jz     @exit         ;// да: на выход
        jmp    @startScan    ;// нет: продолжить поиск SATA..
 
@exit:  mov    eax,0xC0000182 ;//<---- STATUS_DEVICE_CONFIGURATION_ERROR (выгрузить дров)
        ret
endp
;//---------------
section '.idata'  import data readable writeable
library  ntoskrnl,'ntoskrnl.exe'
import   ntoskrnl,DbgPrint,'DbgPrint'
;//---------------
section '.relocs' fixups readable writeable discardable

1
7 / 7 / 0
Регистрация: 05.08.2023
Сообщений: 49
13.09.2023, 13:22  [ТС]
Цитата Сообщение от R71MT Посмотреть сообщение
немного занят был.. позже отвечу.
Вас понял!
Цитата Сообщение от R71MT Посмотреть сообщение
насколько большой объём? вроде говорилось что-то около 500 КБ.
Это был как пример, а так сотни гигов или больше. Всё зависит от кол-ва исполненных инструкций в программе.

Сейчас такие скорости: https://youtu.be/z1eelDw3yv4

Цитата Сообщение от R71MT Посмотреть сообщение
Non-Paged это пул невыгружаемых в своп страниц. Их ввели потому, что ошибки отсутствия страниц "Page-Fault" не могут обслуживаться на уровне DPC/Dispatch и выше. Поэтому почти все страницы ядра невыгружаемые. Сначала система создаёт 4 выгружаемых пула (объединяются в общий), и 2 невыгружаемых. Доп.создаются в зависимости от количества NUMA-узлов в системе. Исходный размер Non-Paged определяется объёмом физ.памяти ОЗУ, и составляет ~10% от неё. Затем по мере необходимости пул может расширяться до макс.75%, что для х32 = 2ГБ, а для х64 = 128 ГБ. Текущие значения пулов можно посмотреть в "ProcessExplorer" (View->SysInfo), или командой !vm в отладчике WinDbg:
Спасибо за столь подробные рассказы обо всем!
Цитата Сообщение от R71MT Посмотреть сообщение
В дампах из CPUZ (которые вы высылали мне) наблюдаем всё тоже-самое, только поражает общее кол-во шин в системе – аж 51 штука.
Бывает =)

Извиняюсь, что не отвечал. Экспериментировал со своим кодом и судя из видео выше добился относительно нормальной скорости(адекватной), но хотелось бы, конечно, ещё быстрее, так как в моём случае у меня записываются все адреса всех мнемоник(в примере на видео общее кол-во ASM инструкций в программе: F5015A ), но может быть и больше, также мне ещё предстоит интегрировать многое типа того же дизассемблера, так что предстоит ещё много работы с записью =(

Кодярский:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
void TraceRipMessage::write_front(const void* Data, const size_t SizeOfData)
{ RtlCopyMemory(CurrentWriteIndex, Data, SizeOfData); CurrentWriteIndex += SizeOfData; DataWritten += SizeOfData; }
 
void TraceRipMessage::clear() { RtlZeroMemory(Start, AllSize); DataWritten = 0; Size = 0; CurrentWriteIndex = Start; }
 
size_t TraceRipMessage::size(const size_t SizeOfData) { Size = DataWritten / SizeOfData; return Size; }
 
void RtlInt64ToCharArray(_In_ uint64_t number, IN ULONG Base, _Out_ CHAR* hexString, _In_ size_t hexStringSize) 
{
    CHAR Buffer[65];
 
    PCHAR Pos = &Buffer[64];
    *Pos = '\0';
 
    do
    {
        Pos--;
        CHAR Digit = (CHAR)(number % Base);
        number = number / Base;
 
        if (Digit < 10)
            *Pos = '0' + Digit;
        else
            *Pos = 'A' + Digit - 10;
    } while (number != 0L);
 
    size_t Len = &Buffer[64] - Pos;
 
    if (Len < hexStringSize)
        Len += 1;
 
    RtlCopyMemory(hexString, Pos, Len);
}
 
char* attach_string_to_buffer(char* buffer, char* string_to_attach)
{
    int buffer_size = strlen(buffer);
    int string_size = strlen(string_to_attach);
    char* new_buffer = 
        (char*)ExAllocatePool(PagedPool, buffer_size + string_size + 1); // allocate memory for combined string
 
    strcpy(new_buffer, buffer); // copy original buffer to new buffer
    strcat(new_buffer, string_to_attach); // append string to new buffer
    return new_buffer;
}
//Call by IOCTL
void Trace::AcceptCombineBufferRipMessage(File& objFile, TraceRipMessage& buffer)
{
    while (buffer.Reading)
    {
        uint64_t* LocalCWI = buffer.Start;
        KdPrint(("Data written %p\n", buffer.size(sizeof(uint64_t))));
 
        PCH ValuesBuff213er = (PCH)ExAllocatePool(PagedPool, BufferSize);
        size_t ValuesLen = 0;
        PCH ValuesCWI = ValuesBuff213er;
        int counter = 0;
        for (uint64_t Rip = 0; Rip < buffer.size(sizeof(uint64_t)); ++Rip)
        {
            CHAR hexString_[17]; CHAR Characters[] = "\r\n";
            RtlZeroMemory(hexString_, sizeof(hexString_));
            RtlInt64ToCharArray(*LocalCWI, 16, hexString_, sizeof(hexString_));
            char* hexString = attach_string_to_buffer(hexString_, Characters);
 
            RtlCopyMemory(ValuesCWI, (const void*)hexString, strlen(hexString));//Value.Length * sizeof(WCHAR));
            ValuesCWI = (PCH)(uint64_t(ValuesCWI) + strlen(hexString));//(PWCH)(uint64_t(ValuesCWI) + (Value.Length * sizeof(WCHAR)));
            ValuesLen += strlen(hexString);
 
            LocalCWI += sizeof(uint64_t);
        }
        objFile.WriteFile(ValuesBuff213er, ValuesLen);
        ExFreePool(ValuesBuff213er);
        buffer.clear();
        KdPrint(("Fin!\n"));
        buffer.Reading = false;
        break;
    }
}
//Call on driver entry
bool Trace::TraceInitialize()
{
    MainBuffer.Start = (uint64_t*)ExAllocatePool(NonPagedPool, BufferSize);
    if (MainBuffer.Start == nullptr) { return false; }
    RtlZeroMemory(MainBuffer.Start, BufferSize);
 
    MainBuffer.AllSize = BufferSize;
    MainBuffer.CurrentWriteIndex = MainBuffer.Start;
    MainBuffer.End = MainBuffer.Start + BufferSize;
 
    ReserveBuffer.Start = (uint64_t*)ExAllocatePool(NonPagedPool, ReserveBufferSize);
    if (ReserveBuffer.Start == nullptr) { return false; }
    RtlZeroMemory(ReserveBuffer.Start, ReserveBufferSize);
 
    ReserveBuffer.AllSize = ReserveBufferSize;
    ReserveBuffer.CurrentWriteIndex = ReserveBuffer.Start;
    ReserveBuffer.End = ReserveBuffer.Start + ReserveBufferSize;
    
    return true;
}
 
#define IsEnoughMemoryForUint64InMainBuffer (uint64_t*)((uint64_t)MainBuffer.CurrentWriteIndex + sizeof(uint64_t)) <= MainBuffer.End
 
#define IsEnoughMemoryForUint64InReserveBuffer (uint64_t*)((uint64_t)ReserveBuffer.CurrentWriteIndex + sizeof(uint64_t)) <= ReserveBuffer.End
 
#define IsEnoughMemoryForReserveBuffer (uint64_t*)((uint64_t)MainBuffer.CurrentWriteIndex + ReserveBuffer.DataWritten) <= MainBuffer.End
 
void Trace::TraceRip(_In_ SVM::PRIVATE_VM_DATA* Private)
{
    if (!MainBuffer.Reading)
    {
        if (MainBuffer.CurrentWriteIndex < MainBuffer.End)
        {
            if (ReserveBuffer.DataWritten > 0)
            {
                if (IsEnoughMemoryForReserveBuffer) 
                { MainBuffer.write_front(ReserveBuffer.Start, ReserveBuffer.DataWritten); ReserveBuffer.clear();} 
                else { MainBuffer.Reading = true;}
            }
            if (IsEnoughMemoryForUint64InMainBuffer) { MainBuffer.write_front(&Private->Guest.StateSaveArea.Rip, sizeof(uint64_t)); } else { MainBuffer.Reading = true;}
        } else { MainBuffer.Reading = true; }
    }
    else
    {
        if (MainBuffer.Reading && IsEnoughMemoryForUint64InReserveBuffer) { ReserveBuffer.write_front(&Private->Guest.StateSaveArea.Rip, sizeof(uint64_t)); }
    }
}
 
void Trace::TraceRipFinalization(_In_ SVM::PRIVATE_VM_DATA* Private)
{
    if (!MainBuffer.Reading)
    {
        if (MainBuffer.CurrentWriteIndex < MainBuffer.End)
        {
            if (ReserveBuffer.DataWritten > 0 && IsEnoughMemoryForReserveBuffer)
            { MainBuffer.write_front(ReserveBuffer.Start, ReserveBuffer.DataWritten); ReserveBuffer.clear(); }
        } MainBuffer.Reading = true;
    }
 
    if (MainBuffer.Reading && ReserveBuffer.DataWritten > 0) { ReserveBuffer.Reading = true; Exit = true; }
}
Тогда сяду сегодня покурить книгу и попробую сделать так, как вы описывали выше.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.09.2023, 13:22

Траблы с жестким диском или кривые руки
Всем привет. Дело вот в чем. Хотел освободить место на компе. Жесткий диск был разделен на 2 раздела. На одном была семерка, на другом Хр....

Битва титанов или Недоразумения с жёстким диском
Размышления по поводу https://www.cyberforum.ru/hdd/thread1351872.html Продолжаете повторять ничем не обоснованные заявления? Вы в...

Что-то с жестким диском или комп на помойку?
Привет,народ! у меня &lt;цензура&gt; какаето с компом происходит...Вроде нормально всё а потом как щелчок какойто произносится откудато из...

Проблема с жестким диском или материнской платы
Добрый день. Помогите определить с чем проблема Появляется логотип Асер при загрузке, колесико крутится, далее черный экран и снова по...

Что за магия с жестким диском? Форматировать или нет?
Всем доброго времени суток, случилась беда откуда не ждал. Решил акрониксом раздел расширить, но произошел скачек электричества,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
42
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru