ホームページ >バックエンド開発 >C++ >.NET を使用して NTFS 代替データ ストリームを読み取り、変更するにはどうすればよいですか?

.NET を使用して NTFS 代替データ ストリームを読み取り、変更するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-03 22:20:40312ブラウズ

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

.NET を使用した NTFS 代替データ ストリームの読み取りと変更

NTFS 代替データ ストリーム (ADS) は、通常のファイルに関連付けられた隠しデータ ストリームです。 New Technology File System (NTFS)。これらのストリームは、プライマリ ファイル データに影響を与えることなく、ユーザー コメント、バージョン履歴、マルチメディア コンテンツなどの追加情報を保存するために使用できます。

ADS の読み取り

ADS を読み取る場合は、dwDesiredAccess パラメータを GENERIC_WRITE に設定して CreateFileW 関数を使用できます。これにより、読み取りと書き込みの両方のためにストリームが開きます。その後、ReadFile 関数を使用してストリームの内容を読み取ることができます。

ADS の変更

ADS を変更するには、dwDesiredAccess パラメーターを次のように設定して CreateFileW 関数を使用できます。 GENERIC_WRITE。これにより、読み取りと書き込みの両方のためにストリームが開きます。次に、WriteFile 関数を使用して、新しいコンテンツをストリームに書き込むことができます。

ADS の読み取りと変更方法の C# の例を次に示します。

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;
}

以上が.NET を使用して NTFS 代替データ ストリームを読み取り、変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。