Lecture et modification de flux de données alternatifs NTFS à l'aide de .NET
Les flux de données alternatifs NTFS (ADS) sont des flux de données cachés associés à des fichiers normaux dans le système de fichiers de nouvelle technologie (NTFS). Ces flux peuvent être utilisés pour stocker des informations supplémentaires, telles que des commentaires d'utilisateurs, l'historique des versions ou du contenu multimédia, sans affecter les données du fichier principal.
Lecture d'ADS
Pour lire un ADS, vous pouvez utiliser la fonction CreateFileW avec le paramètre dwDesiredAccess défini sur GENERIC_WRITE. Cela ouvrira le flux à la fois en lecture et en écriture. Vous pouvez ensuite utiliser la fonction ReadFile pour lire le contenu du flux.
Modification de l'ADS
Pour modifier un ADS, vous pouvez utiliser la fonction CreateFileW avec le paramètre dwDesiredAccess défini sur GENERIC_WRITE. Cela ouvrira le flux à la fois en lecture et en écriture. Vous pouvez ensuite utiliser la fonction WriteFile pour écrire de nouveaux contenus dans le flux.
Voici un exemple C# montrant comment lire et modifier un ADS :
using System.Runtime.InteropServices; class Program { static void Main(string[] args) { // Open the main file stream var mainStream = NativeMethods.CreateFileW( "testfile", NativeConstants.GENERIC_WRITE, NativeConstants.FILE_SHARE_WRITE, IntPtr.Zero, NativeConstants.OPEN_ALWAYS, 0, IntPtr.Zero); // Open the ADS stream var stream = NativeMethods.CreateFileW( "testfile:stream", NativeConstants.GENERIC_WRITE, NativeConstants.FILE_SHARE_WRITE, IntPtr.Zero, NativeConstants.OPEN_ALWAYS, 0, IntPtr.Zero); // Write data to the ADS stream var data = "Hello world!"; NativeMethods.WriteFile(stream, data, data.Length, out var bytesWritten, IntPtr.Zero); // Close the ADS stream NativeMethods.CloseHandle(stream); // Close the main file stream NativeMethods.CloseHandle(mainStream); } } public partial class NativeMethods { /// Return Type: HANDLE->void* ///lpFileName: LPCWSTR->WCHAR* ///dwDesiredAccess: DWORD->unsigned int ///dwShareMode: DWORD->unsigned int ///lpSecurityAttributes: LPSECURITY_ATTRIBUTES->_SECURITY_ATTRIBUTES* ///dwCreationDisposition: DWORD->unsigned int ///dwFlagsAndAttributes: DWORD->unsigned int ///hTemplateFile: HANDLE->void* [DllImportAttribute("kernel32.dll", EntryPoint = "CreateFileW")] public static extern System.IntPtr CreateFileW( [InAttribute()] [MarshalAsAttribute(UnmanagedType.LPWStr)] string lpFileName, uint dwDesiredAccess, uint dwShareMode, [InAttribute()] System.IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, [InAttribute()] System.IntPtr hTemplateFile ); /// Return Type: BOOL->int ///hFile: HANDLE->void* ///lpBuffer: LPVOID->void* ///nNumberOfBytesToWrite: DWORD->unsigned int ///lpNumberOfBytesWritten: LPDWORD->DWORD* ///lpOverlapped: LPOVERLAPPED->_OVERLAPPED* [DllImportAttribute("kernel32.dll", EntryPoint = "WriteFile")] public static extern int WriteFile( System.IntPtr hFile, [InAttribute()] System.IntPtr lpBuffer, uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten, [InAttribute()] System.IntPtr lpOverlapped ); /// Return Type: BOOL->int ///hObject: HANDLE->void* [DllImportAttribute("kernel32.dll", EntryPoint = "CloseHandle")] public static extern int CloseHandle( [InAttribute()] System.IntPtr hObject ); } public partial class NativeConstants { /// GENERIC_WRITE -> (0x40000000L) public const int GENERIC_WRITE = 1073741824; /// FILE_SHARE_DELETE -> 0x00000004 public const int FILE_SHARE_DELETE = 4; /// FILE_SHARE_WRITE -> 0x00000002 public const int FILE_SHARE_WRITE = 2; /// FILE_SHARE_READ -> 0x00000001 public const int FILE_SHARE_READ = 1; /// OPEN_ALWAYS -> 4 public const int OPEN_ALWAYS = 4; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!