ویرگول
ورودثبت نام
سید عمید قائم مقامی
سید عمید قائم مقامیبرنامه نویسی سیستم ویندوز و مهندسی معکوس و علاقه مند به آموزش.
سید عمید قائم مقامی
سید عمید قائم مقامی
خواندن ۱۷ دقیقه·۱۲ روز پیش

Windows System Internals (Chapter 1 Concepts and tools)

حالت کاربر (User-mode) برنامه‌ریزی نخ‌ها (Threads)، که تنها در نسخه‌های ۶۴ بیتی ویندوز در دسترس است، همان مزایای اصلی فیبرها را فراهم می‌آورد — و تنها چند عیب دارد. نخ‌های حالت کاربر دارای وضعیت هسته‌ای خود هستند و بنابراین در مقابل هسته قابل مشاهده‌ند، که این امکان را فراهم می‌کند تا چندین نخ حالت کاربر عملیات مسدودکننده را انجام دهند، منابع را به اشتراک بگذارند و بر سر آن‌ها رقابت کنند. یا، زمانی که دو یا چند نخ حالت کاربر نیاز به انجام کار در حالت کاربر دارند، می‌توانند به‌طور دوره‌ای زمینه اجرای خود را تغییر دهند (با رها کردن از یک نخ به دیگری) در حالت کاربر، بدون نیاز به درگیری با زمان‌بندی. از دید هسته، همان نخ هسته‌ای همچنان در حال اجرا است و هیچ چیز تغییر نمی‌کند. زمانی که یک نخ حالت کاربر عملیاتی انجام دهد که نیاز به ورود به هسته دارد (مانند یک تماس سیستم‌کمک)، به نخ هسته‌ای اختصاصی خودش (که به آن تغییر زمینه مستقیم گفته می‌شود) سوئیچ می‌کند. در حالی که نخ‌های هم‌زمان حالت کاربر هنوز نمی‌توانند بر روی چند پردازنده اجرا شوند، اما از مدل غیرفعال لازم پیروی می‌کنند که تنها به صورت تعاونی نیست.

اگرچه نخ‌ها دارای زمینه اجرایی خود هستند، اما هر نخ در یک فرآیند، فضای آدرس مجازی همان فرآیند را به اشتراک می‌گذارد (علاوه بر سایر منابع مربوط به آن فرآیند). بنابراین، تمام نخ‌های یک فرآیند دسترسی کامل خواندن و نوشتن به فضای آدرس مجازی آن فرآیند دارند. با این حال، نخ‌ها نمی‌توانند به طور تصادفی به فضای آدرس فرآیند دیگری ارجاع دهند، مگر اینکه فرآیند دیگر بخشی از فضای آدرس خصوصی خود را به عنوان یک بخش حافظه مشترک (که در API ویندوز به آن شیء نگاشت فایل گفته می‌شود) در اختیار قرار دهد، یا اینکه یک فرآیند حق داشته باشد فرآیند دیگری را باز کند و توابع حافظه فرآیند مانند ReadProcessMemory و WriteProcessMemory را اجرا کند (که به صورت پیش‌فرض، فرآیندی با همان حساب کاربری و در داخل یک AppContainer یا نوع دیگری از sandbox، می‌تواند این کار را انجام دهد، مگر اینکه فرآیند هدف از نظر حفاظتی محافظت شده باشد).

علاوه بر فضای آدرس خصوصی و یک یا چند نخ، هر فرآیند دارای یک زمینه امنیتی است و فهرستی از هندل‌های باز به اشیاء هسته‌ای مانند فایل‌ها، بخش‌های حافظه مشترک، یا یکی از اشیاء هم‌زمان‌سازی مانند موتیج‌ها، رویدادها یا سمفورها است، همان‌طور که در شکل ۱-۲ نشان داده شده است.

