Η καλύτερη πηγή σας πληροφοριών και ειδήσεων περίπου vista, xp και οδηγοί στο διαδίκτυο

Vista ΑΡΘΡΑ ΚΟΡΥΦΗ 50 Vista ΒΙΝΤΕΟ Vista SOFT Vista ΒΟΗΘΕΙΑ

Vista, πώς ο διακόπτης ΣΗΜΑΙΩΝ REG.EXE λειτουργεί;


Σημείωση: αυτό το περιεχόμενο αρχικά από http://mygreenpaste.blogspot.com. Εάν το διαβάζετε από κάποια άλλη περιοχή, παρακαλώ πάρτε το χρόνο να επισκεφτεί Η πράσινη κόλλα μου, INC. Σας ευχαριστούμε.


Μια πλάτη στιγμής, υπεάρξε ένα θέμα (Εικονικό ληξιαρχείο εναντίον «Πραγματικό ληξιαρχείο») Φόρουμ Sysinternals ότι θεμένο το θέμα για το πώς να θέσει τις virtualization-σχετικές σημαίες του ληξιαρχείου ένα κλειδί programmatically Vista, παρά μέσω της χρήσης των ΣΗΜΑΙΏΝ του εργαλείου REG.EXE μεταστρέφει. (Για περισσότερες πληροφορίες για τις σημαίες, δείτε Mark Russinovich«άρθρο του s στο περιοδικό TechNet, «Εσωτερικός Vista παραθύρων έλεγχος απολογισμού χρηστών"). Ακόμη και πριν από εκείνο το θέμα στο φόρουμ, είχα αναρωτηθεί πώς έγινε αλλά δεν είχε μια πιθανότητα να εξερευνήσει. Δεν φάνηκε ότι πολλοί άλλοι ήταν περίεργοι για το. Εκείνο το θέμα είχε αναστήσει την ιδέα, αλλά έπεσε γρήγορα στο κατώτατο σημείο του καταλόγου. Έχω φτάσει τελικά γύρω στον πειραματισμό, και αυτός οδηγεί σε αυτό το write-up. Ακόμα δεν βλέπω πολύ με τον τρόπο αυτού που συζητείται οπουδήποτε, με την έρευνα για τους όρους σχετικούς (τύποι στοιχείων, ονόματα λειτουργίας param, κ.λπ.), τόσο ενδεχομένως αυτό θα βοηθήσει κάποιο. (Η συντήρηση στο μυαλό ότι πολύ καλά μπορεί να υπάρξει ένας λόγος Microsoft δεν έχει καταστήσει αυτό διαθέσιμο μέσω άλλης, αμεσότερο API.)


Στο παραπεμφθε'ν θέμα, είχα πάρει εφ' όσον καθοριστικό ότι REG.EXE έκανε την εργασία του μέσω της χρήσης NtSetInformationKey, ένα «ατεκμηρίωτο» API σε NTDLL.DLL.


NTSYSAPI 

NTSTATUS

NTAPI

NtSetInformationKey (

ΣΤΗ ΛΑΒΗ KeyHandle,

Σε KEY_SET_INFORMATION_CLASS InformationClass,

ΣΕ PVOID KeyInformationData,

ΣΕ ULONG DataLength)


Μετά από λίγος να ρίξω με γδούπο γύρω σε WinDbg, έχω βρεί τον ακόλουθο μετά από τις λεπτομέρειες. Κλήσεις REG.EXE NtSetInformationKey, διευκρινίζοντας μια αξία 2 για την παράμετρο InformationClass. Αυτή η παράμετρος είναι τύπου KEY_SET_INFORMATION_CLASS, τον οποίο wdm.h μας λέει είναι ένα enum:


typedef enum _KEY_SET_INFORMATION_CLASS {

KeyWriteTimeInformation,

KeyWow64FlagsInformation,

KeyControlFlagsInformation,

KeySetVirtualizationInformation,

KeySetDebugInformation,

Το MaxKeySetInfoClass // MaxKeySetInfoClass πρέπει πάντα να είναι το τελευταίο enum

} KEY_SET_INFORMATION_CLASS


Έτσι τα 2 για την παράμετρο InformationClass θα αντιστοιχούσαν σε KeyControlFlagsInformation. WDM.H επίσης προτείνει ότι αυτή η κατηγορία έχει έναν τύπο που ένας περνά για την παράμετρο KeyInformationData - KEY_CONTROL_FLAGS_INFORMATION:


typedef struct _KEY_CONTROL_FLAGS_INFORMATION {

ULONG ControlFlags

} KEY_CONTROL_FLAGS_INFORMATION, *PKEY_CONTROL_FLAGS_INFORMATION


Έχουμε μια βασική ιδέα για το πώς να καλέσουμε NtSetInformationKey τώρα. Αλλά ποιες είναι οι τιμές ότι το μέλος ControlFlags KEY_CONTROL_FLAGS_INFORMATION μπορεί να τεθεί; Θα φαινόταν ότι το ακόλουθο (μόνος-γίνοντα) enum καλύπτει τις σχετικές σημαίες - τουλάχιστον οι ΣΗΜΑΊΕΣ αυτών REG.EXE μπορούν να χειριστούν (μπορούν να υπάρξουν περισσότεροι):


typedef enum _CONTROL_FLAGS {

RegKeyClearFlags = 0,

RegKeyDontVirtualize = 2,

RegKeyDontSilentFail = 4,

RegKeyRecurseFlag = 8

} CONTROL_FLAGS;


The control flags are a bitmask, so you can OR them to set more than one.


Now that we have this information, what's left? We need to put it all together in a call to NtSetInformationKey. So, we need to get a pointer to the function in NTDLL.DLL. Then, we can declare a struct of type KEY_CONTROL_FLAGS_INFORMATION, set the ControlFlags member to be what we wish, and open a key to the desired location in the registry, that can be passed to NtSetInformationKey. In the end, we wind up with something like the following (error handling has been omitted):


typedef NTSYSAPI NTSTATUS (NTAPI* FuncNtSetInformationKey) (

HANDLE KeyHandle,

KEY_SET_INFORMATION_CLASS InformationClass,

PVOID KeyInformationData,

ULONG DataLength );

//...

FuncNtSetInformationKey ntsik = (FuncNtSetInformationKey)GetProcAddress(

GetModuleHandle( _T("ntdll.dll") ), "NtSetInformationKey" );

KEY_CONTROL_FLAGS_INFORMATION kcfi = {0};

kcfi.ControlFlags = RegKeyDontVirtualize | RegKeyRecurseFlag;

HKEY hTheKey = NULL;

RegOpenKeyEx( HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Whatever"), 0, KEY_ALL_ACCESS, &hTheKey );

ntsik( hTheKey, KeyControlFlagsInformation, &kcfi, sizeof( KEY_CONTROL_FLAGS_INFORMATION ) );

RegCloseKey( hTheKey );

hTheKey = NULL;



The code above is the equivalent of invoking REG.EXE FLAGS HKLM\Software\Whatever SET DONT_VIRTUALIZE RECURSE_FLAGS. To clear the flags, just set kcfi.ControlFlags to RegKeyClearFlags (same as REG.EXE FLAGS HKLM\Software\Whatever SET).

Hopefully, this will prove useful to those that have wished to set these flags programmatically. In a future post, I hope to explore querying for these flags, ala REG.EXE FLAGS HKLM\Software\Whatever QUERY.


Note that this exploration was done on Windows Vista SP1. I would expect the content here to also apply to Windows Vista (no SP) as well as Windows Server 2008, but...

Popularity: 4%


Written by «/\/\Ø|ö±ò\/»®©. Read more great feeds at is source WEBSITE
no comments.
Read more articles on flags and NtSetInformationKey and REG_KEY_DONT_VIRTUALIZE and Sysinternals Forum and reg.exe flags and registry virtualization and reg and REG_KEY_DONT_SILENT_FAIL and Troubleshooting and vista and windbg and otherSoftware and registry and Virtualization.

No comments

There are still no comments on this article.

Leave your comment...

If you want to leave your comment on this article, simply fill out the next form:




You can use these XHTML tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong> .