0

こんにちは、私はやろうとしていますが、FlushFileBuffers()常に番号 6 のエラーが発生します - ハンドルが無効です。

FlushFileBuffers()ドライブボリューム全体と特定のファイルハンドルに対しても実行しようとしましたが、同じ結果が得られました。

リモート プロセスのファイル ハンドルのファイル バッファをフラッシュしようとしています。

リモートプロセスで次のことを試みます。

public static bool FlushFileBuffersRemote(LockedFileEntry le)
{
    // StringBuilder sb = new StringBuilder(le.LockedFile);
    //UnloadModuleThreadProc umproc = new UnloadModuleThreadProc(UnloadModule);
    //IntPtr fpProc = Marshal.GetFunctionPointerForDelegate(umproc);                                                                                                    
    IntPtr currentProcess = NativeMethods.GetCurrentProcess();
    int processId = le.ProcessID;

    //StringBuilder sb=new StringBuilder(System.IO.Path.GetFileName(le.LockedFile));

    try
    {
        System.Threading.Thread.Sleep(200);

        IntPtr kernelMod = LoadLibrary("kernel32.dll");
        if (kernelMod == IntPtr.Zero)
            //throw new Exception("LoadLibrary of kernel32.dll failed");
            throw new Exception("Could not Flush File !");

        try
        {
            IntPtr freeLibraryAddr = GetProcAddress(kernelMod, "FlushFileBuffers");
            if (freeLibraryAddr == IntPtr.Zero)
                //throw new Exception("GetProcAddress of FreeLibrary failed");
                throw new Exception("Could not Flush File !");

            // Open the target process
            IntPtr proc = OpenProcess(ProcessAccessRights.PROCESS_ALL_ACCESS, true, (uint)processId);

            //IntPtr proc = OpenProcess(ProcessAccessRights.PROCESS_QUERY_INFORMATION | ProcessAccessRights.PROCESS_VM_OPERATION | ProcessAccessRights.PROCESS_VM_READ | ProcessAccessRights.PROCESS_VM_WRITE | ProcessAccessRights.PROCESS_CREATE_THREAD
            //, true, (uint)processId);

            if (proc == IntPtr.Zero)
                //throw new Exception("OpenProcess failed");
                throw new Exception("Could not Flush File !");

            SafeObjectHandle objectHandle = null;

            IntPtr handle = IntPtr.Zero;

            try
            {
                if (NativeMethods.DuplicateHandle(proc, le.HandlePtr, currentProcess, out objectHandle, 0, false, DuplicateHandleOptions.DUPLICATE_SAME_ACCESS))
                {
                    handle = objectHandle.DangerousGetHandle();
                }

                // Launch the thread, being FreeLibrary
                IntPtr remoteThreadHandle = CreateRemoteThread(proc, IntPtr.Zero, 0, freeLibraryAddr, handle, 0, IntPtr.Zero);
                if (remoteThreadHandle == IntPtr.Zero)
                    //throw new Exception("CreateRemoteThread failed");
                    throw new Exception("Could not Flush File !");

                return true;
            }
            finally
            {
                CloseHandle(proc);

                if (objectHandle != null)
                {
                    objectHandle.Close();
                }
            }
        }
        finally
        {
            FreeLibrary(kernelMod);
        }

        return true;
    }
    catch (Exception ex)
    {
        //Module.ShowError(ex);
        return false;
    }
}
4

0 に答える 0