هر فرآیند دارای یک زمینه امنیتی است که در یک شیء به نام توکن دسترسی (access token) ذخیره می‌شود. توکن دسترسی فرآیند شامل شناسایی امنیتی و اعتبارنامه‌های مربوط به آن فرآیند است. به طور پیش‌فرض، نخ‌ها توکن دسترسی خاص خود را ندارند، اما می‌توانند یکی دریافت کنند، که این امکان را فراهم می‌آورد تا نخ‌های فردی بتوانند زمینه امنیتی یک فرآیند دیگر — از جمله فرآیندهای روی یک سیستم ویندوز راه دور — را به صورت کوتاه‌مدت به‌صورت شخصی، تقلید کنند، بدون اینکه بر دیگر نخ‌های همان فرآیند تأثیر بگذارند. (برای اطلاعات بیشتر درباره امنیت فرآیند و نخ، به فصل ۷ مراجعه کنید).

افزون بر این، ساختارهای داده‌ای به نام Descriptors آدرس مجازی (VAD‌ها) وجود دارند که مدیر حافظه از آن‌ها برای پیگیری آدرس‌های مجازی مورد استفاده در فرآیند بهره می‌برد.


هایپروایزر

تحولات اخیر در مدل‌های کاربردی و نرم‌افزاری، همانند معرفی خدمات مبتنی بر ابر و فراگیری دستگاه‌های اینترنت اشیا (IoT)، نیاز به روش‌های مؤثرتر برای مجازی‌سازی سیستم‌عامل‌های مهمان روی سخت‌افزار میزبان، چه برای میزبانی چندین مستاجر در یک فارم سرور و اجرای صدها وب‌سایت ایزوله روی یک سرور، چه برای اجازه توسعه‌دهندگان در تست ده‌ها نوع سیستم‌عامل متفاوت بدون نیاز به سخت‌افزار اختصاصی، را افزایش داده است. این نیاز به مجازی‌سازی سریع، کارآمد و امن، مدل‌های جدیدی از محاسبات و تفکر درباره نرم‌افزار را به وجود آورده است. در واقع، در حال حاضر، برخی نرم‌افزارها — مانند داکر (Docker)، که در ویندوز ۱۰ و سرور ۲۰۱۶ پشتیبانی می‌شود — در کانتینرها اجرا می‌شوند. این کانتینرها ماشین‌های مجازی کاملاً ایزوله‌ای هستند که مخصوص اجرای یک استک یا چارچوب نرم‌افزاری خاص طراحی شده‌اند و مرزهای ماشین‌مهمان/میزبان را بیشتر توسعه می‌دهند.

برای ارائه چنین خدمات مجازی‌سازی، تقریباً تمامی راه‌حل‌های مدرن از استفاده از هایپروایزر بهره می‌برند. هایپروایزر یک جزء تخصصی و با اولویت بالا است که امکان مجازی‌سازی و ایزوله‌سازی تمامی منابع روی دستگاه، از حافظه مجازی و فیزیکی گرفته تا وقفه‌های دستگاه، و حتی دستگاه‌های PCI و USB، را فراهم می‌کند. نمونه‌ای از این نوع هایپروایزر، Hyper-V است که عملکرد کلاینت Hyper-V در ویندوز ۸.۱ و نسخه‌های بعدی را تامین می‌کند. محصولات رقیب مانند Xen، KVM، VMware و VirtualBox نیز هر کدام هایپروایزرهای خاص خود را پیاده‌سازی می‌کنند که هر یک مزایا و نقاط ضعف خاص خود را دارند.

به دلیل ماهیت فوق‌العاده اولویت‌دار و دسترسی فراتر از هسته، هایپروایزر مزیتی متمایز دارد که فراتر از صرف اجرای چند نمونه مهمان از سیستم‌عامل‌های دیگر است: این می‌تواند یک نمونه میزبان را محافظت و نظارت کند و گواهی‌نامه‌ها و تضمین‌هایی ارائه دهد که فراتر از امکانات هسته است. در ویندوز ۱۰، مایکروسافت حالا از هایپروایزر Hyper-V برای ارائه مجموعه جدیدی از خدمات به نام امنیت مبتنی بر مجازی‌سازی (VBS) بهره می‌برد، که شامل موارد زیر است:

- Device Guard: این قابلیت، اعتبارسنجی کد (HVCI) را فراهم می‌کند و ضمانت‌های امضای کد قوی‌تر نسبت به تنها KMCS را تامین می‌کند، و اجازه می‌دهد تا سیاست امضا (Signature Policy) ویندوز در حالت کاربر و هسته سفارشی شود.

