Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Membaca dan Mengubah Strim Data Ganti NTFS Menggunakan .NET?

Bagaimanakah Saya Boleh Membaca dan Mengubah Strim Data Ganti NTFS Menggunakan .NET?

DDD
DDDasal
2025-01-03 22:20:40276semak imbas

How Can I Read and Modify NTFS Alternate Data Streams Using .NET?

Membaca dan Mengubah suai NTFS Strim Data Ganti Menggunakan .NET

NTFS Alternate Data Streams (ADS) ialah strim data tersembunyi yang dikaitkan dengan fail biasa dalam Sistem Fail Teknologi Baharu (NTFS). Strim ini boleh digunakan untuk menyimpan maklumat tambahan, seperti ulasan pengguna, sejarah versi atau kandungan multimedia, tanpa menjejaskan data fail utama.

Membaca ADS

Kepada membaca ADS, anda boleh menggunakan fungsi CreateFileW dengan parameter dwDesiredAccess ditetapkan kepada GENERIC_WRITE. Ini akan membuka strim untuk membaca dan menulis. Anda kemudiannya boleh menggunakan fungsi ReadFile untuk membaca kandungan strim.

Mengubah suai ADS

Untuk mengubah suai ADS, anda boleh menggunakan fungsi CreateFileW dengan parameter dwDesiredAccess ditetapkan kepada GENERIC_WRITE. Ini akan membuka strim untuk membaca dan menulis. Anda kemudiannya boleh menggunakan fungsi WriteFile untuk menulis kandungan baharu pada strim.

Berikut ialah contoh C# tentang cara membaca dan mengubah suai 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;
}

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membaca dan Mengubah Strim Data Ganti NTFS Menggunakan .NET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn