/ / Windows replikacja dysku twardego w czasie rzeczywistym - c ++, windows, winapi, io, jądro

replikacja dysku twardego Windows w czasie rzeczywistym - c ++, windows, winapi, io, jądro

Pracuję nad projektem polegającym na asynchronicznej replikacji żądań zapisu systemu Windows z jednego dysku twardego na inny w czasie rzeczywistym.

Jestem nowy w rozwoju sterowników trybu jądra pod Windows, co mam na myśli to monitorowanie żądań We / Wy.

Dużo szukałem, ale ten obszar nie jest udokumentowany tak, jak powinien.

Przeprowadziłem wyszukiwanie i znalazłem 4 potencjalnych klientów (ale żaden z nich nie jest pewien, że najlepsza opcja na początek)

  • IRP

Pakiety żądań We / Wy używane przez sterowniki Windows do komunikacji między nimi a systemem operacyjnym, ale czy będę w stanie monitorować IRP używany przez sterownik dysku twardego? a co z bezpieczeństwem?

  • Sterowniki filtrów systemu Windows

istnieje wiele poziomów sterowników filtrów systemowych od górnego do dolnego, który należy zastosować? i Czy będę mógł filtrować operacje we / wy używane przez sterownik dysku twardego?

  • Haki IO

ta technika jest używana przez antywirusy systemu Windows do zaczepiania IO i sprawdzania plików. Czy w mojej sytuacji jest niezawodny?

  • śledzenie zdarzeń jądra

Używany przez narzędzie Microsoft Diskmon do monitorowania aktywności dysku twardego.

Problem polega na tym, że nie wiem od czego zacząć i jaka jest najlepsza opcja na początek pod względem wydajności i bezpieczeństwa.

Odpowiedzi:

1 dla odpowiedzi № 1

najpierw musisz doskonale zrozumieć windows Storage, Volumes, and File System Stacks I użyć Device Tree

określ, które urządzenie potrzebujesz filtrować, oraz jako UpperFilter lub Lowfilter. naprawdę potrzebujesz replikować dysk lub powiedzieć partycję (wolumin) na dysku lub w systemach plików do odczytu / zapisu?

w celu dołączenia do urządzenia możesz zarejestrować się w rejestrze, powiedzmy dla filtra dysku - poniżej HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlClass{4d36e967-e325-11ce-bfc1-08002be10318} w UpperFilters lub LowerFilters

czytać to przykład stosu pamięci twoje miejsce to (4) (LowFilter - będziesz filtrować IRP_MJ_SCSI do odczytu / zapisu) lub (7) (UpperFilter - będziesz filtrować IRP_MJ_READ/IRP_MJ_WRITE do odczytu / zapisu) kierowca musi być lub bezpośredni WDM (zarejestrować AddDevice w sterowniku) lub użyj KMDF (szkielet powłoki)

inne zastosowanie rozwiązania IoRegisterPlugPlayNotification(EventCategoryDeviceInterfaceChange&GUID_DEVINTERFACE_DISK) w celu dołączenia dysku FDO - tutaj zawsze będziesz UpperFilter

a najlepszym źródłem do zadawania tego rodzaju pytań, porad - jest osronline - Forum NTFSD lub NTDEV