- Hyper Guard: این سیستم، ساختارهای کلیدی مرتبط با هسته و هایپروایزر را محافظت می‌کند.

- Credential Guard: این قابلیت، جلوگیری از دسترسی غیرمجاز به اطلاعات و اسرار حساب دامنه‌ها و احراز هویت‌های بیومتریک امن را فراهم می‌سازد.

- Application Guard: این حالت، برای مرورگر مایکروسافت اج، یک محیط ایزوله و امن‌تر ارائه می‌دهد.

- Host Guardian و Shielded Fabric: این فناوری‌ها با بهره‌گیری از یک TPM مجازی (v-TPM)، از ماشین‌های مجازی در برابر زیرساخت میزبان محافظت می‌کنند.

علاوه بر این، هایپروایزر Hyper-V امکاناتی برای کاهش آسیب‌پذیری‌های هسته‌ای در مقابل بهره‌برداری‌های مخرب و مهاجمان فراهم می‌کند. مزیت کلیدی این فناوری‌ها این است که، برخلاف بهبودهای امنیتی مبتنی بر هسته گذشته، آسیب‌پذیری آنان در برابر درایورهای مخرب یا ناسازگار، چه امضاشده و چه امضا نشده، بسیار کم است. این امنیت بالا، به لطف اجرای لایه‌های Trusted Virtual Levels (VTLs) است.زیرا، سیستم‌عامل عادی و اجزایش در حالت کم‌اطمینان‌تر (VTL 0) قرار دارند، ولی فناوری‌های VBS در VTL 1 (سطح بالاتر از اولویت) اجرا می‌شوند و نمی‌توانند تحت تأثیر کدهای در حالت هسته‌ای قرار گیرند. بنابراین، کدهای این فناوری‌ها در حوزه فضای امتیاز VTL 0 باقی می‌مانند. می‌توان VTLها را به‌عنوان مکمل‌هایی برای سطح‌های امتیاز پردازنده در نظر گرفت: حالت هسته و کاربر در هر VTL وجود دارند، و هایپروایزر مسئول مدیریت امتیازها در بین آن‌ها است.


فریم‌ویر (Firmware)

اجزای ویندوز به طور فزاینده‌ای بر امنیت سیستم‌عامل و هسته آن تکیه می‌کنند، و هسته نیز در حال حاضر بر حفاظت هایپروایزر متکی است. سوال این است که چه چیزی می‌تواند تضمین کند که این اجزا با امنیت بارگذاری می‌شوند و محتواهایشان را تأیید می‌کند. این عموماً وظیفه بوت‌لودر (boot loader) است، اما آن نیز نیازمند همان سطح از بررسی و تأیید اصالت است، که موجب ایجاد یک سلسله مراتب اعتماد پیچیده‌تر می‌شود.

پس، چه چیزی زنجیره اصلی اعتماد را فراهم می‌کند که می‌تواند فرآیند راه‌اندازی بدون مشکل را تضمین کند؟ در سیستم‌های مدرن ویندوز ۸ و بعد از آن، این موضوع به عهده فریم‌ویر سیستم می‌باشد، که باید بر پایه سیستم‌های تأییدشده مبتنی بر UEFI باشد. به عنوان بخشی از استاندارد UEFI (که ویندوز آن را تعیین می‌کند)، باید پیاده‌سازی راه‌اندازی امن (Secure Boot) با ضمانت‌های قوی و الزامات مربوط به کیفیت امضاهای نرم‌افزارهای مرتبط با بوت، وجود داشته باشد. از طریق این فرآیند تأیید، اجزای ویندوز مطمئن می‌شوند که به صورت امن از همان ابتدای فرآیند راه‌اندازی بارگذاری می‌شوند. علاوه بر این، فناوری‌هایی مانند ماژول اعتمادپذیر پلت‌فرم (TPM) می‌توانند فرآیند را اندازه‌گیری کرده و اثبات (attestation) انجام دهند (هم به صورت محلی و هم از راه دور).

