2012-04-30 39 views
10

Tôi đoán câu hỏi của tôi là về Trình tải CLR. Tôi muốn hiểu các cơ chế đằng sau chức năng CorFlags.exe/32BIT+.CorFlags.exe/32BIT + hoạt động như thế nào?

Chúng tôi biết rằng khi một người bắt đầu lắp ráp được biên dịch với Cờ CPU bất kỳ được đặt trên Windows 64 bit, nó bắt đầu dưới dạng quy trình 64 bit. Nếu một chạy CorFlags /32BIT+ trên hội đồng đó, nó sẽ bắt đầu như là một quá trình 32-bit. Tôi nghĩ đây là một tính năng hấp dẫn.

Tôi có rất nhiều câu hỏi về nó:

  1. Làm thế nào là nó thực hiện?
  2. Trình tải hệ điều hành có được tham gia không?
  3. Có thể xây dựng một ứng dụng tùy chỉnh (tôi đoán một ứng dụng không được quản lý) tải CLR 32 bit hoặc 64 bit theo mong muốn không?

Có bài viết, sách, blog, v.v ... giải thích hoạt động bên trong của tính năng này không?

Trả lời

5

Đây không phải là tài liệu tốt ở bất kỳ nơi nào tôi biết, tôi chỉ có thể chỉ cho bạn một bài viết MSDN có liên quan. Có, giả định của bạn là chính xác, trình tải trong Windows XP trở lên có nhận thức về các tệp thi hành được quản lý. Nó tự động tải trình nạp .NET (c: \ windows \ system32 \ mscoree.dll), điểm nhập có liên quan là _CorValidateImage(). Phần Nhận xét trong bài viết MSDN được liên kết mô tả cơ chế biến một tệp .exe 32 bit thành quy trình 64 bit:

Trong Windows XP và các phiên bản sau, trình kiểm tra hệ điều hành kiểm tra các mô-đun được quản lý bằng cách kiểm tra bit thư mục trình mô tả COM trong tiêu đề định dạng tệp đối tượng chung (COFF). Một bit thiết lập cho biết một mô-đun được quản lý. Nếu trình tải phát hiện một mô-đun được quản lý, nó tải MsCorEE.dll và gọi _CorValidateImage, thực hiện các hành động sau:

  • Xác nhận rằng hình ảnh là một mô-đun được quản lý hợp lệ.
  • Thay đổi điểm vào trong hình ảnh thành một điểm vào trong thời gian chạy ngôn ngữ chung (CLR).
  • Đối với phiên bản Windows 64 bit, sửa đổi hình ảnh trong bộ nhớ bằng cách chuyển đổi hình ảnh từ định dạng PE32 sang PE32 +.
  • Quay lại trình tải khi hình ảnh mô-đun được quản lý được tải.

Đối với hình ảnh thực thi, trình tải hệ điều hành sau đó gọi hàm _CorExeMain, bất kể điểm vào được chỉ định trong tệp thực thi. Đối với hình ảnh lắp ráp DLL, trình tải gọi hàm _CorDllMain .

_CorExeMain hoặc _CorDllMain thực hiện các thao tác sau:

  • Khởi CLR.
  • Định vị điểm truy cập được quản lý từ tiêu đề CLR của hội đồng.
  • Bắt đầu thực hiện.

Trình tải gọi hàm _CorImageUnloading khi mô-đun được quản lý hình ảnh được tải.Tuy nhiên, chức năng này không thực hiện bất kỳ hành động nào; nó chỉ trả về.

+0

Cảm ơn câu trả lời nhanh. Đây là một điểm khởi đầu tốt. Tôi muốn tìm hiểu làm thế nào clr đề với các phần .reloc. Tôi đào trong sscli, chủ yếu là trong pedecoder.h/pewriter.cpp và tìm thấy câu trả lời của tôi. Vẫn còn nhiều câu hỏi (ví dụ: về Windows 2000 x64) nhưng tôi đoán tôi sẽ tìm thấy câu trả lời trong sscli. –

+0

Đó là một cách dễ dàng, Windows 2000 x64 cuối cùng đã được nhìn thấy được sử dụng bởi các Yeti trắng tuyệt vời. –

+1

Chà. Tôi tự hỏi nếu có bất kỳ cách nào để tận dụng lợi thế của "nhận thức đặc biệt" này để tạo ra các mã nhị phân (mã gốc) chất béo thích hợp cho Windows. – Fowl

2

Để thêm vào câu trả lời của Hans, cũng có một số mã chế độ hạt nhân Windows phản hồi cờ đó. Mỗi tệp thi hành được nạp có cấu trúc hạt nhân, SECTION_IMAGE_INFORMATION, được liên kết với nó. Dưới đây là thông tin biểu tượng của nó:

0: kd> dt nt!_SECTION_IMAGE_INFORMATION 
      +0x000 TransferAddress   : Ptr64 Void 
      +0x008 ZeroBits     : Uint4B 
      +0x010 MaximumStackSize   : Uint8B 
      +0x018 CommittedStackSize  : Uint8B 
      +0x020 SubSystemType    : Uint4B 
      +0x024 SubSystemMinorVersion  : Uint2B 
      +0x026 SubSystemMajorVersion  : Uint2B 
      +0x024 SubSystemVersion   : Uint4B 
      +0x028 GpValue     : Uint4B 
      +0x02c ImageCharacteristics  : Uint2B 
      +0x02e DllCharacteristics  : Uint2B 
      +0x030 Machine     : Uint2B 
      +0x032 ImageContainsCode   : UChar 
      +0x033 ImageFlags    : UChar 
      +0x033 ComPlusNativeReady  : Pos 0, 1 Bit 
      +0x033 ComPlusILOnly    : Pos 1, 1 Bit 
      +0x033 ImageDynamicallyRelocated : Pos 2, 1 Bit 
      +0x033 ImageMappedFlat   : Pos 3, 1 Bit 
      +0x033 BaseBelow4gb    : Pos 4, 1 Bit 
      +0x033 Reserved     : Pos 5, 3 Bits 

Cờ ComPlusILOnlyComPlusNativeReady có liên quan đến .NET, ComPlusILOnly chỉ đơn giản là nói nếu lắp ráp là CIL chỉ (không pha trộn hoặc mẹ đẻ - trong trường hợp này việc lắp ráp đã là kiến ​​trúc cụ thể), và ComPlusNativeReady là 1 chỉ khi/32BIT + không được đặt (32BITREQ or 32BITPREF in newer CorFlags version). Những cờ được kiểm tra trong nt!PspAllocateProcess và dựa trên chúng một quá trình 32-bit hoặc 64-bit được tạo.

I wrote about it với một số chi tiết.

+0

Rất cám ơn !!! Tôi đã nhầm lẫn trong việc tính toán một số lĩnh vực của cấu trúc này bằng cách sử dụng thông tin lỗi thời trong Windows NT/2000 Native API Reference. –

Các vấn đề liên quan