9

USBストレージデバイスのすべてのバイトに0xFFを書き込むために、次のコードを記述しました。何らかの理由で、WriteFile()セクター242で呼び出しがエラーになり始めます。これを2つの別々のUSBストレージデバイスで実行し、16進エディターでデバイスを調べました。セクター242は、FAT16形式のデバイスではファイルアロケーションテーブルの開始であり、NTFSデバイスではブートエリアの開始であるように見えます。これらの正確な場所でエラーが発生していることは確かではありませんが、この動作を変更する方法がわかりません。HRESULT失敗したときに受け取っているのはWriteFile-2147024891ですE_ACCESSDENIED。何が問題を引き起こしているのか誰かが知っていますか?

注:ローカルシステムでこのコードを実行する場合は、USBデバイスの物理デバイスIDをハードコーディングしているため、十分に注意してください。書き込みを試みているデバイスでdeviceId変数を更新してください。あなたはあなたのハードドライブを破壊したくありません。

    public enum EMoveMethod : uint
    {
        Begin = 0,
        Current = 1,
        End = 2
    }

    [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern uint SetFilePointer([In] SafeFileHandle hFile, [In] long lDistanceToMove, [Out] out int lpDistanceToMoveHigh, [In] EMoveMethod dwMoveMethod);

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);

    [DllImport("kernel32", SetLastError = true)]
    internal extern static int ReadFile(SafeFileHandle handle, byte[] bytes, int numBytesToRead, out int numBytesRead, IntPtr overlapped_MustBeZero);

    [DllImport("kernel32.dll", SetLastError = true)]
    internal extern static int WriteFile(SafeFileHandle handle, byte[] bytes, int numBytesToWrite, out int numBytesWritten, IntPtr overlapped_MustBeZero);

    [DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true)]
    private static extern bool DeviceIoControl(SafeFileHandle hDevice, uint dwIoControlCode, byte[] lpInBuffer, int nInBufferSize, byte[] lpOutBuffer, int nOutBufferSize, out int lpBytesReturned, IntPtr lpOverlapped);

    [DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true)]
    private static extern bool CloseHandle(SafeFileHandle handle);

public void wipeDisk()
{
        const uint OPEN_EXISTING = 3;
        const uint GENERIC_WRITE = (0x40000000);
        const uint FSCTL_LOCK_VOLUME = 0x00090018;
        const uint FSCTL_UNLOCK_VOLUME = 0x0009001c;
        const uint FSCTL_DISMOUNT_VOLUME = 0x00090020;

        bool success = false;
        int intOut;
        string deviceId = @"\\.\PHYSICALDRIVE2";
        long DiskSize = 2056320000;

        SafeFileHandle diskHandle = CreateFile(deviceId, GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
        if (diskHandle.IsInvalid)
        {
            Console.WriteLine(deviceId + " open error.");
            return;
        }

        Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": opened.");

        success = DeviceIoControl(diskHandle, FSCTL_LOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
        if (!success)
        {
            Console.WriteLine(deviceId + " lock error.");
            CloseHandle(diskHandle);
            return;
        }

        Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": locked.");

        success = DeviceIoControl(diskHandle, FSCTL_DISMOUNT_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
        if (!success)
        {
            Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": dismount error.");
            DeviceIoControl(diskHandle, FSCTL_UNLOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
            CloseHandle(diskHandle);
            return;
        }

        Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": unmounted.");

        int numBytesPerSector = 512;
        long numTotalSectors = DiskSize / 512;

        byte[] junkBytes = new byte[512];
        for (int x = 0; x < 512; x++)
        {
            junkBytes[x] = 0xFF;
        }

        for (long sectorNum = 0; sectorNum < numTotalSectors; sectorNum++)
        {
            int numBytesWritten = 0;
            int moveToHigh;

            uint rvalsfp = SetFilePointer(diskHandle, sectorNum * numBytesPerSector, out moveToHigh, EMoveMethod.Begin);

            Console.WriteLine("File pointer set " + Marshal.GetHRForLastWin32Error().ToString() + ": " + (sectorNum * numBytesPerSector).ToString());

            int rval = WriteFile(diskHandle, junkBytes, junkBytes.Length, out numBytesWritten, IntPtr.Zero);

            if (numBytesWritten != junkBytes.Length)
            {
                Console.WriteLine("Write error on track " + sectorNum.ToString() + " from " + (sectorNum * numBytesPerSector).ToString() + "-" + moveToHigh.ToString() + " " + Marshal.GetHRForLastWin32Error().ToString() + ": Only " + numBytesWritten.ToString() + "/" + junkBytes.Length.ToString() + " bytes written.");
                break;
            }
            else
            {
                Console.WriteLine("Write success " + Marshal.GetHRForLastWin32Error().ToString() + ": " + numBytesWritten.ToString() + "/" + junkBytes.Length.ToString() + " bytes written.");
            }
        }

        success = DeviceIoControl(diskHandle, FSCTL_UNLOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
        if (success)
        {
            Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": unlocked.");
        }
        else
        {
            Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": unlock error: " + Marshal.GetHRForLastWin32Error().ToString());
        }

        success = CloseHandle(diskHandle);
        if (success)
        {
            Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": handle closed.");
        }
        else
        {
            Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": close handle error: " + Marshal.GetHRForLastWin32Error().ToString());
        }
}