با همکاری‌های صنعت، مایکروسافت فهرست مجازها (whitelist) و فهرست غیرمجازها (blacklist) مربوط به اجزای راه‌اندازی امن UEFI را مدیریت می‌کند، در صورت بروز خطا یا نفوذ در نرم‌افزارهای راه‌اندازی، و به‌روزرسانی‌های ویندوز حالا شامل به‌روزرسانی‌های فریم‌ویر نیز می‌شود.


اشیاء و دسته‌دستی‌ها

در سیستم‌عامل ویندوز، یک شیء هسته‌ای (kernel object) نمونه‌ای منفرد در زمان اجرا از یک نوع شیء تعریف‌شده به صورت ایستا است. نوع شیء شامل یک دادهٔ تعریف‌شده به وسیلهٔ سیستم، توابعی که روی نمونه‌های آن داده عمل می‌کنند، و مجموعه‌ای از ویژگی‌های شیء است. اگر شما برنامه‌های ویندوز بنویسید، ممکن است با اشیایی مانند فرآیند، نخ، فایل و رویداد روبه‌رو شوید تا فقط چند نمونه را نام ببریم. این اشیاء بر پایهٔ اشیاء سطح پایین‌تری ساخته و مدیریت می‌شوند که ویندوز آن‌ها را می‌آفریند و مدیریت می‌کند. در ویندوز، یک فرآیند نمونه‌ای است از نوع شیء فرآیند، یک فایل نمونه‌ای است از نوع شیء فایل، و به همین ترتیب سایر موارد.

یک ویژگیِ شیء (object attribute) مقداری داده درون شیء است که تاحدی وضعیت شیء را تعریف می‌کند. برای نمونه، شیء از نوع فرآیند ممکن است ویژگی‌هایی داشته باشد که شامل شناسهٔ فرایند (process ID)، اولویت پایهٔ زمان‌بندی، و نشانگرِ به شیءِ توکن دسترسی (access token) باشد. روش‌های شیء (object methods)، یعنی روش‌های جهت دستکاری اشیاء، معمولاً ویژگی‌های شیء را می‌خوانند یا تغییر می‌دهند. برای مثال، متد open برای یک فرآیند ورودیِ شناسهٔ فرآیند را می‌پذیرد و نشانگری به شیء را به عنوان خروجی برمی‌گرداند.

fundamental difference: شیء با ساختار داده‌ای عادی تفاوت اساسی دارد این است که ساختار داخلی یک شیء مبهم (opaque است). شما باید از یک سرویس شیء استفاده کنید تا داده‌ای را از شیء بیرون بگیرید یا در آن داده‌ای وارد کنید. به طور مستقیم نمی‌توانید داده‌های داخل شیء را بخوانید یا تغییر دهید. این تفاوت، پیاده‌سازی زیرین شیء را از کدی که صرفاً از آن استفاده می‌کند جدا می‌کند؛ روشی که به شیوه‌ای امکان تغییر ساده پیاده‌سازی‌های شیء در طول زمان را می‌دهد.

اشیاء با کمک بخشی از هسته که به آن مدیر شیء (object manager) گفته می‌شود، روشی مناسب برای انجام چهار کار مهم سیستم‌عامل ارائه می‌دهند:

- ارائه نام‌های قابل‌خواندن برای انسان برای منابع سیستم

- به اشتراک گذاری منابع و داده‌ها بین فرآیندها

- محافظت از منابع در برابر دسترسی غیرمجاز

- پیگیری ارجاعات، که به سیستم اجازه می‌دهد تشخیص دهد که آیا شیء دیگر استفاده نمی‌شود تا بتوان آن را به‌طور خودکار از بین برد

همه ساختارهای داده در ویندوز به‌طور کلی شیء نیستند. تنها داده‌هایی که نیاز به اشتراک‌گذاری، حفاظت، نام‌گذاری یا نمایش به برنامه‌های کاربری-حالتی (از طریق سرویس‌های سیستم) دارند، در اشیاء قرار می‌گیرند. ساختارهای استفاده‌شده فقط توسط یک جزء از OS برای انجام وظایف داخلی، شیء محسوب نمی‌شوند.


