ホームページ >バックエンド開発 >C++ >.NET で NTFS 代替データ ストリームの読み取り、書き込み、削除を行うにはどうすればよいですか?

.NET で NTFS 代替データ ストリームの読み取り、書き込み、削除を行うにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-04 18:37:39344ブラウズ

How Can I Read, Write, and Delete NTFS Alternate Data Streams in .NET?

.NET での NTFS 代替データ ストリーム アクセス

NTFS 代替データ ストリーム (ADS) の操作は、セキュリティやデータなどのさまざまなシナリオに不可欠です隠蔽。 .NET は、これらのストリームの読み取りと変更の両方を行う機能を提供します。

ADS の読み取り

ファイルに添付されたデータ ストリームを読み取るには、CreateFileW 関数を使用します。

using System.Runtime.InteropServices;

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

}

ファイル名の後にストリーム名をコロン (:) で区切って指定して、CreateFileW を呼び出します。例:

var stream = NativeMethods.CreateFileW("testfile:stream", ...);

ADS の変更

ストリームに書き込むかストリームを変更するには、返されたファイル ハンドルを使用して I/O 操作を実行するだけです。たとえば、ストリームに書き込むには:

using System.Runtime.InteropServices;

class Program
{
    static void Main(string[] args)
    {
        var stream = NativeMethods.CreateFileW("testfile:stream", ...);
        NativeMethods.WriteFile(stream, ...);
    }
}

public partial class NativeMethods
{

    /// Return Type: BOOL->int
    ///hFile: HANDLE->void*
    ///lpBuffer: LPCVOID->void*
    ///nNumberOfBytesToWrite: DWORD->unsigned int
    ///lpNumberOfBytesWritten: LPDWORD->DWORD*
    ///lpOverlapped: LPOVERLAPPED->OVERLAPPED*
    [DllImportAttribute("kernel32.dll", EntryPoint = "WriteFile")]
    [return: MarshalAsAttribute(UnmanagedType.Bool)]
    public static extern bool WriteFile(
        [InAttribute()] System.IntPtr hFile, 
        [InAttribute()] System.IntPtr lpBuffer, 
        uint nNumberOfBytesToWrite, 
        [OutAttribute()] [MarshalAsAttribute(UnmanagedType.U4)] out uint lpNumberOfBytesWritten, 
        [InAttribute()] System.IntPtr lpOverlapped
    );

}

同様に、次を使用してストリームを削除できます:

using System.Runtime.InteropServices;

class Program
{
    static void Main(string[] args)
    {
        var stream = NativeMethods.CreateFileW("testfile:stream", ...);
        NativeMethods.DeleteFile(stream);
    }
}

public partial class NativeMethods
{

    /// Return Type: BOOL->int
    ///lpFileName: LPCWSTR->WCHAR*
    [DllImportAttribute("kernel32.dll", EntryPoint = "DeleteFileW")]
    [return: MarshalAsAttribute(UnmanagedType.Bool)]
    public static extern bool DeleteFileW([InAttribute()] [MarshalAsAttribute(UnmanagedType.LPWStr)] string lpFileName);
}

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

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