編集/更新

サードパーティのツールを使用してUSBデバイスの低レベルのワイプを実行した後、これを正常に機能させることができました。ドライブが完全にゼロになった後、デバイスに正常に書き込むことができました。有効なfatまたはntfsファイルシステムとの使用を認識するとすぐに、Windowsがデバイスをロックしているように見えます

    const uint FSCTL_LOCK_VOLUME = 0x00090018;
    const uint FSCTL_DISMOUNT_VOLUME = 0x00090020;

とペアリングされDeviceIoControlていると、デバイスのロックウィンドウが無効になっていないようです。

DeviceIoControl有効なファイルシステムを備えたドライブを使用して、WindowsでリムーバブルUSBデバイスを正常にロックする方法を知っている人はいますか?

私は自分がやろうとしていることを実行するいくつかのサードパーティツールを使用しましたが、それらは正常に機能します。私はそれが可能であることを知っていますが、私が読んだすべてのMSDNドキュメントは問題の解決に役立っていません。

編集/更新2

これはhttps://web.archive.org/web/20130507212546/http://msdn.microsoft.com/en-us/library/ff551353.aspxから取得されます

アプリケーションは、DASD I / Oを発行する前に、ボリュームをロックするか、ボリュームをマウント解除するか、またはその両方を行う必要があります。これはWindowsVistaの新機能であり、潜在的に悪意のある手法に対処するために行われました。

  1. ファイルシステムは、ディスクの予約済みセクションへのすべての書き込み操作をブロックします。この場合、これらの予約済みセクションには、MBRと2つのFATエリアが含まれます。これらの領域をブロックするには、FSCTL_LOCK_VOLUMEを送信してボリュームをロックする必要があります。この構造は、実際の書き込み操作を実行するのと同じボリュームハンドルで発行する必要があります。開いているファイルハンドルがある場合、この要求は失敗する可能性があります。この場合、アプリケーションはFSCTL_DISMOUNT_VOLUMEを発行することにより、ファイルシステムのマウント解除を強制できます。ただし、ファイルハンドルが閉じられるまで、ボリュームは実際にはマウント解除されません。それまで、アプリケーションは、現在開いているのと同じファイルハンドルを使用して、DASD I/Oを発行し続けることができます。

  2. 書き込み操作がブロックされるファイルシステムに認識されているボリュームスペースを超える拡張領域があります。この領域への書き込み操作を許可するには、ボリューム・ハンドルでFSCTL_ALLOW_EXTENDED_DASD_IOを発行する必要があります。

Win32 APIルーチンDeviceIoControlを使用して、以前のすべてのFSCTSを発行できます。

これはまさに上記のコードで実装しているものだと思いますが、正しく機能していないようです。ハンドルを取得し、デバイスをロックおよびマウント解除しているので、保護された領域に正しく書き込むことができるはずですか?

編集/更新3

これがディスクとボリュームを開く現在の順序です。ロック、マウント解除などの方法は、私たちが間違っていると思う順序で機能します。

SafeFileHandle volumeHandle = CreateFile("\\.\E:",...);
LockVolume(volumeHandle);
DismountVolume(volumeHandle);
SafeFileHandle diskHandle = CreateFile("\\.\PHYSICALDRIVE1"...);
WriteStuff(diskHandle);
//Fails...
UnlockVolume(volumeHandle);
CloseVolume(volumeHandle);
CloseDisk(diskHandle);