امنیت
ویندوز از ابتدا به گونه‌ای طراحی شد که امن باشد و الزامات مربوط به ارزیابی‌های امنیتی دولتی و صنعتی مختلف را برآورده کند، مانند مشخصات Common Criteria for Information Technology Security Evaluation (CCITSE). دستیابی به یک رتبه امنیتی تأییدشده از دولت به سیستم‌عامل اجازه می‌دهد تا در این عرصه رقابت کند. البته بسیاری از این قابلیت‌ها، برای هر سیستم چندکاربره مزایای مفیدی هستند.

قابلیت‌های اصلی امنیتی ویندوز عبارت‌اند از:

  • حفاظت اختیاری (need-to-know) و اجباری برای تمام اشیای سیستم قابل به‌اشتراک‌گذاری، مانند فایل‌ها، پوشه‌ها، فرآیندها، نخ‌ها و غیره

  • حسابرسی امنیتی برای پاسخگویی به مسئولیت‌پذیری موضوعات، یا کاربران، و اقداماتی که انجام می‌دهند

  • احراز هویت کاربر هنگام ورود

جلوگیری از این‌که یک کاربر به منابع بدون مقداردهی مناسب دسترسی پیدا کند، مانند حافظه آزاد یا فضای دیسک که کاربر دیگری آزاد کرده است، نیز جزء وظایف امنیتی است.

ویندوز سه شکل کنترل دسترسی بر اشیاء دارد:

  1. کنترل دسترسی اختیاری (Discretionary access control)
    این مکانیزم حفاظتی است که اکثر افراد هنگام فکر کردن به امنیت سیستم‌عامل به آن فکر می‌کنند. این روش است که صاحبان اشیاء (مانند فایل‌ها یا پرینترها) به دیگران دسترسی بدهند یا دسترسی را محدود کنند. وقتی کاربران وارد سیستم می‌شوند، مجموعه‌ای از اعتبارنامه‌های امنیتی یا یک زمینه امنیتی به آن‌ها داده می‌شود. وقتی آن‌ها در تلاش برای دسترسی به اشیاء هستند، زمینه امنیتی‌شان با لیست کنترل دسترسی (ACL) شیء که می‌خواهند به آن دسترسی پیدا کنند مقایسه می‌شود تا تعیین کند آیا اجازه انجام درخواست وجود دارد یا خیر. در Windows Server 2012 و Windows 8 این کنترل اختیاری با پیاده‌سازی کنترل دسترسی مبتنی بر ویژگی (Attribute-Based Access Control) یا کنترل دسترسی پویا گسترش یافته است. با این حال، لیست دسترسی یک منبع الزاماً کاربران و گروه‌های فردی را شناسایی نمی‌کند. در عوض، ویژگی‌ها یا ادعاهای لازم که به دسترسی به یک منبع می‌انجامند مانند «سطح پاکت: Top Secret» یا «سن: 10 سال» را شناسایی می‌کند. با قابلیت پرکردن این ویژگی‌ها به‌طور خودکار از طریق تجزیه پایگاه‌های داده SQL و طرح‌ها از طریق دایرکتوری فعال، این مدل امنیتی بسیار زیباتر و انعطاف‌پذیرتر است و به سازمان‌ها کمک می‌کند از مدیریت گروهی و سلسله‌مراتب گروهی دستی فرار کنند.

  2. کنترل دسترسی ممتاز (Privileged access control)
    این کنترل برای مواقعی لازم است که کنترل دسترسی اختیاری برای امنیت کافی نیست. این روش تضمین می‌کند که کسی بتواند به اشیای محافظت‌شده دسترسی پیدا کند اگر مالک آن در دسترس نباشد. برای مثال، اگر یکی از کارمندان شرکت را ترک کند، مدیر باید راهی برای دسترسی به فایل‌هایی که ممکن است تنها برای همان کارمند قابل دسترسی بوده‌اند بیابد. در این حالت، در ویندوز مدیر می‌تواند مالکیت فایل را به‌عهده بگیرد تا بتواند حقوق آن را به‌طور لازم مدیریت کند.

  3. کنترل یکپارچگی اجباری (Mandatory integrity control)
    این قابلیت زمانی لازم است که یک سطح امنیتی اضافی برای محافظت از اشیایی که از همان حساب کاربری استفاده می‌کنند، مورد نیاز باشد. این برای همه چیز از فراهم کردن بخشی از فناوری sandboxing برای برنامه‌های ویندوز تا جداسازی مرورگر Internet Explorer در حالت Protected Mode و سایر مرورگرها از تنظیمات کاربر، تا محافظت از اشیایی که توسط حساب مدیر بالامرتبه ایجاد شده‌اند از دسترسی توسط حساب نوبت‌کار استفاده نشده، به کار می‌رود.

