Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
20
Dung lượng
369,44 KB
Nội dung
Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Bởi: Khoa CNTT ĐHSP KT Hưng Yên Truy cập vào Registry Windows XP Windows 98/Me ghi lại cấu hình thông tin quan trọng sở liệu gọi đăng ký WDM trình điều khiển gọi chức liệt kê bảng 3-10 để truy cập đăng ký Nếu bạn thực chế độ người dùng truy cập chương trình liên quan đến đăng ký, bạn có thể đoán để sử dụng chức driver Tôi tìm thấy hạt nhân-chế độ hỗ trợ đầy đủ chức khác nhau, nhiên, nghĩ giá trị mô tả cách bạn sử dụng chúng 1/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Trong phần này, thảo luận, số thứ khác, gia đình ZwXxx thói quen RtlDeleteRegistryValue, mà cung cấp chức đăng ký suffices cho hầu hết trình điều khiển WDM Mở registry key Trước bạn interrogate giá trị việc đăng ký, bạn cần phải mở khoá có chứa chúng Bạn sử dụng vào ZwOpenKey mở chìa khóa ZwCreateKey bạn sử dụng để mở trọng điểm để tạo khoá Hoặc chức cần thiết bạn khởi tạo OBJECT_ATTRIBUTES cấu với tên chủ chốt (có lẽ) thông tin khác OBJECT_ATTRIBUTES cấu trúc công bố sau đây: typedef struct _OBJECT_ATTRIBUTES { ULONG Length; HANDLE RootDirectory; 2/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) PUNICODE_STRING ObjectName; ULONG Attributes; PVOID SecurityDescriptor; PVOID SecurityQualityOfService; } OBJECT_ATTRIBUTES; Hơn khởi tạo dụ cấu trúc tay, dễ để sử dụng InitializeObjectAttributes vĩ mô, mà tin bạn để hiển thị Giả, ví dụ, muốn mở dịch vụ chủ chốt cho driver The I / O Trưởng đại diện cho tên khoá tham số để DriverEntry Vì vậy, viết mã sau: NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { OBJECT_ATTRIBUTES oa; InitializeObjectAttributes(&oa, RegistryPath, OBJ_KERNEL_HANDLE │ OBJ_CASE_INSENSITIVE, NULL, NULL); HANDLE hkey; status = ZwOpenKey(&hkey, KEY_READ, &oa); if (NT_SUCCESS(status)) { ZwClose(hkey); } } 3/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Chúng bắt đầu đối tượng thuộc tính cấu pathname đăng ký với cách cung cấp cho I / O Trưởng đại diện bảo mật với NULL descriptor ZwOpenKey bỏ qua an ninh descriptor anyway-bạn xác định thuộc tính bảo mật bạn tạo chìa khóa cho lần ZwOpenKey mở khoá cho đọc lưu trữ kết xử lý hkey biến ZwClose thói quen chung cho đóng để xử lý hạt nhân-chế độ đối tượng Đây, sử dụng để đóng trình xử lý đăng ký vào chìa khóa Các OBJ_KERNEL_HANDLE cờ, hiển thị mẫu mã trước, quan trọng cho hệ thống tích hợp Nếu bạn chạy bối cảnh người dùng sợi bạn gọi ZwOpenKey, bạn không cung cấp bit, cờ, bạn có xử lý sẵn sàng cho người sử dụng chế độ xử lý Nó chí xảy người sử dụng chế độ-mã đóng trình xử lý mở đối tượng, lại nhận số giá trị All of a sudden, gọi bạn để đăng ký chức giao dịch với sai loại xử lý Những cách khác để mở registry phím Ngoài vào ZwOpenKey, Windows XP cung cấp hai chức cho phím mở đăng ký IoOpenDeviceRegistryKey cho phép bạn mở phím đặc biệt đăng ký liên kết với đối tượng điện thoại: HANDLE hkey; Status = IoOpenDeviceRegistryKey(pdo, flag, access, &hkey); nơi pdo địa đối tượng vật lý điện thoại (PDO) trình điều khiển đặc biệt bạn stack, cờ cho khoá đặc biệt mà bạn muốn mở (xem B ng 3-11), truy cập ví dụ mặt nạ truy cập KEY_READ Tôi sử dụng IoOpenDeviceRegistryKey với PLUGPLAY_REGKEY_DEVICE cờ thường xuyên trình điều khiển riêng Trong Windows XP, chức 4/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) mở thiết bị subkey Các thông số phần cứng, chìa khóa cho điện thoại Trong Windows 98/Me, mở phần cứng, chìa khóa riêng Các phím nơi để lưu trữ tham số thông tin phần cứng Tôi thảo luận phím đầy đủ chi tiết Chương 15 kết nối với cài đặt phân phối driver IoOpenDeviceInterfaceRegistryKey mở phím kết hợp với dụ thiết bị giao diện đăng ký: HANDLE hkey; status = IoOpenDeviceInterfaceRegistryKey(linkname, access, &hkey); nơi linkname liên kết tượng trưng tên đăng ký truy cập vào giao diện truy cập mặt nạ KEY_READ Bắt cài đặt giá trị Thông thường, bạn mở chìa khóa đăng ký mà bạn muốn, để lấy giá trị từ sở liệu Các chức mà bạn sử dụng cho mục đích ZwQueryValueKey Ví dụ, để lấy lại giá trị imagePath driver dịch vụ chủ chốt-Tôi thật lý bạn muốn biết này, phận tôi-bạn sử dụng mã sau đây: UNICODE_STRING valname; RtlInitUnicodeString(&valname, L"ImagePath"); size = 0; status = ZwQueryValueKey(hkey, &valname, KeyValuePartialInformation, NULL, 0, &size); if (status == STATUS_OBJECT_NAME_NOT_FOUND ││ size == 0) ; size = min(size, PAGE_SIZE); PKEY_VALUE_PARTIAL_INFORMATION vpip = 5/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) PKEY_VALUE_PARTIAL_INFORMATION) ExAllocatePool(PagedPool, size); if (!vpip) ; status = ZwQueryValueKey(hkey, &valname, KeyValuePartialInformation, vpip, size, &size); if (!NT_SUCCESS(status)) ; Data>ExFreePool(vpip); Đây, thực hai gọi để ZwQueryValueKey Mục đích gọi để xác định không gian, cần phải phân bổ cho cấu KEY_VALUE_PARTIAL_INFORMATION cố gắng để lấy Thứ hai, gọi truy thông tin Tôi lại kiểm tra lỗi mã fragment lỗi không làm việc thực tế đường cho mong đợi Đặc biệt, đoán bước để gọi ZwQueryValueKey trở lại STATUS_BUFFER_TOO_SMALL (kể từ qua không-một chiều dài đệm) Nó không làm điều đó, Quan trọng STATUS_OBJECT_NAME_NOT_FOUND mã không thành công, cho thấy giá trị thực không tồn Vì vậy, kiểm tra cho có giá trị Nếu có số lỗi khác ngăn cản ZwQueryValueKey từ làm việc, gọi thứ hai uncover Cái gọi "một phần" thông tin cấu bạn lấy cách chứa giá trị liệu mô tả loạt liệu dạng: typedef struct _KEY_VALUE_PARTIAL_INFORMATION { ULONG TitleIndex; ULONG Type; ULONG DataLength; UCHAR Data[1]; } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION; 6/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Loại hình loại liệu đăng ký liệt kê bảng 3-12 (Các loại liệu có không quan tâm đến trình điều khiển thiết bị.) DataLength chiều dài liệu giá trị, liệu liệu riêng TitleIndex liên quan đến trình điều khiển Dưới số kiện hữu ích để biết loại liệu khác nhau: • REG_DWORD 32-bit unsigned integer định dạng (về cuối lớn hay nhỏ cuối) tảng cho tự nhiên • REG_SZ mô tả null-Unicode chấm dứt chuỗi giá trị The Terminator null bao gồm DataLength truy cập • Để mở rộng REG_EXPAND_SZ có giá trị cách thay biến môi trường, quý vị nên RtlQueryRegistryValues bạn sử dụng phương pháp hỏi đăng ký Nội cho thói quen truy cập biến môi trường tài liệu xúc cho sử dụng trình điều khiển • RtlQueryRegistryValues cách tốt để interrogate REG_MULTI_SZ giá trị gọi bạn xem thường gọi lần cho phòng số có tiềm nhiều dây Chú thích: Mặc dù, rõ ràng ích RtlQuery ¬ RegistryValues, tránh cách sử dụng hết, gây vụ đụng xe trong trình điều khiển Tất nhiên, giá trị đọc chức cần thiết để gọi giúp đỡ chức đặt sở khởi phần hạt nhân được, đó, không Để thiết lập giá trị đăng ký, bạn phải có KEY_SET_VALUE truy cập vào cha mẹ chìa khóa Tôi sử dụng KEY_READ sớm hơn, không cho bạn truy cập 7/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Bạn sử dụng KEY_WRITE hay KEY_ALL_ACCESS, bạn thu nhiều cần thiết cho phép Sau đó, gọi ZwSetValueKey Ví dụ: RtlInitUnicodeString(&valname, L"TheAnswer"); ULONG value = 42; ZwSetValueKey(hkey, &valname, 0, REG_DWORD, &value, sizeof(value)); Subkeys xóa giá trị Để xóa giá trị chìa khóa mở ra, bạn sử dụng RtlDeleteRegistryValue cách đặc biệt sau đây: RtlDeleteRegistryValue(RTL_REGISTRY_HANDLE, (PCWSTR) hkey, L"TheAnswer"); RtlDeleteRegistryValue nói chung dịch vụ có chức đối số định số nơi đặc biệt đăng ký Khi bạn sử dụng RTL_REGISTRY_HANDLE, làm ví dụ này, bạn bạn có mở khoá để xử lý vòng mà bạn muốn xóa giá trị Bạn rõ trọng điểm (với ném biên để làm cho hạnh phúc) đối số thứ hai Thứ ba, cuối đối số-null chấm dứt Unicode tên giá trị mà bạn muốn xóa Đây thời gian bạn để tạo cấu UNICODE_STRING để mô tả chuỗi Trong Windows 2000 sau này, bạn sử dụng ZwDeleteValueKey để xóa giá trị (nó giám sát chức tài liệu DDK): UNICODE_STRING valname; RtlInitUnicodeString(&valname, L"TheAnswer"); RtlDeleteValueKey(hkey, &valname); Bạn xoá phím mà bạn mở với cho phép XOÁ (mà bạn nhận với KEY_ALL_ACCESS) Gọi ZwDeleteKey bạn: ZwDeleteKey(hkey); Chìa khóa sống tất xử lý đóng cửa, nỗ lực để mở cửa hàng để xử lý phím để truy cập vào phím cách sử 8/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) dụng mở xử lý không thành công với STATUS_KEY_DELETED Kể từ bạn có mở xử lý điểm này, bạn cần phải chắn gọi ZwClose sometime (The DDK tài liệu hướng dẫn cho mục nhập ZwDeleteKey nói xử lý trở thành không hợp lệ It doesnt-bạn phải đóng cách gọi điện thoại ZwClose.) Enumerating Subkeys giá trị Một hoạt động phức tạp, bạn thực với ký mở chìa khóa để enumerate yếu tố (subkeys giá trị) mà có chứa chìa khóa Để làm điều này, bạn thấy gọi ZwQueryKey để xác định vài thực tế subkeys giá trị, chẳng hạn số điện thoại người, độ dài tên lớn nhất, ZwQueryKey có đối số cho biết ba loại thông tin bạn muốn tải phím Các loại đặt tên bản, node, đầy đủ Để chuẩn bị cho Enumeration, bạn muốn quan tâm đầy đủ thông tin: typedef struct _KEY_FULL_INFORMATION { LARGE_INTEGER LastWriteTime; ULONG TitleIndex; ULONG ClassOffset; ULONG ClassLength; ULONG SubKeys; ULONG MaxNameLen; ULONG MaxClassLen; ULONG Values; ULONG MaxValueNameLen; ULONG MaxValueDataLen; WCHAR Class[1]; } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION; 9/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Đây thực cấu biến chiều dài từ Lớp [0] ký tự tên lớp học It's phong tục để thực gọi để tìm hiểu cách thức lớn, buffer bạn cần phải phân bổ gọi thứ hai để có liệu, sau: ULONG size; ZwQueryKey(hkey, KeyFullInformation, NULL, 0, &size); size = min(size, PAGE_SIZE); PKEY_FULL_INFORMATION fip = (PKEY_FULL_INFORMATION) ExAllocatePool(PagedPool, size); ZwQueryKey(hkey, KeyFullInformation, fip, size, &size); Bây bạn quan tâm subkeys đăng ky bạn, bạn thực vòng lặp sau gọi ZwEnumerateKey: for (ULONG i = 0; i < fip->SubKeys; ++i) { ZwEnumerateKey(hkey, i, KeyBasicInformation, NULL, 0, &size); size = min(size, PAGE_SIZE); PKEY_BASIC_INFORMATION bip = (PKEY_BASIC_INFORMATION) ExAllocatePool(PagedPool, size); ZwEnumerateKey(hkey, i, KeyBasicInformation, bip, size, &size); Name> ExFreePool(bip); } Chìa khóa thực tế, bạn khám phá subkey tên nó, mà cho thấy tính lên chuỗi Unicode cấu KEY_BASIC_INFORMATION bạn lấy bên vòng lặp: typedef struct _KEY_BASIC_INFORMATION { 10/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) LARGE_INTEGER LastWriteTime; ULONG Type; ULONG NameLength; WCHAR Name[1]; } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION Không phải tên null-chấm dứt, bạn phải sử dụng NameLength thành thành viên cấu để xác định chiều dài Đừng quên chiều dài byte! Tên không đầy đủ đường dẫn đăng ký; điều cần tên subkey vòng chìa khóa chứa Đây thật may mắn, bạn dễ dàng mở subkey cho tên xử lý để mở bậc cha mẹ chìa khóa Để Enumeration giá trị không gian mở chìa khóa, nhân viên phương pháp sau đây: ULONG maxlen = fip->MaxValueNameLen + sizeof(KEY_VALUE_BASIC_INFORMATION); maxlen = min(maxlen, PAGE_SIZE); PKEY_VALUE_BASIC_INFORMATION vip = (PKEY_VALUE_BASIC_INFORMATION) ExAllocatePool(PagedPool, maxlen); for (ULONG i = 0; i < fip->Values; ++i) { ZwEnumerateValueKey(hkey, i, KeyValueBasicInformation, vip, maxlen, &size); Name> } ExFreePool(vip); 11/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Cấp cho không gian lớn có cấu trúc KEY_VALUE_BASIC_INFORMATION bạn luôn lấy MaxValueNameLen dựa thành viên KEY_FULL_INFORMATION cấu Bên vòng tròn, bạn thấy muốn làm với tên giá trị, mà đến với bạn chuỗi Unicode tính cấu trúc này: typedef struct _KEY_VALUE_BASIC_INFORMATION { ULONG TitleIndex; ULONG Type; ULONG NameLength; WCHAR Name[1]; } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION; Một lần nữa, có tên giá trị mở để xử lý phụ huynh chìa khóa cần bạn cần để lấy lại giá trị, hiển thị phần trước Hiện có biến thể ZwQueryKey hai Enumeration chức mà không thảo luận Bạn có thể, ví dụ, có đầy đủ thông tin subkey bạn gọi ZwEnumerateKey Tôi cho bạn làm để có thông tin bao gồm tên Bạn tải liệu có giá trị, tên cộng với liệu giá trị, từ ZwEnumerateValueKey Tôi cho bạn làm để có tên giá trị Truy cập tập tin It's hữu ích để đọc viết thường xuyên đĩa file từ bên trình điều khiển WDM Có lẽ bạn cần phải tải số tiền lớn microcode với phần cứng bạn, có lẽ bạn cần phải tạo riêng bạn rộng lớn thông tin đăng nhập cho số mục đích Có ZwXxx thói quen để giúp bạn làm điều Kích truy cập thông qua thói quen ZwXxx yêu cầu bạn chạy PAS ¬ SIVE_LEVEL (xem chương kế tiếp) sợi mà an toàn bị treo Trong thực tế, yêu cầu sau có nghĩa bạn phải khuyết tật Asynchronous Thủ tục gọi (APCs) cách gọi điện thoại KeEnterCriticalRegion Bạn đọc chương số đồng hóa primitives yêu cầu bạn đến IRQL nâng cao PASSIVE_LEVEL hay để vô hiệu hoá APCs Gấu cần ghi nhớ primitives đồng hóa tập tin không tương truy cập 12/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Mã số mẫu FILEIO mẫu trình điều khiển, phần nội dung minh hoạ gọi đến số chức ZwXxx thảo luận phần Điều đặc biệt mẫu có giá trị cung cấp workarounds cho tảng không tương thich đề cập phần cuối chương Hiện mở tệp để đọc, để mở tệp tin có để bạn đọc nó, làm theo ví dụ này: NTSTATUS status; OBJECT_ATTRIBUTES oa; IO_STATUS_BLOCK iostatus; HANDLE hfile; // the output from this process PUNICODE_STRING pathname; // you've been given this InitializeObjectAttributes(&oa, pathname, OBJ_CASE_INSENSITIVE │ OBJ_KERNEL_HANDLE, NULL, NULL); status = ZwCreateFile(&hfile, GENERIC_READ, &oa, &iostatus, NULL, 0, FILE_SHARE_READ, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); Tạo viết lại tệp Để tạo tập tin mới, để mở truncate để không chiều dài có tập tin, thay gọi đến ZwCreateFile trước fragment với trong: status = ZwCreateFile(&hfile, GENERIC_WRITE, &oa, &iostatus, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OVERWRITE_IF, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); Trong fragments, thiết lập cấu có OBJECT_ATTRIBUTES Mục đích điểm đến đầy đủ pathname tập tin mà để mở Chúng xác định OBJ_CASE_INSENSITIVE thuộc tính Win32 hệ thống tập 13/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) tin mô hình, không chữa trị trường hợp đáng kể pathname Chúng định OBJ_KERNEL_HANDLE cho lý làm đăng ký ví dụ hiển thị sớm chương Sau đó, gọi ZwCreateFile để mở xử lý Lĩnh vực xử lý Mỗi phòng trình xử lý tư nhân có bảng mà gắn với số xử lý đối tượng đến hạt nhân Khi bạn mở ZwCreateFile xử lý cách sử dụng, NtCreateFile, xử lý mà thuộc quy trình tại-sau đó, trừ bạn sử dụng OBJ_KERNEL_HANDLE cờ A-quá trình xử lý cụ thể đi, trình chấm dứt Hơn nữa, bạn sử dụng xử lý bối cảnh khác trình, bạn tham chiếu gián tiếp đối tượng (nếu có) cho để xử lý tương ứng trình khác Một hạt nhân xử lý, mặt khác, lưu giữ bảng toàn cầu mà không biến mất, hệ điều hành shuts xuống sử dụng mà ambiguity trình Nếu bạn có kế hoạch để đọc toàn tập tin vào nhớ đệm, bạn thấy muốn để kêu gọi ZwQueryInformationFile để xác định tổng chiều dài tập tin: FILE_STANDARD_INFORMATION si; ZwQueryInformationFile(hfile, &iostatus, &si, sizeof(si), FileStandardInformation); ULONG length = si.EndOfFile.LowPart; Thời gian hoạt động tập tin Bạn có khả muốn đọc đĩa tập tin WDM driver bạn bắt đầu điện thoại bạn để phản ứng lại IRP_MN_START_DEVICE yêu cầu (Xem Chương 6.) Tùy thuộc vào nơi mà điện thoại bạn té ngã sở khởi trình tự, bạn quyền truy cập vào tập tin cách sử dụng bình thường pathnames \?? \ C: \ dir \ file.ext Để an toàn, đưa tệp tin liệu bạn vào số thư mục hệ thống thư mục gốc sử dụng file \ SystemRoot \ dir \ file.ext SystemRoot chi nhánh tên này, luôn truy cập từ hệ điều hành để đọc đĩa file để bắt đầu lên Trong tất trình điều khiển tôi, xác định tên DRIVERNAME này: #define DRIVERNAME "xxx" 14/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) nơi xxx tên trình điều khiển thiết bị Nhớ lại thấy hai giáp biên string constants cố định Trick đặc biệt cách sử dụng cho phép để cắt dán toàn subroutines, bao gồm gọi họ KdPrint, từ driver khác mà không cần phải làm cho mã nguồn thay đổi Các khẳng định vĩ mô Hữu ích khác, khả gỡ lỗi kỹ thuật dựa vĩ mô khẳng định: ASSERT(1 + == 2); Trong kiểm tra xây dựng driver bạn, khẳng định tạo mã để đánh giá Boolean biểu Nếu biểu sai, khẳng định cố gắng để ngăn chặn thực debugger để bạn xem xảy Nếu biểu đúng, bạn tiếp tục thực chương trình bình thường Debuggers hạt nhân tạm dừng xảy khẳng định thất bại, xây dựng nhà bán lẻ hệ điều hành, Quan trọng kkẳng định thất bại bán lẻ xây dựng hệ điều hành mà hạt nhân debugger chạy tạo lỗi kiểm tra Trình điều khiển Verifier Các Driver Verifier phần kiểm tra miễn phí xây dựng hệ điều hành nhanh chóng trở thành công cụ Microsoft cho trình điều khiển kiểm tra chất lượng Bạn khởi chạy Driver Verifier Bắt đầu từ Menu, whereupon bạn trình bày với loạt trang trình wizard Đây đồ đường để hướng dẫn bạn qua trang này, lần Hình 3-14 minh hoạ việc ban đầu thuật sĩ trang Tôi khuyên bạn nên kiểm tra Tạo chỉnh Cài đặt (Đối với Mã số phát triển) lựa chọn Điều cho phép bạn lựa chọn để xác định chi tiết Driver Verifier tuỳ chọn mà bạn muốn tham gia 15/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Hình 3-14 Driver Verifier thuật sĩ ban đầu trang Sau thực đề nghị lựa chọn từ trang đầu tiên, bạn trình bày với trang thứ hai (xem Hình 3-15) Đây, khuyên bạn nên kiểm tra cá nhân Chọn Cài đặt từ A Danh sách đầy đủ tùy chọn 16/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Hình 3-15 Driver Verifier thuật sĩ thứ hai trang Thuật sĩ trang (xem Hình 3-16) cho phép bạn định cài đặt verifier bạn mong muốn Được quy định kiểm tra thêm vào số kiểm tra Driver Verifier làm tự động 17/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Hình 3-16 Driver Verifier thuật sĩ cài đặt tuỳ chỉnh trang Những lựa chọn có sẵn thời điểm viết sau: • Special lô tất lực lượng nhớ phân từ trình điều khiển để xác minh làm từ đặc biệt pool Như mô tả chương sớm hơn, phân đặt vào cuối (hoặc bắt đầu) trang, mà sau lưu trữ (hoặc trước khi) phân bố nhớ dẫn đến lỗi kiểm tra • Theo dõi nguyên nhân lô Driver Verifier để theo dõi nhớ phân xác minh thực trình điều khiển Bạn xem số liệu thống kê cách sử dụng nhớ thay đổi theo thời gian Các Driver Verifier đảm bảo tất phân giải thoát, xác minh unload trình điều khiển để giúp bạn nắm bắt nhớ rõ • IRQL lực lượng kiểm tra nguyên nhân chủ yếu paged nhớ để Flushed xác nhận driver tăng IRQL để DISPATCH_LEVEL Hành động giúp tìm nơi trình điều khiển thiết bị không xác paged truy cập nhớ Các hệ thống chạy chậm tùy chọn bật • I / O Mã xác nhận nguyên nhân Driver Verifier để kiểm tra việc thực driver xử lý IRPs tạo forwards đến trình điều 18/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) khiển • Enhanced I / O Mã xác nhận nỗ lực để tuôn driver lỗi trường hợp ranh giới, chẳng hạn hoàn tất PnP Power IRPs không xác, làm cho giả định trình tự, Trưởng đại diện PnP tải trình điều khiển, Một số kiểm tra xảy trình điều khiển thiết bị bắt đầu bước đầu, by the way, mà ngăn chặn việc hệ thống • Deadlock Detection tạo đồ khóa Hierarchy cho spin ổ khóa, mutexes, nhanh chóng mutexes xác minh sử dụng trình điều khiển để phát tiềm deadlocks • DMA Kiểm tra xác minh đảm bảo trình điều khiển DMA thực cách sử dụng phương pháp quy định DDK • Low Tài nguyên Mô ngẫu nhiên không bao gồm việc phân pool từ xác nhận trình điều khiển, bắt đầu bảy phút sau hệ thống bắt đầu Mục đích thất bại để đảm bảo trình điều khiển thử nghiệm giá trị trả lại từ pool phân bổ gọi Bạn sử dụng thủ tục đặc biệt, mô tả DDK, để kích hoạt kiểm tra trình điều khiển SCSI miniport Chú thích: Có thể có tương tác tuỳ chọn bạn định Hiện tại, thời gian, ví dụ, yêu cầu cho DMA kiểm tra phát deadlock hay rẽ tắt nâng cao I / O xác minh Lưu ý Driver Verifier phát triển nhanh chóng nói chuyện DDK có tư vấn cho bạn xảy để làm việc với cho up-to-date thông tin Sau bạn chọn tuỳ chọn verifier bạn muốn, bạn thấy thuật sĩ cuối trang (xem Hình 3-17) Trang cho phép bạn để xác định trình điều khiển mà bạn muốn xác minh cách kiểm tra hộp danh sách Sau thực lựa chọn, bạn cần phải khởi động lại máy tính, nhiều Driver Verifier kiểm tra yêu cầu khởi động-thời gian sở khởi Khi gỡ lỗi trình điều khiển riêng tôi, tìm thấy để thuận tiện driver tải khởi động lại xảy Do vậy, driver không danh sách, có thêm để qua Thêm vào Hiện không tải Driver (s) To The Danh sách nút 19/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Hình 3-17 Điều khiển lựa chọn cho trang Driver Verifier Driver Verifier thất bại lỗi kiểm tra cách Bạn cần phải chạy hạt nhân hay debugger để phân tích bãi chứa, sau đụng xe thực tế để isolate nguyên nhân thất bại 20/20 [...]... sizeof(KEY_VALUE_BASIC_INFORMATION); maxlen = min(maxlen, PAGE_SIZE); PKEY_VALUE_BASIC_INFORMATION vip = (PKEY_VALUE_BASIC_INFORMATION) ExAllocatePool(PagedPool, maxlen); for (ULONG i = 0; i < fip->Values; ++i) { ZwEnumerateValueKey(hkey, i, KeyValueBasicInformation, vip, maxlen, &size); Name> } ExFreePool(vip); 11/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Cấp cho không... của tôi lựa chọn từ các trang đầu tiên, bạn sẽ được trình bày với một trang thứ hai (xem Hình 3-1 5) Đây, tôi khuyên bạn nên kiểm tra các cá nhân Chọn Cài đặt từ A Danh sách đầy đủ tùy chọn 16/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Hình 3-15 Driver Verifier thuật sĩ thứ hai trang Thuật sĩ trang kế tiếp (xem Hình 3-1 6) cho phép bạn chỉ định các cài đặt verifier bạn mong... này, lần đầu tiên Hình 3-14 minh hoạ việc ban đầu thuật sĩ trang Tôi khuyên bạn nên kiểm tra các Tạo chỉnh Cài đặt (Đối với Mã số phát triển) lựa chọn Điều này sẽ cho phép bạn lựa chọn để xác định chi tiết Driver Verifier tuỳ chọn mà bạn muốn tham gia 15/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Hình 3-14 Driver Verifier thuật sĩ ban đầu trang Sau khi thực hiện các đề nghị... FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); Trong những fragments, chúng tôi thiết lập một cơ cấu có OBJECT_ATTRIBUTES Mục đích chính là điểm đến đầy đủ pathname của tập tin mà chúng tôi đang về để mở Chúng tôi xác định OBJ_CASE_INSENSITIVE thuộc tính bởi vì Win32 hệ thống tập 13/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) tin mô hình, không có gì không chữa trị như trường hợp đáng kể trong một... 17/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Hình 3-16 Driver Verifier của thuật sĩ cài đặt tuỳ chỉnh trang Những lựa chọn có sẵn tại thời điểm tôi đang viết này là như sau: • Special lô tất cả các lực lượng bộ nhớ phân từ trình điều khiển để xác minh được làm từ những đặc biệt pool Như được mô tả trong chương này sớm hơn, như vậy phân được đặt vào cuối (hoặc bắt đầu) của... luôn luôn có thể truy cập từ các hệ điều hành đã để có thể đọc đĩa file để bắt đầu lên Trong tất cả các trình điều khiển của tôi, tôi xác định là một tên DRIVERNAME như thế này: #define DRIVERNAME "xxx" 14/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) nơi xxx là tên của một trình điều khiển thiết bị Nhớ lại rằng thấy hai giáp biên string constants như là một cố định Trick đặc... gọi (APCs) bằng cách gọi điện thoại KeEnterCriticalRegion Bạn sẽ đọc trong chương kế tiếp rằng một số đồng bộ hóa primitives yêu cầu bạn đến IRQL nâng cao trên PASSIVE_LEVEL hay để vô hiệu hoá APCs Gấu chỉ cần ghi nhớ rằng những primitives và đồng bộ hóa tập tin không tương đang truy cập 12/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Mã số mẫu FILEIO các mẫu trong trình điều... giúp tìm những nơi trình điều khiển thiết bị là không chính xác paged truy cập bộ nhớ Các hệ thống chạy khá chậm khi tùy chọn này được bật • I / O Mã xác nhận nguyên nhân của Driver Verifier để kiểm tra việc thực hiện cơ bản như thế nào là một driver xử lý IRPs rằng nó tạo ra hoặc forwards đến các trình điều 18/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) khiển • Enhanced I... tải khi khởi động lại xảy ra Do vậy, driver của tôi sẽ không đã được trong danh sách, và tôi sẽ có thêm nó để qua Thêm vào Hiện nay không được tải Driver (s) To The Danh sách nút 19/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Hình 3-17 Điều khiển lựa chọn cho các trang Driver Verifier Driver Verifier thất bại là lỗi kiểm tra bằng cách này Bạn sẽ cần phải được chạy một hạt nhân.. .Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) LARGE_INTEGER LastWriteTime; ULONG Type; ULONG NameLength; WCHAR Name[1]; } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION Không phải là tên null-chấm dứt, bạn phải sử ... PAGE_SIZE); PKEY_VALUE_PARTIAL_INFORMATION vpip = 5/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) PKEY_VALUE_PARTIAL_INFORMATION) ExAllocatePool(PagedPool, size); if (!vpip)... ZwOpenKey(&hkey, KEY_READ, &oa); if (NT_SUCCESS(status )) { ZwClose(hkey); } } 3/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Chúng bắt đầu đối tượng thuộc tính cấu pathname... sách đầy đủ tùy chọn 16/20 Kỹ thuật lập trình hỗn hợp (Miscellaneous Programming Techniques ) Hình 3-15 Driver Verifier thuật sĩ thứ hai trang Thuật sĩ trang (xem Hình 3-1 6) cho phép bạn định cài