私はまだ同じ結果を得ています、それはディスクがゴミ箱に捨てられたときはいつでも機能します。

4

5 に答える 5

5

ここでは、ディスクドライブの間に混乱があります。

ディスクへのフルアクセスが必要な場合(使用している場合)、マウントされているすべてのボリューム\\.\PHYSICALDRIVEをロックする必要があります。これは基本的に、物理ディスクのすべてのパーティション(つまりドライブ)です。

FSCTL_LOCK_VOLUMEによって返されたハンドルを使用する代わりに、パターンを使用して、マウントさCreateFile("\\.\PHYSICALDRIVE"...)れた各ボリューム(物理ディスクではなくドライブ)へのハンドルを取得します。string.Replace("\\\\.\\{0}:", DriveLetter)

を使用して、特定の物理ディスクのマウントされたボリュームのリスト(最終的には文字のリストが必要)を取得できますIOCTL_DISK_GET_DRIVE_LAYOUT


編集:

MSDNから:

次の条件のいずれかが当てはまる場合、ディスクハンドルへの書き込みは成功します。

書き込まれるセクターは、ボリュームの範囲内にありません。

マウントされたボリューム内に収まるように書き込まれるセクターですが、FSCTL_LOCK_VOLUMEまたはFSCTL_DISMOUNT_VOLUMEを使用して、ボリュームを明示的にロックまたはマウント解除しました。

RAW以外のファイルシステムがマウントされていないボリュームに含まれるように書き込まれるセクター。

したがって、基本的に、あなたがすべきことは次のとおりです。

  • 各ボリュームへのハンドルを取得します
  • FSCTL_LOCK_VOLUME または FSCTL_DISMOUNT_VOLUME各ボリュームで使用します。ボリュームでファイルが使用されていない場合(つまり、どのファイルに対してもプロセスによって開かれたハンドルがない場合)、FSCTL_LOCK_VOLUME十分です。
  • 物理ディスクへのハンドルを取得します
  • 物理ディスクへの書き込み
  • 両方のハンドルを閉じます。ボリュームハンドルを閉じると、ロックが解除されます。

また、管理者権限(昇格されたプロセス)でアプリケーションを実行していることを確認してください。

于 2012-08-24T17:14:38.773 に答える
1

使用中かそれ以降だと思いますWindows Vista。OSは、これらのセクターへの直接書き込みの試行をブロックするため、最初にロックを実行する必要があります。詳細はこちら:

http://msdn.microsoft.com/en-us/library/ff551353.aspx

また、SOをチェックインするだけで、この投稿が表示されます。

CreateFile:rawディスクへの直接書き込み操作「アクセスが拒否されました」-Vista、Win7

そこにある調査情報は役に立つかもしれません、HTH ...

于 2012-08-24T15:21:28.787 に答える
1

編集

ken2kの提案を反映するようにこの回答を編集しました。

ken2kの提案は、実際に私が抱えていた問題を修正しました。そのアプローチを使用した以前の試みが失敗した理由はわかりませんが、コードを再検討/微調整したばかりであり、そのアプローチは正しく機能しているように見えます。

この問題を解決するために使用した手順は次のとおりです。

  • 物理ディスクへのハンドルを取得する
  • 物理ディスク上の各論理ドライブへのハンドルを取得します
  • 物理ディスク上の各ドライブをロックする
  • 物理ディスク上の各ドライブをマウント解除します
  • 物理ディスクをロックする(オプション)
  • 物理ディスクをマウント解除します(オプション)
  • 物理ディスクハンドルを使用して、物理ディスク全体をゼロにします
  • 各論理ドライブのロックを解除します
  • 物理ディスクのロックを解除します(ディスクをロックすることを選択した場合のみ)
  • 論理ドライブのハンドルを閉じます
  • 物理ディスクハンドルを閉じます

注:プログラムを終了せずに連続してディスク操作を実行したい場合で、このFSCTL_DISMOUNT_VOLUME機能を使用したことがある場合は、次のようなものを使用してディスクを「再マウント」する必要があります。

ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_DiskDrive");

また

System.IO.DriveInfo.GetDrives();