از ویندوز 8 به بعد، ظرفی به نام AppContainer برای میزبانی برنامه‌های ویندوز استفاده می‌شود که با سایر AppContainerها و فرآیندهای غیر ویندوز در ارتباط است و ایزولاسیونی فراهم می‌کند. کد در AppContainerها می‌تواند با کارگزاران (فرآیندهای غیرایزوله که با اعتبارنامه کاربر اجرا می‌شوند) و گاهی با سایر AppContainerها یا فرآیندها از طریق قراردادهای روشن‌تعریف‌شده‌ای توسط زمان اجرای ویندوز ارتباط برقرار کند. نمونه‌ای استاندارد از این مورد مرورگر مایکروسافت اج است که در داخل AppContainer اجرا می‌شود و به این ترتیب حفاظت بهتری در برابر کد مخرب داخل محدوده‌های آن فراهم می‌کند. علاوه بر این، توسعه‌دهندگان ثالث نیز می‌توانند از AppContainerها برای ایزوله کردن برنامه‌های خود استفاده کنند. مدل AppContainer رویکرد سنتی برنامه‌نویسی را به سمت یک مدل چندفرایندی با چندین پردازش تغییر می‌دهد.

امنیت در رابط کاربری API ویندوز نفوذ دارد. زیربنای ویندوز امنیت مبتنی بر شیء را در همان روشی که سیستم‌عامل انجام می‌دهد، پیاده‌سازی می‌کند: حفاظت اشیای مشترک ویندوز از طریق تخصیص Descriptors امنیتی ویندوز به آن‌ها. نخستین‌بار که یک برنامه قصد دسترسی به یک شیء مشترک را دارد، زیرسیستم ویندوز صحت دسترسی آن را بررسی می‌کند. اگر بررسی امنیت موفق باشد، زیربنای ویندوز اجازه می‌دهد که برنامه به کار خود ادامه دهد.


رجیستری

اگر با سیستم‌عامل‌های ویندوز کار کرده باشید، احتمالاً درباره رجیستری شنیده‌اید یا به آن نگاه کرده‌اید. نمی‌توانید درباره جنبه‌های داخلی ویندوز زیاد صحبت کنید بدون اینکه به رجیستری اشاره کنید، زیرا رجیستری پایگاه داده سیستم است که اطلاعات لازم برای بوت و پیکربندی سیستم، تنظیمات نرم‌افزار سطح سیستم که عملیات ویندوز را کنترل می‌کنند، پایگاه داده امنیتی و تنظیمات پیکربندی کاربر به کاربر مانند اینکه از چه screensaver استفاده شود را در بر می‌گیرد. علاوه بر این، رجیستری پنجره‌ای به داده‌های حافظه‌ای پویا در RAM را نیز ارائه می‌دهد، مانند وضعیت سخت‌افزاری فعلی سیستم (کدام درایورهای دستگاه بارگذاری شده‌اند، منابعی که از آن‌ها استفاده می‌شوند و غیره) و همچنین شمارنده‌های عملکرد ویندوز. شمارنده‌های عملکرد، در واقع در رجیستری نیستند، اما می‌توان از طریق توابع رجیستری به آن‌ها دسترسی پیدا کرد (هرچند API جدیدتری برای دسترسی به شمارنده‌های عملکرد وجود دارد).

اگرچه بسیاری از کاربران و مدیران ویندوز هرگز نیاز به نگاه مستقیم به رجیستری ندارند (زیرا می‌توانید اکثر تنظیمات پیکربندی را با ابزارهای مدیریتی استاندارد مشاهده یا تغییر دهید)، اما رجیستری همچنان منبع مفیدی از اطلاعات داخلی ویندوز است زیرا حاوی بسیاری از تنظیماتی است که بر عملکرد و رفتار سیستم تأثیر می‌گذارند.


