mirror of
https://github.com/GhostPack/Lockless.git
synced 2026-11-08 08:06:09 -10:00
246 lines
7.4 KiB
C#
246 lines
7.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace LockLess
|
|
{
|
|
#region Structs and Enums
|
|
|
|
// result object that we output
|
|
public struct ProcessFileHandle
|
|
{
|
|
public string ProcessName;
|
|
public int ProcessID;
|
|
public string FileName;
|
|
public int FileHandleID;
|
|
public ProcessFileHandle(string processName, int processID, string fileName, int fileHandleID)
|
|
{
|
|
ProcessName = processName;
|
|
ProcessID = processID;
|
|
FileName = fileName;
|
|
FileHandleID = fileHandleID;
|
|
}
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct UNICODE_STRING : IDisposable
|
|
{
|
|
public ushort Length;
|
|
public ushort MaximumLength;
|
|
private IntPtr buffer;
|
|
|
|
public UNICODE_STRING(string s)
|
|
{
|
|
Length = (ushort)(s.Length * 2);
|
|
MaximumLength = (ushort)(Length + 2);
|
|
buffer = Marshal.StringToHGlobalUni(s);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Marshal.FreeHGlobal(buffer);
|
|
buffer = IntPtr.Zero;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return Marshal.PtrToStringUni(buffer);
|
|
}
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct SYSTEM_HANDLE_INFORMATION
|
|
{
|
|
public UInt32 ProcessId;
|
|
public Byte ObjectTypeNumber;
|
|
public Byte Flags;
|
|
public UInt16 HandleValue;
|
|
public IntPtr Object_Pointer;
|
|
public UInt32 GrantedAccess;
|
|
}
|
|
|
|
public struct OBJECT_NAME_INFORMATION
|
|
{
|
|
public UNICODE_STRING Name;
|
|
}
|
|
|
|
public enum NT_STATUS
|
|
{
|
|
STATUS_SUCCESS = 0x00000000,
|
|
STATUS_INFO_LENGTH_MISMATCH = unchecked((int)0xC0000004L),
|
|
STATUS_BUFFER_OVERFLOW = unchecked((int)0x80000005L),
|
|
INVALID_HANDLE = unchecked((int)0xc0000008L)
|
|
}
|
|
|
|
[Flags]
|
|
public enum FileMapProtection : uint
|
|
{
|
|
PageReadonly = 0x02,
|
|
PageReadWrite = 0x04,
|
|
PageWriteCopy = 0x08,
|
|
PageExecuteRead = 0x20,
|
|
PageExecuteReadWrite = 0x40,
|
|
SectionCommit = 0x8000000,
|
|
SectionImage = 0x1000000,
|
|
SectionNoCache = 0x10000000,
|
|
SectionReserve = 0x4000000,
|
|
}
|
|
|
|
[Flags]
|
|
public enum FileMapAccess : uint
|
|
{
|
|
FileMapCopy = 0x0001,
|
|
FileMapWrite = 0x0002,
|
|
FileMapRead = 0x0004,
|
|
FileMapAllAccess = 0x001f,
|
|
FileMapExecute = 0x0020,
|
|
}
|
|
|
|
public enum FileType : uint
|
|
{
|
|
Char = 0x0002,
|
|
Disk = 0x0001,
|
|
Pipe = 0x0003,
|
|
Remote = 0x8000,
|
|
Unknown = 0x0000,
|
|
}
|
|
|
|
public enum OBJECT_INFORMATION_CLASS
|
|
{
|
|
ObjectBasicInformation,
|
|
ObjectNameInformation,
|
|
ObjectTypeInformation,
|
|
ObjectAllInformation,
|
|
ObjectDataInformation
|
|
}
|
|
|
|
[Flags]
|
|
public enum ProcessAccessFlags : uint
|
|
{
|
|
All = 0x001F0FFF,
|
|
Terminate = 0x00000001,
|
|
CreateThread = 0x00000002,
|
|
VirtualMemoryOperation = 0x00000008,
|
|
VirtualMemoryRead = 0x00000010,
|
|
VirtualMemoryWrite = 0x00000020,
|
|
DuplicateHandle = 0x00000040,
|
|
CreateProcess = 0x000000080,
|
|
SetQuota = 0x00000100,
|
|
SetInformation = 0x00000200,
|
|
QueryInformation = 0x00000400,
|
|
QueryLimitedInformation = 0x00001000,
|
|
Synchronize = 0x00100000
|
|
}
|
|
|
|
[Flags]
|
|
public enum DuplicateOptions : uint
|
|
{
|
|
DUPLICATE_CLOSE_SOURCE = 0x00000001,
|
|
DUPLICATE_SAME_ACCESS = 0x00000002
|
|
}
|
|
|
|
public enum SYSTEM_INFORMATION_CLASS
|
|
{
|
|
SystemBasicInformation = 0,
|
|
SystemPerformanceInformation = 2,
|
|
SystemTimeOfDayInformation = 3,
|
|
SystemProcessInformation = 5,
|
|
SystemProcessorPerformanceInformation = 8,
|
|
SystemHandleInformation = 16,
|
|
SystemInterruptInformation = 23,
|
|
SystemExceptionInformation = 33,
|
|
SystemRegistryQuotaInformation = 37,
|
|
SystemLookasideInformation = 45
|
|
}
|
|
|
|
#endregion
|
|
|
|
|
|
#region Functions
|
|
|
|
public static class Ntdll
|
|
{
|
|
[DllImport("ntdll.dll", SetLastError = true)]
|
|
public static extern NT_STATUS NtQueryObject(
|
|
[In] IntPtr Handle,
|
|
[In] OBJECT_INFORMATION_CLASS ObjectInformationClass,
|
|
[Out] IntPtr ObjectInformation,
|
|
[In] int ObjectInformationLength,
|
|
[Out] out int ReturnLength);
|
|
|
|
[DllImport("ntdll.dll")]
|
|
internal static extern NT_STATUS NtQuerySystemInformation(
|
|
[In] SYSTEM_INFORMATION_CLASS SystemInformationClass,
|
|
[In] IntPtr SystemInformation,
|
|
[In] int SystemInformationLength,
|
|
[Out] out int ReturnLength);
|
|
}
|
|
|
|
public static class Kernel32
|
|
{
|
|
[DllImport("kernel32.dll", SetLastError = true)]
|
|
public static extern bool CloseHandle(IntPtr hObject);
|
|
[DllImport("kernel32.dll", SetLastError = true)]
|
|
public static extern IntPtr OpenProcess(ProcessAccessFlags processAccess, bool bInheritHandle, uint processId);
|
|
[DllImport("kernel32.dll", SetLastError = true)]
|
|
public static extern IntPtr GetCurrentProcess();
|
|
[DllImport("kernel32.dll", SetLastError = true)]
|
|
[return: MarshalAs(UnmanagedType.Bool)]
|
|
public static extern bool DuplicateHandle(IntPtr hSourceProcessHandle,
|
|
IntPtr hSourceHandle, IntPtr hTargetProcessHandle, out IntPtr lpTargetHandle,
|
|
uint dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, DuplicateOptions options);
|
|
[DllImport("kernel32.dll")]
|
|
public static extern uint QueryDosDevice(string lpDeviceName, System.Text.StringBuilder lpTargetPath, uint ucchMax);
|
|
|
|
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
|
|
public static extern IntPtr CreateFileMapping(
|
|
IntPtr hFile,
|
|
IntPtr lpFileMappingAttributes,
|
|
FileMapProtection flProtect,
|
|
uint dwMaximumSizeHigh,
|
|
uint dwMaximumSizeLow,
|
|
[MarshalAs(UnmanagedType.LPStr)] string lpName);
|
|
|
|
[DllImport("kernel32.dll", SetLastError = true)]
|
|
public static extern IntPtr MapViewOfFile(
|
|
IntPtr hFileMappingObject,
|
|
FileMapAccess dwDesiredAccess,
|
|
UInt32 dwFileOffsetHigh,
|
|
UInt32 dwFileOffsetLow,
|
|
UInt32 dwNumberOfBytesToMap);
|
|
|
|
[DllImport("kernel32.dll", SetLastError = true)]
|
|
public static extern bool UnmapViewOfFile(IntPtr lpBaseAddress);
|
|
|
|
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
|
|
public static extern IntPtr CreateFile(
|
|
string FileName,
|
|
uint DesiredAccess,
|
|
uint ShareMode,
|
|
IntPtr SecurityAttributes,
|
|
uint CreationDisposition,
|
|
uint FlagsAndAttributes,
|
|
IntPtr hTemplateFile
|
|
);
|
|
|
|
[DllImport("kernel32.dll", BestFitMapping = true, CharSet = CharSet.Ansi)]
|
|
public static extern bool WriteFile(
|
|
IntPtr hFile,
|
|
IntPtr buffer,
|
|
uint nNumberOfBytesToWrite,
|
|
out uint lpNumberOfBytesWritten,
|
|
IntPtr lpOverlapped);
|
|
|
|
[DllImport("kernel32.dll")]
|
|
public static extern bool GetFileSizeEx(IntPtr hFile, out long lpFileSize);
|
|
|
|
[DllImport("kernel32.dll")]
|
|
public static extern FileType GetFileType(IntPtr hFile);
|
|
|
|
[DllImport("kernel32.dll")]
|
|
public static extern uint GetLastError();
|
|
}
|
|
#endregion
|
|
}
|