個々の論理ドライブをロックしようとしているときに論理ドライブIDを物理ディスクIDにマップするには、次のコードを使用して論理ドライブラベルを物理ディスクラベルにリンクします。

    List<string> driveLetters = new List<string>();
    string deviceId = @"\\.\PHYSICALDRIVE1";
    string queryString = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + deviceId + "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition";
    ManagementObjectSearcher diskSearcher = new ManagementObjectSearcher("root\\CIMV2", queryString);
    ManagementObjectCollection diskMoc = diskSearcher.Get();
    foreach (ManagementObject diskMo in diskMoc)
    {
        queryString = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" + diskMo["DeviceID"] + "'} WHERE AssocClass = Win32_LogicalDiskToPartition";
        ManagementObjectSearcher driveSearcher = new ManagementObjectSearcher("root\\CIMV2", queryString);

        ManagementObjectCollection driveMoc = driveSearcher.Get();
        foreach (ManagementObject driveMo in driveMoc)
        {
            driveLetters.Add("\\\\.\\" + driveMo["DeviceID"].ToString());
        }
    }

したがって、たとえば、物理ディスクラベルが\\.\PHYSICALDRIVE1で、ドライブ文字が「E」の論理ドライブが1つ含まれている場合、上記のコードはにマップ\\.\E:され\\.\PHYSICALDRIVE1ます。

ken2kの提案によると、このマッピングはIOCTL_DISK_GET_DRIVE_LAYOUT機能を使用して行うこともできます。

于 2012-08-27T16:27:29.050 に答える
0

このコマンドのために私はそれを実行してチェックしました。 SafeFileHandle diskHandle = CreateFile(deviceId, GENERIC_WRITE, 0/*Here*/ , IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);

良好な結果を得るには、GENERIC_WRITEパラメーターの次の最初のゼロを平均FILE_SHARE_READ | FILE_SHARE_WRITE(1 | 2)で3に変更します。私はそれとデバイスIDを同じドライブ名に変更しました\。\f:私のusbドライブ名。最後に私はこのコード置換を使用しました: SafeFileHandle diskHandle = CreateFile(deviceId, GENERIC_WRITE, 3 , IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero); 幸運

于 2020-06-28T07:20:50.293 に答える
0

im test follow codeで、ルートキットウイルスを隠すためにUSBディスクを修復する必要があります。したがって、次のコードを記述します。