یونیکد

ویندوز از بسیاری از سیستم‌عامل‌های دیگر متمایز است، زیرا بیشتر رشته‌های داخلی متن به صورت کاراکترهای یونیکد با عرض 16 بیت ذخیره می‌شوند و پردازش می‌شوند (از نظر فنی UTF-16LE؛ هرگاه در این کتاب از یونیکد یاد می‌شود، به UTF-16LE اشاره می‌شود مگر خلاف آن بیان شود). یونیکد یک استاندارد مجموعه کاراکتری بین‌المللی است که ارزش‌های منحصربه‌فرد برای اکثر مجموعه‌های کاراکتری جهان را تعریف می‌کند و پشتیبانی از رمزگذاری‌های 8، 16 و حتی 32 بیتی برای هر کاراکتر را فراهم می‌کند.

از آنجا که بسیاری از برنامه‌ها با رشته‌های کاراکتری 8 بیتی (ANSI) سروکار دارند، بسیاری از توابع ویندوز که آرگومان‌های رشته‌ای می‌پذیرند دارای دو نقطه ورودی هستند: نسخه یونیکد (پهناور، 16 بیتی) و نسخه ANSI (باریک، 8 بیتی). اگر شما نسخه باریک یک تابع ویندوز را صدا بزنید، با کمی افت کارایی مواجه می‌شوید زیرا ورودی‌های رشته‌ای به‌صورت یونیکد قبل از پردازش توسط سیستم و خروجی‌ها قبل از بازگرداندن به برنامه، به یونیکد تبدیل می‌شوند. بنابراین، اگر سرویسی قدیمی یا قطعه‌ای از کدی دارید که می‌خواهید روی ویندوز اجرا شود اما این کد با استفاده از رشته‌های کاراکتری ANSI نوشته شده است، ویندوز کاراکترهای ANSI را برای استفاده خود به یونیکد تبدیل می‌کند. با این حال، ویندوز هرگز داده‌های داخل فایل‌ها را به یونیکد تبدیل نمی‌کند — این به عهدهٔ برنامه است تا تصمیم بگیرد آیا داده را به‌صورت یونیکد یا ANSI ذخیره کند.

صرف‌نظر از زبان برنامه، همه نسخه‌های ویندوز دارای همان توابع هستند. به جای داشتن نسخه‌های جداگانه برای هر زبان، ویندوز دارای یک فایل اجرایی جهانی واحد است تا یک نصب واحد از چند زبان مختلف پشتیبانی کند (از طریق افزودن بسته‌های زبان مختلف). برنامه‌ها همچنین می‌توانند از توابع ویندوز بهره ببرند که امکان استفاده از binaries جهانی واحد برای چند زبان را فراهم می‌کند.

سیستم‌های قدیمی ویندوز 9x به طور بومی از یونیکد پشتیبانی نمی‌کردند. این موضوع یکی دیگر از دلایل ایجاد دو تابع برای ANSI و یونیکد بود. برای مثال، تابع API ویندوز CreateFile در واقع تابعی نیست؛ بلکه یک ماکرو است که به یکی از دو تابع تبدیل می‌شود: CreateFileA (ANSI) یا CreateFileW (Unicode، که در آن W نشان‌دهنده wide است). این گسترش بر اساس یک ثابت کامپلایشن به نام UNICODE انجام می‌شود. این چیز به‌طور پیش‌فرض در پروژه‌های Visual Studio C++ تعریف شده است چون کار با توابع یونیکد مفیدتر است. با این حال، نام صریح تابع را می‌توان به جای ماکرو مربوطه استفاده کرد.


کیت درایور ویندوز (WDK)

کیت درایور ویندوز (WDK) همچنین از طریق برنامه اشتراک MSDN در دسترس است. درست مانند SDK ویندوز، می‌توان آن را به‌صورت رایگان دانلود کرد. مستندات WDK در کتابخانه MSDN گنجانده شده‌اند.

