
किसी C# प्रोजेक्ट में D/Invoke और अप्रत्यक्ष syscall विधियाँ जोड़ने के लिए स्रोत जनरेटर।
C# प्रोजेक्ट में D/Invoke और अप्रत्यक्ष syscall विधियों को जोड़ने के लिए सोर्स जनरेटर।
अपने प्रोजेक्ट में नवीनतम NuGet पैकेज जोड़ें और unsafe कोड की अनुमति दें।
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net481</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>12</LangVersion>
</PropertyGroup>
<!-- CsWhispers package -->
<ItemGroup>
<PackageReference Include="CsWhispers" Version="0.0.3" />
</ItemGroup>
<!-- Allow unsafe code -->
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
</Project>
अपने प्रोजेक्ट में CsWhispers.txt नामक एक फ़ाइल बनाएं और इसके बिल्ड एक्शन गुणों को AdditionalFiles पर सेट करें।
<ItemGroup>
<None Remove="CsWhispers.txt" />
<AdditionalFiles Include="CsWhispers.txt" />
</ItemGroup>
प्रत्येक NT API और किसी भी सहायक structs/enums को जोड़ें जिन्हें आप अपने प्रोजेक्ट में शामिल करना चाहते हैं। प्रत्येक को अपनी अलग पंक्ति में होना चाहिए, उदाहरण के लिए:
NtOpenProcess
HANDLE
NTSTATUS
CLIENT_ID
UNICODE_STRING
OBJECT_ATTRIBUTES
PWSTR
PCWSTR
समर्थित APIs की पूरी सूची के लिए प्रोजेक्ट Wiki देखें।
स्वच्छ कोड की अनुमति देने के लिए वैश्विक नामस्थान स्वचालित रूप से जोड़े जाते हैं।
public static unsafe void Main()
{
// use self as example
using var self = Process.GetCurrentProcess();
HANDLE hProcess;
OBJECT_ATTRIBUTES oa;
CLIENT_ID cid = new()
{
UniqueProcess = new HANDLE((IntPtr)self.Id)
};
var status = NtOpenProcess(
&hProcess,
PROCESS_ALL_ACCESS,
&oa,
&cid);
Console.WriteLine("Status: {0}", status.SeverityCode);
Console.WriteLine("HANDLE: 0x{0:X}", hProcess.Value.ToInt64());
}
CsWhispers में D/Invoke का एक न्यूनतम संस्करण शामिल है, इसलिए आप Generic.GetLibraryAddress, Generic.DynamicFunctionInvoke आदि भी कॉल कर सकते हैं।
सभी जनरेट किया गया कोड एक आंशिक CsWhispers.Syscalls क्लास में जाता है, जिसे आप अपने स्वयं के APIs जोड़ने के लिए विस्तारित कर सकते हैं। उदाहरण के लिए, MyAPIs.cs बनाएं और जोड़ें:
namespace CsWhispers;
public static partial class Syscalls
{
public static NTSTATUS NtCreateThreadEx()
{
// whatever
return new NTSTATUS(0);
}
}
इसे फिर आपके मुख्य कोड में बिना कोई अतिरिक्त using स्टेटमेंट जोड़े कॉल किया जा सकता है।
namespace ConsoleApp1;
internal static class Program
{
public static void Main()
{
var status = NtCreateThreadEx();
}
}
CsWhispers.txt में घोषित किए बिना structs/enums को अंतर्निहित रूप से जोड़ें।यह प्रोजेक्ट विशेष रूप से SysWhipsers और SharpWhispers के पिछले संस्करणों से प्रेरित था। तो @Jackson_T, @KlezVirus, @d_glenx, और बाकी सभी को धन्यवाद जिन्होंने कोड और/या विचारों का योगदान दिया।