using Microsoft.Win32.SafeHandles;
using System;
using System.Collections.Generic;
using System.IO;
using System.Management;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace RootKeyremover
{
    public partial class Form1 : Form
    {
        public enum EMoveMethod : uint
        {
            Begin = 0,
            Current = 1,
            End = 2
        }

        [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern uint SetFilePointer([In] SafeFileHandle hFile, [In] long lDistanceToMove, [Out] out int lpDistanceToMoveHigh, [In] EMoveMethod dwMoveMethod);

        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);

        [DllImport("kernel32", SetLastError = true)]
        internal extern static int ReadFile(SafeFileHandle handle, byte[] bytes, int numBytesToRead, out int numBytesRead, IntPtr overlapped_MustBeZero);

        [DllImport("kernel32.dll", SetLastError = true)]
        internal extern static int WriteFile(SafeFileHandle handle, byte[] bytes, int numBytesToWrite, out int numBytesWritten, IntPtr overlapped_MustBeZero);

        [DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true)]
        private static extern bool DeviceIoControl(SafeFileHandle hDevice, uint dwIoControlCode, byte[] lpInBuffer, int nInBufferSize, byte[] lpOutBuffer, int nOutBufferSize, out int lpBytesReturned, IntPtr lpOverlapped);

        [DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true)]
        private static extern bool CloseHandle(SafeFileHandle handle);

        public Form1()
        {
            InitializeComponent();
        }

                   
        public void wipeDisk()
        {
            const short FILE_ATTRIBUTE_NORMAL = 0x80;
            const short INVALID_HANDLE_VALUE = -1;
            const uint GENERIC_READ = 0x80000000;
            const uint OPEN_EXISTING = 3;
            const uint GENERIC_WRITE = (0x40000000);
            const uint FSCTL_LOCK_VOLUME = 0x00090018;
            const uint FSCTL_UNLOCK_VOLUME = 0x0009001c;
            const uint FSCTL_DISMOUNT_VOLUME = 0x00090020;

            bool success = false;
            int intOut;
            //@"\\.\PHYSICALDRIVE2"
            string deviceId = @"\\.\" + comboBox1.Text.Substring(0,2);
            long DiskSize = 2056320000;

            SafeFileHandle diskHandle = CreateFile(deviceId, GENERIC_READ | GENERIC_WRITE, 3, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
            if (diskHandle.IsInvalid)
            {
                Console.WriteLine(deviceId + " open error.");
                return;
            }

            Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": opened.");

            success = DeviceIoControl(diskHandle, FSCTL_LOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
            if (!success)
            {
                Console.WriteLine(deviceId + " lock error.");
                CloseHandle(diskHandle);
                return;
            }

            Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": locked.");

            success = DeviceIoControl(diskHandle, FSCTL_DISMOUNT_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
            if (!success)
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": dismount error.");
                DeviceIoControl(diskHandle, FSCTL_UNLOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
                CloseHandle(diskHandle);
                return;
            }

            Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": unmounted.");

            int numBytesPerSector = 512;
            long numTotalSectors = DiskSize / 512;

            byte[] junkBytes = new byte[512];

            
            int k =0 ;
            IntPtr l= (IntPtr)0 ;
            SetFilePointer(diskHandle, 0, out k, EMoveMethod.Begin);
            ReadFile(diskHandle, junkBytes, (int)512,out k,l);
            //3e 17e 1f1-1fb
            //for (int x = 0x3e; x < 0x17e; x++)
            //{
            //    junkBytes[x] = 0x00;
            //}
            //for (int x = 0x1f1; x < 0x1fb; x++)
            //{
            //    junkBytes[x] = 0x00;
            //}
            for (int x = 0x1e1; x < 0x1ee; x++)
            {
                junkBytes[x] = 0x00;
            }

            //diskHandle = CreateFile(deviceId, GENERIC_WRITE, 3, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
            for (long sectorNum = 0; sectorNum < 1; sectorNum++)
            {
                int numBytesWritten = 0;
                int moveToHigh;

                uint rvalsfp = SetFilePointer(diskHandle, sectorNum * numBytesPerSector, out moveToHigh, EMoveMethod.Begin);

                Console.WriteLine("File pointer set " + Marshal.GetHRForLastWin32Error().ToString() + ": " + (sectorNum * numBytesPerSector).ToString());

                int rval = WriteFile(diskHandle, junkBytes, junkBytes.Length, out numBytesWritten, IntPtr.Zero);

                if (numBytesWritten != junkBytes.Length)
                {
                    Console.WriteLine("Write error on track " + sectorNum.ToString() + " from " + (sectorNum * numBytesPerSector).ToString() + "-" + moveToHigh.ToString() + " " + Marshal.GetHRForLastWin32Error().ToString() + ": Only " + numBytesWritten.ToString() + "/" + junkBytes.Length.ToString() + " bytes written.");
                    break;
                }
                else
                {
                    Console.WriteLine("Write success " + Marshal.GetHRForLastWin32Error().ToString() + ": " + numBytesWritten.ToString() + "/" + junkBytes.Length.ToString() + " bytes written.");
                }
            }

            success = DeviceIoControl(diskHandle, FSCTL_UNLOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero);
            if (success)
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": unlocked.");
            }
            else
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": unlock error: " + Marshal.GetHRForLastWin32Error().ToString());
            }

            success = CloseHandle(diskHandle);
            if (success)
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": handle closed.");
            }
            else
            {
                Console.WriteLine(deviceId + " " + Marshal.GetHRForLastWin32Error().ToString() + ": close handle error: " + Marshal.GetHRForLastWin32Error().ToString());
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            wipeDisk();
            MessageBox.Show("اتمام عملیات پاک سازی");
        }

        private void comboBox1_Click(object sender, EventArgs e)
        {
            comboBox1.Items.Clear();
            foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                if (drive.DriveType == DriveType.Removable)
                {
                    comboBox1.Items.Add(drive.Name);
                }
            }
            if (comboBox1.Items.Count <= 0)
                button2.Enabled = false;
            else
            {
                button2.Enabled = true;
                comboBox1.SelectedIndex = 0;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1_Click(null, null);

        }
    }
}
于 2020-06-29T05:44:53.263 に答える