اگرچه WDK با هدف توسعه‌دهندگان درایورهای دستگاه طراحی شده است، اما منبعی فراوان از اطلاعات داخلی ویندوز محسوب می‌شود. برای مثال، اگرچه فصل ششم معماری سیستم I/O، مدل درایور و ساختارهای داده پایه درایور دستگاه را توضیح می‌دهد، اما توصیف دقیقی از توابع پشتیبانی هسته‌ای به صورت جزئی ارائه نمی‌دهد. مستندسازی WDK توصیف جامع از تمام توابع پشتیبانی هسته ویندوز و مکانیسم‌های مورد استفاده توسط درایورهای دستگاه را به صورت آموزشی و مرجع ارائه می‌کند.

علاوه بر گنجاندن مستندات، WDK حاوی فایل‌های هدر (به‌ویژه ntddk.h، ntifs.h و wdm.h) است که ساختارهای داخلی کلیدی داده‌ها و ثابت‌های مهم را تعریف می‌کند و همچنین رابط‌هایی به بسیاری از روال‌های داخلی سیستم را فراهم می‌نماید. این فایل‌ها هنگام کاوش در داده‌های داخلی ویندوز با دیباگر هسته مفید هستند، زیرا اگرچه طرح‌بندی کلی و محتوای این ساختارها در این کتاب نشان داده شده است، توضیحات دقیق سطح زمینه (مثلاً اندازه و انواع داده‌ها) ارائه نشده است. تعدادی از این ساختارهای داده — مانند سرصفحه‌های شی Dispatcher اشیاء، بلوک‌های انتظار، رویدادها، موتنت‌ها، سمفورها و غیره — از طریق WDK به‌خوبی توضیح داده شده‌اند.

اگر می‌خواهید فراتر از آنچه در این کتاب ارائه شده است به درک سیستم I/O و مدل درایور وارد شوید، مستندات WDK را مطالعه کنید — به‌ویژه Kernel-Mode Driver Architecture Design Guide و Kernel-Mode Driver Reference manuals. همچنین ممکن است استفاده از کتاب‌های مفید دیگری مانند Programming the Microsoft Windows Driver Model، نسخهٔ دوم توسط والتر انی (Microsoft Press, 2002) و Developing Drivers with the Windows Driver Foundation توسط پنی اوریک و گای اسمیت (Microsoft Press, 2007) نیز برای شما سودمند باشد.


ابزارهای Sysinternals

بسیاری از آزمایش‌های این کتاب از ابزارهای رایگان Sysinternals استفاده می‌کنند که می‌توانید از طریق وب‌سایت Sysinternals دانلود کنید. مارک روسینویچ، هم‌نگار این کتاب، بیشترین بخش این ابزارها را نوشته است. مشهورترین ابزارها شامل Process Explorer و Process Monitor هستند. توجه کنید که بسیاری از این ابزارها نصب و اجرای درایورهای دستگاه در سطح کرنل را در بر می‌گیرند و بنابراین به مجوز مدیرکل یا سطح elevated نیاز دارند — هرچند برخی از آن‌ها می‌توانند با عملکرد محدود و خروجی برای یک حساب کاربری استاندارد یا غیر elevated اجرا شوند.

از آنجایی که ابزارهای Sysinternals به‌طور منظم به‌روزرسانی می‌شوند، مطمئن شوید که جدیدترین نسخه را دارید. برای دریافت اطلاع‌رسانی در مورد به‌روزرسانی ابزارها، می‌توانید وبلاگ Sysinternals Site Blog را دنبال کنید (که دارای فید RSS است). برای توضیحات مربوط به تمام ابزارها، نحوه استفاده از آن‌ها و مطالعات موردی مشکلاتی که حل می‌شوند، به کتاب Windows Sysinternals Administrator’s Reference نوشتهٔ مارک روسینویچ و آرانگ مارگوسیس (Microsoft Press، 2011) مراجعه کنید. برای سوالات و بحث‌های مربوط به ابزارها نیز از انجمن‌های Sysinternals استفاده کنید.

Telegram: @CaKeegan
Bale: @CaKeegan
Gmail : amidgm2020@gmail.com

۴
۰
سید عمید قائم مقامی
سید عمید قائم مقامی
برنامه نویسی سیستم ویندوز و مهندسی معکوس و علاقه مند به آموزش.
شاید از این پست‌ها خوشتان بیاید