Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Evet, DoTraceMessage makrosunun kendi sürümünü yazabilirsiniz. DoTraceMessage bir izleme iletisi oluşturur.
TraceDrv örnek sürücüsü, bu konuda açıklanan yöntemlerin bir örneğini sağlar. TraceDrv , GitHub'daki Windows sürücü örnekleri deposunda bulunur.
DoTraceMessage: Varsayılan Sürüm
Varsayılan olarak DoTraceMessage makrosunun biçimi şu şekildedir:
DoTraceMessage(Flag,"Message",MessageVariables...);
Bu varsayılan sürümde Flag , iletinin oluşturulduğu koşullar olan izleme bayraklarını temsil eder. MessageVariables , sürücünün tanımladığı ve izleme iletisinde görünen değişkenlerin virgülle ayrılmış bir listesini içerir. MessageVariables değişkenleri printf öğeleri kullanılarak biçimlendirilir. WPP ön işlemcisi DoTraceMessage makrosundan bir derleyici yönergesi oluşturur. Bu makro, ileti tanımı bilgilerini ve biçimlendirme bilgilerini, çekirdek modu sürücüsü veya kullanıcı modu uygulaması gibi izleme sağlayıcısı için oluşturulan PDB dosyasına ekler.
DoTraceMessage makrosunun mantıksal olarak aşağıdakilere genişletilmesi gerekir:
PRE macro // If defined
If (WPP_CHECK_INIT && Flag is enabled) {
....Call WmiTraceMessage;
}
POST macro // If defined
Aşağıdaki kod örneğini göz önünde bulundurun.
DoTraceMessage(ERROR, "IOCTL = %d", ControlCode);
Bu çağrı, ERROR bayrağı etkinleştirildiğinde izleme iletisini oluşturur. İleti "IOCTL=%d" şeklindedir ve MessageVariables, ControlCode değeridir.
ÖN günlüğe kaydetme ve POST günlüğü makroları tanımlanmışsa, bunlar da genişletilecektir. ÖN makrolar ve POST makroları Microsoft Windows 2000 ve sonraki işletim sistemlerinde desteklenir. Makroları kullanmak için WDK kullanarak sürücüyü oluşturmanız gerekir. Windows Driver Development Kit'in (DDK) önceki bir sürümünü kullanarak bir sürücü oluşturursanız, PRE ve POST işlevi kullanılamaz ve makrolar izleme deyiminin bir parçası olarak çalıştırılmaz. Windows DDK'nin önceki bir sürümünü kullanarak sürücüyü oluşturmak bir derleme kesmesine neden olmayabilir, ancak kod beklendiği gibi çalışmaz.
DoTraceMessage: Genel Biçim
Geçerli bir izleme iletisi işlevinin genel biçimi aşağıdadır:
FunctionName(Conditions...,"Message",MessageVariables...);
İletiden önce görüntülenen parametreler koşul olarak yorumlanır. İletiden sonra görüntülenen parametreler ileti değişkenleri olarak yorumlanır.
Koşullar , virgülle ayrılmış değerler listesidir. İzleme iletisi yalnızca tüm koşullar doğruysa oluşturulur. Kodda desteklenen herhangi bir koşulu belirtebilirsiniz.
Örnek: MyTrace
Aşağıda bir izleme işlevinin örneği verilmiştir. Bu örnek, izleme düzeyini ve izleme iletisini oluşturan sağlayıcının alt bileşeni için koşullar ekler.
MyDoTrace(Level, Flag, Subcomponent,"Message",MessageVariables...);
Örneğin:
MyDoTrace(TRACE_LEVEL_ERROR, VERBOSE, Network,"IOCTL = %d", ControlCode);
İzleme düzeyi, WDK'nin Include alt dizininde yer alan bir genel üst bilgi dosyası olan Evntrace.h dosyasında tanımlanan standart düzeydir.
#define TRACE_LEVEL_NONE 0 // Tracing is not on
#define TRACE_LEVEL_FATAL 1 // Abnormal exit or termination
#define TRACE_LEVEL_ERROR 2 // Severe errors that need logging
#define TRACE_LEVEL_WARNING 3 // Warnings such as allocation failure
#define TRACE_LEVEL_INFORMATION 4 // Includes non-error cases(for example, Entry-Exit)
#define TRACE_LEVEL_VERBOSE 5 // Detailed traces from intermediate steps
#define TRACE_LEVEL_RESERVED6 6
#define TRACE_LEVEL_RESERVED7 7
#define TRACE_LEVEL_RESERVED8 8
#define TRACE_LEVEL_RESERVED9 9
Özel İzleme İşlevi Oluşturma
Özel bir izleme işlevi oluşturmak için şu adımları izleyin:
DoTraceMessage makrolarını destekleyen makroların alternatif sürümlerini yazın.
WPP önişlemcisini çağıran RUN_WPP deyimine -func parametresini ekleyin.
Özel MakroLar Yazma
Özel bir izleme işlevi oluşturmak için, izlemenin koşullarını (ileti öncesinde görünen parametreler) değiştiren makroların izleme işlevlerini destekleyen WPP_LEVEL_ENABLED ve WPP_LEVEL_LOGGER alternatif sürümlerini yazmanız gerekiyor.
WPP_LEVEL_ENABLED(Bayraklar), günlüğe kaydetmenin belirtilen bayrak değeriyle etkinleştirilip etkinleştirilmediğini belirler. DOĞRU veya YANLIŞ döndürür.
WPP_LEVEL_LOGGER(Bayraklar), sağlayıcının etkinleştirildiği izleme oturumunu bulur ve izleme oturumuna bir tanıtıcı döndürür.
Örneğin, bir koşul olarak bayraklara ek olarak izleme düzeyini de eklemek istiyorsanız, izleme düzeyini içeren yeni bir WPP_LEVEL_ENABLED makro tanımlayın. Aşağıdaki kod örneğinde gösterildiği gibi, yeni makronun tanımını varsayılan makroya dayandırabilirsiniz.
#define WPP_LEVEL_FLAGS_ENABLED(lvl, flags) (WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level >=lvl
Genellikle, WPP_LEVEL_LOGGER makro etkilenmez. Bu gibi durumlarda, yeni makroyu varsayılan makro olacak şekilde tanımlayabilirsiniz. Örneğin:
#define WPP_LEVEL_FLAGS_LOGGER(lvl,flags) WPP_LEVEL_LOGGER(flags)
Ancak bazı durumlarda GÜNLÜKÇÜ makrosunda değişiklik yapmanız gerekir. Örneğin, bayraklara değil yalnızca izleme düzeyine bağlı bir izleme işlevi yazmak isteyebilirsiniz.
Aşağıdaki kod örneğinde, makrodaki bayraklar değerinin yerine sahte bir değer kullanılmaktadır. Denetim GUID tanımı bildirilirken hiçbir bayrak tanımlanmamıştır.
#define WPP_CONTROL_GUIDS \
WPP_DEFINE_CONTROL_GUID(CtlGuid,(a044090f,3d9d,48cf,b7ee,9fb114702dc1), \
WPP_DEFINE_BIT(DUMMY))
#define WPP_LEVEL_LOGGER(lvl) (WPP_CONTROL(WPP_BIT_ ## DUMMY).Logger)
İşlevi WPP'ye Ekleme
Özel izleme işlevini WPP'ye eklemek için aşağıdaki kod örneğinde gösterildiği gibi -func parametresini işlevin bildirimiyle RUN_WPP deyimine ekleyin.
RUN_WPP=$(SOURCES) -km -func:DoTraceLevelMessage(LEVEL,FLAGS,MSG,...)
Not Kullanıcı modu uygulamaları veya dinamik bağlantı kitaplıkları (DLL' ler) için RUN_WPP yönergesinde -km anahtarını belirtmemelisiniz.
RUN_WPP için isteğe bağlı parametrelerin tam listesi için bkz . WPP Önişlemcisi.