NtUtils هو إطار عمل لبرمجة نظام Windows في دلفي يوفر مجموعة من الوظائف مع معالجة أفضل للأخطاء وتكامل اللغة مقارنة برؤوس Winapi/Ntapi العادية، بالإضافة إلى مقتطفات التعليمات البرمجية المستخدمة بشكل متكرر وأنواع البيانات الذكية.
يمكنك العثور على بعض أمثلة التعليمات البرمجية في مستودع مخصص .
تحتوي المكتبة على هيكل متعدد الطبقات يتكون من ثلاث طبقات في المجمل:
Winapi.*.pas
والمكتبة Ntapi.*.pas
المضمنة في برنامجك؛ على الرغم من أنه قد يتطلب تحديد بادئة مساحة الاسم بشكل صريح في حالة وجود أسماء متعارضة.System.SysUtils
و System.Rtti
و System.Generics.Collections
.لذلك، كل ما تحتاجه موجود بالفعل في أحدث إصدار مجاني من دلفي. على سبيل المكافأة، يؤدي تجميع تطبيقات وحدة التحكم بدون RTTI (المعروف أيضًا باسم الانعكاس) إلى إنشاء ملفات تنفيذية صغيرة للغاية. انظر الأمثلة لمزيد من التفاصيل.
بما أن تضمين كل ملف من المكتبة في مشاريعك عادةً ما يكون زائدًا عن الحاجة، فيمكنك تكوين دلفي للاكتشاف التلقائي للملفات. بهذه الطريقة، يمكنك تحديد وحدة في قسم uses
، وستقوم دلفي تلقائيًا بإدراجها وتوابعها في المشروع. لتكوين المجلدات التي تقوم دلفي بإجراء البحث فيها، انتقل إلى المشروع -> الخيارات -> البناء -> مترجم دلفي وأضف الأسطر التالية إلى مسار البحث:
.NtUtilsLibrary
.NtUtilsLibraryHeaders
.NtUtilsLibraryNtUiLib
إذا كانت أسماء المجلدات أو مواقعها مختلفة بالنسبة لمشروعك، فستحتاج إلى ضبط هذه السطور وفقًا لذلك.
تشير المكتبة إلى حالات الفشل للمتصل عن طريق إرجاع قيم TNtxStatus غير الناجحة. TNtxStatus
(المحدد في NtUtils.pas) عبارة عن بنية تقوم بتخزين رمز الخطأ (متوافق مع أخطاء NTSTATUS
و HRESULT
وWin32) بالإضافة إلى بيانات التعريف حول طبيعة العملية التي تمت محاولة تنفيذها، مثل موقع الفشل وتتبع المكدس و تفاصيل أخرى مثل قناع الوصول المتوقع/المطلوب للمكالمات المفتوحة أو قيمة فئة المعلومات لمكالمات الاستعلام/المجموعة. للتحقق من نجاح TNtxStatus
، استخدم أسلوب IsSuccess
الخاص به. للوصول إلى رمز الخطأ الأساسي أو تعيينه (اعتمادًا على نوعه وتفضيلات المتصل)، استخدم خصائص مثل Status
و HResult
و HResultAllowFalse
Win32Error
و Win32ErrorOrSuccess
IsHResult
و IsWin32
وما إلى ذلك.
إذا كنت تفضل استخدام الاستثناءات، فيمكنك دائمًا استدعاء RaiseOnError()
على TNtxStatus
معين. لاحظ أنه ما لم تكن تريد حقًا استخدام الاستثناءات دون استيراد System.SysUtils
(وهو أمر ممكن)، فمن الأفضل تضمين NtUiLib.Exceptions الذي يجلب فئة استثناء ENtError
مخصصة (مشتقة من EOSError
المضمن).
يقوم NtUiLib.Errors بإرفاق أربع طرق لتمثيل قيم TNtxStatus
كسلاسل. على سبيل المثال، إذا كان الخطأ بالقيمة 0xC0000061
يأتي من محاولة تغيير معرف الجلسة لرمز مميز، فستعيد هذه الطرق المعلومات التالية:
طريقة | سلسلة تم إرجاعها |
---|---|
Name | STATUS_PRIVILEGE_NOT_HELD |
Description | A required privilege is not held by the client |
Summary | Privilege Not Held |
ToString | NtSetInformationToken returned STATUS_PRIVILEGE_NOT_HELD |
إذا كنت تريد المضي قدمًا وإظهار مربع رسالة جميل للمستخدم، فإن NtUiLib.Errors.Dialog يقدم ShowNtxStatus()
. بالإضافة إلى ذلك، فإن تضمين NtUiLib.Exceptions.Dialog سيوفر الدعم اللازم للتفكير ويثري الحوار بشكل أكبر. فيما يلي مثال لكيفية ظهوره:
يدعم TNtxStatus
التقاط آثار المكدس (معطل افتراضيًا). لتمكينه، قم بتعيين NtUtils.CaptureStackTraces
على True. ضع في اعتبارك أن عرض تتبعات المكدس بطريقة ذات معنى يتطلب تكوين إنشاء رموز التصحيح للملف القابل للتنفيذ. لسوء الحظ، يمكن لـ Delphi فقط إخراج ملفات .map
(التي تم تكوينها عبر Project -> Options -> Building -> Delphi Compiler -> Linking -> Map File) وهي غير كافية بشكل عام. ستحتاج إلى أداة Map2dbg تابعة لجهة خارجية لتحويلها إلى ملفات .dbg
.، حتى يتمكن API الخاص بالرمز من فهمها. على الرغم من أن ملفات .dbg
قد تكون كافية، إلا أنه من الأفضل معالجتها بشكل أكبر عن طريق التحويل إلى ملف .pdb
الحديث عبر cv2pdb .
لإنشاء رموز تصحيح الأخطاء تلقائيًا، أضف أحداث ما بعد الإنشاء التالية إلى مشروعك:
map2dbg.exe $(OUTPUTPATH)
cv2pdb64.exe -n -s. -p$(OUTPUTNAME).pdb $(OUTPUTPATH)
لا تتضمن دلفي أداة تجميع البيانات المهملة، لذلك يتم إدارة عدد قليل فقط من الأنواع خارج الصندوق: السجلات، والسلاسل، والمصفوفات الديناميكية، والواجهات. من ناحية أخرى، تتطلب الفئات والمؤشرات تنظيفًا صريحًا يتطلب (في شكله الآمن) استخدام كتل المحاولة النهائية ، وبالتالي يعقد البرنامج بشكل كبير. لمعالجة هذه المشكلة، تتضمن المكتبة تسهيلات للإدارة التلقائية لمدى الحياة للذاكرة والموارد الأخرى، والتي يتم تنفيذها في DelphiUtils.AutoObjects. باستخدام أنواع من هذه الوحدة، نطلب من المترجم أن يقوم تلقائيًا بإنشاء تعليمات برمجية آمنة للاستثناءات لحساب المراجع وتحرير الكائنات تلقائيًا في خاتمات الوظائف. تحدد هذه الوحدة عدة واجهات لأنواع مختلفة من الموارد التي قد تتطلب التنظيف. ويقدم التسلسل الهرمي التالي:
الرسم البياني LR؛
معرف الرسم البياني الفرعي 1 [أي مورد]
IAutoReleasable
نهاية
معرف الرسم البياني الفرعي 2 [قيمة Thandle]
IHandle
نهاية
معرف الرسم البياني الفرعي 3 [فئة دلفي]
IAutoObject[IAutoObject<T>]
نهاية
معرف الرسم البياني الفرعي 4 [مؤشر]
IAutoPointer[IAutoPointer<P>]
نهاية
معرف الرسم البياني الفرعي 5 [منطقة الذاكرة]
الذاكرة المؤقتة[الذاكرة<P>]
نهاية
IAutoReleasable --> IHandle;
IAutoReleasable --> IAutoObject;
IAutoReleasable --> IAutoPointer;
IAutoPointer --> IMemory;
IAutoReleasable
هو النوع الأساسي لجميع الموارد التي تتطلب اتخاذ إجراء بشأن التنظيف (التلقائي). يعمل IHandle
كمجمّع للموارد المحددة بواسطة قيمة Thandle. IAutoObject<T>
عبارة عن غلاف عام لإصدار فئات دلفي تلقائيًا (أي أي شيء مشتق من TObject). يعرّف IAutoPointer<P>
واجهة مشابهة لإصدار المؤشرات المخصصة ديناميكيًا (حيث يكون حجم المنطقة غير ذي صلة). يوفر IMemory<P>
غلافًا لمناطق الذاكرة ذات الأحجام المعروفة التي يمكن الوصول إليها عبر مؤشر مكتوب، مثل السجلات المعبأة المُدارة وغير المُدارة.
وصفة استخدام هذا المرفق هي كما يلي:
حدد كل متغير يحتاج إلى الحفاظ على الملكية (المحتملة المشتركة) لكائن ما باستخدام إحدى الواجهات:
استخدم المساعد التلقائي لتخصيص/نسخ/التقاط الكائنات التلقائية:
عند الضرورة، استخدم التحويل على الجانب الأيسر مما يساعد على تجنب تكرار معلومات الكتابة ويمكن أن يؤدي إلى تقصير بناء الجملة.
على سبيل المثال، إليك رمز آمن للعمل مع TStringList باستخدام الطريقة الكلاسيكية:
var
x: TStringList;
begin
x := TStringList.Create;
try
x.Add( ' Hi there ' );
x.SaveToFile( ' test.txt ' );
finally
x.Free;
end ;
end ;
كما يمكنك أن تتخيل، فإن استخدام المزيد من الكائنات في هذه الوظيفة سيؤدي إلى زيادة تعقيدها بشكل كبير وغير خطي. وبدلاً من ذلك، إليك الكود المكافئ الذي يستخدم IAutoObject ويتوسع بطريقة أفضل:
uses
DelphiUtils.AutoObjects;
var
x: IAutoObject<TStringList>;
begin
x := Auto.From(TStringList.Create);
x.Self.Add( ' Hi there ' );
x.Self.SaveToFile( ' test.txt ' );
end ;
يقوم المترجم بإصدار كود التنظيف الضروري في خاتمة الوظيفة ويتأكد من تنفيذه حتى في حالة حدوث استثناءات. بالإضافة إلى ذلك، يسمح هذا الأسلوب بالحفاظ على الملكية المشتركة للكائن الأساسي، مما يتيح لك حفظ مرجع يمكن أن يبقى أطول من الوظيفة الحالية (عن طريق التقاطه في وظيفة مجهولة وإعادته، على سبيل المثال). إذا لم تكن بحاجة إلى هذه الوظيفة وتريد الاحتفاظ بمالك واحد يحرر الكائن عند خروج الوظيفة، فيمكنك تبسيط بناء الجملة بشكل أكبر:
uses
NtUtils;
var
x: TStringList;
begin
x := Auto.From(TStringList.Create).Self;
x.Add( ' Hi there ' );
x.SaveToFile( ' test.txt ' );
end ;
لا يزال هذا الرمز مكافئًا للرمز الأولي. داخليًا، يقوم بإنشاء متغير محلي مخفي يقوم بتخزين الواجهة ثم يقوم بإصدار الكائن لاحقًا.
عند العمل مع عمليات تخصيص الذاكرة الديناميكية، قد يكون من المناسب استخدام عملية الصب على الجانب الأيسر على النحو التالي:
var
x: IMemory<PByteArray>;
begin
IMemory(x) := Auto.AllocateDynamic( 100 );
x.Data[ 15 ] := 20 ;
end ;
يمكنك أيضًا إنشاء سجلات مُدارة في مربع (مخصصة في الكومة) تسمح بمشاركة أنواع القيم كما لو كانت أنواعًا مرجعية. لاحظ أنها يمكن أن تتضمن أيضًا حقولًا مُدارة مثل سلاسل دلفي والمصفوفات الديناميكية - يُصدر المترجم تعليمات برمجية لتحريرها تلقائيًا:
type
TMyRecord = record
MyInteger: Integer;
MyArray: TArray<Integer>;
end ;
PMyRecord = ^TMyRecord;
var
x: IMemory<PMyRecord>;
begin
IMemory(x) := Auto.Allocate<TMyRecord>;
x.Data.MyInteger := 42 ;
x.Data.MyArray := [ 1 , 2 , 3 ];
end ;
بما أن دلفي تستخدم العد المرجعي، فلا يزال من الممكن تسرب الذاكرة إذا كان هناك كائنين لهما تبعية دائرية. يمكنك منع حدوث ذلك باستخدام مراجع ضعيفة . لا يتم احتساب مثل هذا المرجع لإطالة العمر، ويصبح المتغير الذي يخزنها تلقائيًا صفرًا عندما يتم تدمير الكائن المستهدف. تحتاج إلى ترقية مرجع ضعيف إلى مرجع قوي قبل أن تتمكن من استخدامه. راجع Weak<I> من DelphiUtils.AutoObjects لمزيد من التفاصيل.
هناك بعض الأسماء المستعارة المتاحة لأنواع المؤشرات ذات الحجم المتغير شائعة الاستخدام، إليك بعض الأمثلة:
تستخدم المقابض نوع IHandle (راجع DelphiUtils.AutoObjects)، الذي يتبع المنطق الذي تمت مناقشته أعلاه، لذا فهي لا تتطلب إغلاقًا صريحًا. يمكنك أيضًا العثور على بعض الأسماء المستعارة لـ IHandle (IScmHandle، وISamHandle، وILsaHandle، وما إلى ذلك)، والتي تتوفر فقط من أجل سهولة قراءة التعليمات البرمجية.
إذا احتجت في أي وقت إلى الحصول على ملكية قيمة المقبض في IHandle، فأنت بحاجة إلى فئة تنفذ هذه الواجهة بالإضافة إلى معرفة كيفية تحرير المورد الأساسي. على سبيل المثال، يحدد NtUtils.Objects هذه الفئة لكائنات kernel التي تتطلب استدعاء NtClose
. كما أنه يربط طريقة مساعدة بـ Auto
، مما يسمح بالتقاط مقابض kernel حسب القيمة عبر Auto.CaptureHandle(...)
. لإنشاء IHandle غير المالك، استخدم Auto.RefHandle(...)
.
تبدأ أسماء السجلات والفئات والتعدادات بحرف T
وتستخدم CamelCase (مثال: TTokenStatistics
). تبدأ المؤشرات إلى السجلات أو أنواع القيم الأخرى بـ P
(على سبيل المثال: PTokenStatistics
). تبدأ أسماء الواجهات بحرف I
(مثال: ISid
). تستخدم الثوابت ALL_CAPITALS. يتم تمييز كافة التعريفات من طبقة الرؤوس التي لها أسماء رسمية معروفة (مثل الأنواع المحددة في Windows SDK) بسمة SDKName
التي تحدد هذا الاسم.
تستخدم معظم الوظائف اصطلاح الاسم التالي: بادئة النظام الفرعي مع x في النهاية (Ntx، Ldrx، Lsax، Samx، Scmx، Wsx، Usrx، ...) + Action + Target/نوع الكائن/إلخ. تستخدم أسماء الوظائف أيضًا CamelCase.
تستهدف المكتبة نظام التشغيل Windows 7 أو الإصدارات الأحدث، الإصدارين 32 و64 بت. على الرغم من ذلك، قد تكون بعض الوظائف متاحة فقط على أحدث إصدارات 64 بت من Windows 11. بعض الأمثلة هي AppContainers وntdll syscall unhooking. إذا كانت وظيفة المكتبة تعتمد على واجهة برمجة التطبيقات (API) التي قد لا تكون موجودة في Windows 7، فإنها تستخدم الاستيراد المؤجل وتتحقق من التوفر في وقت التشغيل.
تأتي دلفي مزودة بنظام انعكاس غني تستخدمه المكتبة داخل طبقة NtUiLib . تم تزيين معظم الأنواع المحددة في طبقة الرؤوس بسمات مخصصة (راجع DelphiApi.Reflection) لتحقيق ذلك. تصدر هذه الزخارف بيانات وصفية مفيدة تساعد المكتبة على تمثيل أنواع البيانات المعقدة بدقة (مثل PEB وTEB وUSER_SHARED_DATA) في وقت التشغيل وإنتاج تقارير مذهلة باستخدام سطر واحد من التعليمات البرمجية.
فيما يلي مثال لتمثيل TSecurityLogonSessionData
من Ntapi.NtSecApi باستخدام NtUiLib.Reflection.Types:
هنا نظرة عامة على الغرض من الوحدات المختلفة.
وحدة الدعم | وصف |
---|---|
DelphiUtils.AutoObjects | إدارة عمر الموارد التلقائية |
DelphiUtils.AutoEvents | أحداث مجهولة متعددة المشتركين |
DelphiUtils.Arrays | مساعدين طاراي |
دلفيUtils.Lists | قائمة وراثية مزدوجة الارتباط بدائية |
DelphiUtils.Async | تعريفات دعم الإدخال/الإخراج غير المتزامن |
DelphiUtils.ExternalImport | مساعدي دلفي للكلمات الرئيسية الخارجية IAT |
DelphiUtils.RangeChecks | مساعدين فحص النطاق |
NtUtils | أنواع المكتبات الشائعة |
NtUtils.SysUtils | التلاعب بالسلسلة |
NtUtils.Errors | تحويل رمز الخطأ |
NtUiLib.Errors | خطأ في البحث عن اسم الرمز |
NtUiLib.Exceptions | تكامل استثناء SysUtils |
DelphiUiLib.Strings | تجميل السلسلة |
DelphiUiLib.Reflection | دعم RTTI الأساسي |
DelphiUiLib.Reflection.Numeric | تمثيل RTTI للأنواع الرقمية |
DelphiUiLib.Reflection.Records | تمثيل RTTI لأنواع السجلات |
DelphiUiLib.Reflection.Strings | تجميل RTTI للسلاسل |
NtUiLib.Reflection.Types | تمثيل RTTI للأنواع الشائعة |
NtUiLib.Console | مساعدي الإدخال/الإخراج لوحدة التحكم |
NtUiLib.TaskDialog | واجهة المستخدم الرسومية المستندة إلى TaskDialog |
NtUiLib.Errors.Dialog | مربع حوار خطأ واجهة المستخدم الرسومية |
NtUiLib.Exceptions.Dialog | مربع حوار استثناء واجهة المستخدم الرسومية |
وحدة النظام | وصف |
---|---|
NtUtils.ActCtx | سياقات التنشيط |
NtUtils.AntiHooking | إلغاء ربط النظام ومباشرته |
نتوتيلز.كوم | كوم، آي ديسباتش، وينرت |
NtUtils.Csr | تسجيل CSRSS/SxS |
NtUtils.DbgHelp | DbgHelp ورموز التصحيح |
NtUtils.Debug | كائنات التصحيح |
NtUtils.Dism | واجهة برمجة تطبيقات DISM |
NtUtils.Environment | متغيرات البيئة |
NtUtils.Environment.User | متغيرات بيئة المستخدم |
NtUtils.Environment.Remote | متغيرات البيئة للعمليات الأخرى |
NtUtils.Files | أسماء ملفات Win32/NT |
NtUtils.Files.Open | ملف وأنبوب مفتوح/إنشاء |
NtUtils.Files.Operations | عمليات الملف |
NtUtils.Files.Directories | تعداد دليل الملف |
NtUtils.Files.FltMgr | واجهة برمجة تطبيقات مدير التصفية |
NtUtils.Files.Mup | موفر UNC متعدد |
NtUtils.Files.Volumes | عمليات الحجم |
NtUtils.Files.Control | عمليات FSCTL |
NtUtils.ImageHlp | تحليل PE |
NtUtils.ImageHlp.Syscalls | استرجاع رقم Syscall |
NtUtils.ImageHlp.DbgHelp | الرموز العامة بدون DbgHelp |
NtUtils.Jobs | الكائنات الوظيفية والصوامع |
NtUtils.Jobs.Remote | استعلامات كائنات المهام المشتركة بين العمليات |
NtUtils.Ldr | إجراءات LDR والتحليل |
NtUtils.Lsa | سياسة LSA |
NtUtils.Lsa.Audit | سياسة التدقيق |
NtUtils.Lsa.Sid | بحث SID |
NtUtils.Lsa.Logon | جلسات تسجيل الدخول |
NtUtils.Manifests | منشئ بيان Fusion/SxS |
NtUtils.Memory | عمليات الذاكرة |
NtUtils.MiniDumps | تحليل تنسيق Minidump |
NtUtils.Objects | كائنات النواة والمقابض |
NtUtils.Objects.Snapshots | التعامل مع اللقطات |
NtUtils.Objects.Namespace | مساحة اسم كائن NT |
NtUtils.Objects.Remote | عمليات التعامل مع العمليات المتقاطعة |
NtUtils.Objects.Compare | التعامل مع المقارنة |
NtUtils.Packages | حزم التطبيقات وعائلات الحزمة |
NtUtils.Packages.SRCache | ذاكرة التخزين المؤقت لمستودع الدولة |
NtUtils.Packages.WinRT | معلومات الحزمة المستندة إلى WinRT |
NtUtils.Power | الوظائف المتعلقة بالطاقة |
NtUtils.Processes | كائنات العملية |
NtUtils.Processes.Info | عملية الاستعلام/معلومات المجموعة |
NtUtils.Processes.Info.Remote | معالجة الاستعلام/التعيين عبر حقن الكود |
NtUtils.Processes.Modules | تعداد LDR عبر العمليات |
NtUtils.Processes.Snapshots | تعداد العملية |
NtUtils.Processes.Create | تعريفات إنشاء العمليات الشائعة |
NtUtils.Processes.Create.Win32 | طرق إنشاء عملية Win32 |
NtUtils.Processes.Create.Shell | طرق إنشاء عملية شل |
NtUtils.Processes.Create.Native | NtCreateUserProcess وشركاه. |
NtUtils.Processes.Create.Manual | نتكريت بروسيسيكس |
NtUtils.Processes.Create.Com | إنشاء عملية تعتمد على COM |
NtUtils.Processes.Create.Csr | إنشاء العملية عبر SbApiPort |
NtUtils.Processes.Create.Package | تفعيل ابكس |
NtUtils.Processes.Create.Remote | إنشاء العملية عن طريق حقن الكود |
NtUtils.Processes.Create.Clone | عملية الاستنساخ |
NtUtils.Profiles | الملفات الشخصية للمستخدم وAppContainer |
NtUtils.Registry | مفاتيح التسجيل |
NtUtils.Registry.Offline | التلاعب بالخلية دون الاتصال بالإنترنت |
NtUtils.Registry.VReg | المحاكاة الافتراضية للتسجيل المستندة إلى الصومعة |
NtUtils.Sam | قاعدة بيانات سام |
NtUtils.Sections | كائنات إسقاط القسم/الذاكرة |
NtUtils.Security | واصفات الأمن |
NtUtils.Security.Acl | قوائم ACL وACEs |
NtUtils.Security.Sid | معرفات الأمان الجزرية |
NtUtils.Security.AppContainer | حاوية التطبيقات ومعرفات SID الخاصة بالقدرة |
NtUtils.Shellcode | حقن الكود |
NtUtils.Shellcode.Dll | حقن DLL |
NtUtils.Shellcode.Exe | حقن EXE |
NtUtils.Svc | خدمات اس سي ام |
NtUtils.Svc.SingleTaskSvc | تنفيذ الخدمة |
NtUtils.Synchronization | بدايات المزامنة |
NtUtils.System | معلومات النظام |
NtUtils.TaskScheduler | جدولة المهام |
NtUtils.Threads | كائنات الخيط |
NtUtils.Tokens.Info | استعلام الموضوع/معلومات المجموعة |
NtUtils.Threads.Worker | عمال الخيط (تجمعات الخيط) |
NtUtils.Tokens | كائنات رمزية |
NtUtils.Tokens.Impersonate | انتحال الرمز المميز |
NtUtils.Tokens.Logon | تسجيل دخول المستخدم وS4U |
NtUtils.Tokens.AppModel | سياسة Token AppModel |
NtUtils.Transactions | كائنات المعاملة (TmTx). |
NtUtils.Transactions.Remote | إجبار العمليات على المعاملات |
NtUtils.UserManager | واجهة برمجة تطبيقات خدمة إدارة المستخدم (Umgr). |
NtUtils.Wim | واجهة برمجة تطبيقات تصوير Windows (*.wim). |
NtUtils.WinSafer | واجهة برمجة تطبيقات أكثر أمانًا |
NtUtils.WinStation | واجهة برمجة تطبيقات الخادم الطرفي |
NtUtils.WinUser | واجهة برمجة تطبيقات المستخدم 32/واجهة المستخدم الرسومية |
NtUtils.WinUser.WindowAffinity | تعديل تقارب النافذة |
NtUtils.WinUser.WinstaLock | قفل وفتح محطات النوافذ |
NtUtils.XmlLite | تحليل وصياغة XML عبر XmlLite |
NtUiLib.AutoCompletion | الإكمال التلقائي لعناصر التحكم في التحرير |
NtUiLib.AutoCompletion.Namespace | الإكمال التلقائي لمساحة اسم كائن NT |
NtUiLib.AutoCompletion.Sid | SID الإكمال التلقائي |
NtUiLib.AutoCompletion.Sid.Common | موفري/أدوات التعرف على أسماء SID البسيطة |
NtUiLib.AutoCompletion.Sid.AppContainer | AppContainer وموفرو/أدوات التعرف على SID للحزمة |
NtUiLib.AutoCompletion.Sid.Capabilities | موفري/أدوات التعرف على SID للقدرة |
NtUiLib.WinCred | مربع حوار بيانات الاعتماد |