00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
#ifndef _IOEP_H
00027
#define _IOEP_H
00028
00029
00030
00031
00032 #define IOETAG_ERRLOG 'LeoI'
00033 #define IOETAG_ERRTHREAD 'TeoI'
00034 #define IOETAG_ERRENTRY 'EeoI'
00035 #define IOETAG_DATABLOCK 'DeoI'
00036 #define IOETAG_ERRMODULE 'MeoI'
00037 #define IOETAG_MSGBUFF 'BeoI'
00038 #define IOETAG_ERRCASEDB 'CeoI'
00039 #define IOETAG_DATATEXT 'XeoI'
00040 #define IOETAG_DATAWSTR 'SeoI'
00041 #define IOETAG_ERRINFO 'IeoI'
00042 #define IOETAG_SAVEDATA 'VeoI'
00043 #define IOETAG_WMIEVENT 'WeoI'
00044
00045 #define THREADKEY_IRP 1
00046 #define THREADKEY_THREADID 2
00047
00048 #define IOEMETHOD_ANY 0
00049 #define IOEMETHOD_LONGMSG 1
00050 #define IOEMETHOD_SHORTMSG 2
00051 #define IOEMETHOD_HANDLER 3
00052
00053 #define IOE_ERRINFO_VERSION 1
00054 #define IOE_INFOBLK_VERSION 1
00055
00056
00057
00058
00059
#if DBG
00060
#define PROCNAME(s) static PSZ ProcName = s
00061
#define DBGPRINT(p) { \
00062
KdPrint(("%s: ", ProcName)); \
00063
KdPrint(p); \
00064
}
00065
#else
00066 #define PROCNAME(s)
00067 #define DBGPRINT(p)
00068
#endif
00069
00070
00071
00072
00073 typedef struct _errentry {
00074 SINGLE_LIST_ENTRY
slist;
00075 ERRID ErrID;
00076 UNICODE_STRING
unicodeStr;
00077 ULONG
DataBlkType;
00078 ULONG
DataBlkLen;
00079 PVOID
DataBlk;
00080 GUID
MofGuid;
00081 }
ERRENTRY, *
PERRENTRY;
00082
00083 typedef struct _errthread {
00084 LIST_ENTRY
list;
00085 LIST_ENTRY
ErrLogListHead;
00086 ULONG
ThreadKeyType;
00087
union {
00088
struct {
00089 PIRP Irp;
00090 UCHAR
MajorFunction;
00091 UCHAR
MinorFunction;
00092 PVOID
Arguments[4];
00093 PDEVICE_OBJECT TargetDevice;
00094 } IrpKey;
00095
00096
struct {
00097 PKTHREAD ThreadID;
00098 } ThIDKey;
00099
00100 }
ThreadKey;
00101 }
ERRTHREAD, *
PERRTHREAD;
00102
00103 typedef struct _errlog {
00104 ULONG
Signature;
00105 ULONG
ulFlags;
00106 LIST_ENTRY
list;
00107 SINGLE_LIST_ENTRY
ErrStack;
00108 PERRTHREAD ErrThread;
00109 PERRINFO ErrInfo;
00110 }
ERRLOG, *
PERRLOG;
00111
00112 #define SIG_ERRLOG 'GOLE' //error log signature "ELOG"
00113 #define LOGF_INITMASK 0x00000000 //init flags mask
00114
00115 typedef struct _savedata {
00116 ULONG
Signature;
00117 LIST_ENTRY
list;
00118 PERRINFO ErrInfo;
00119 }
SAVEDATA, *
PSAVEDATA;
00120
00121 #define SIG_SAVEDATA 'TADE' //saved error data signature "EDAT"
00122
00123 typedef struct _errmodule {
00124 LIST_ENTRY
list;
00125 GUID
ComponentGuid;
00126 ULONG
NumErrHandlers;
00127 PERRHANDLER HandlerTable[1];
00128 }
ERRMODULE, *
PERRMODULE;
00129
00130
00131
00132
00133 #define IoepGetErrStack(ErrLog) \
00134
CONTAINING_RECORD((ErrLog)->ErrStack.Next, ERRENTRY, slist)
00135
00136 #define IoepGetNextErrEntry(ErrEntry) \
00137
(((ErrEntry)->slist.Next != NULL)? \
00138
CONTAINING_RECORD((ErrEntry)->slist.Next, ERRENTRY, slist): \
00139
NULL)
00140
00141 HANDLE
00142
IoepInitErrLog(
00143 IN ULONG KeyType,
00144 IN PVOID Key,
00145 IN ULONG ulFlags
00146 );
00147
00148
PERRTHREAD
00149
IoepFindErrThread(
00150 IN ULONG KeyType,
00151 IN PVOID Key
00152 );
00153
00154
PERRTHREAD
00155
IoepNewErrThread(
00156 IN ULONG KeyType,
00157 IN PVOID Key
00158 );
00159
00160
VOID
00161
IoepLogErr(
00162 IN ULONG KeyType,
00163 IN PVOID Key,
00164 IN CONST GUID *ComponentGuid,
00165 IN ULONG ErrCode,
00166 IN PWSTR TextData OPTIONAL,
00167 IN ULONG DataBlkType,
00168 IN ULONG DataBlkLen OPTIONAL,
00169 IN PVOID DataBlock OPTIONAL,
00170 IN CONST GUID *MofGuid OPTIONAL
00171 );
00172
00173
VOID
00174
IoepFreeErrStack(
00175 IN PERRENTRY ErrStack
00176 );
00177
00178
PERRMODULE
00179
IoepFindErrModule(
00180 IN CONST GUID *ComponentGuid
00181 );
00182
00183
NTSTATUS
00184
IoepExtractErrData(
00185 IN PERRENTRY ErrStack,
00186 OUT PVOID Buffer,
00187 IN ULONG BuffSize,
00188 OUT PULONG DataSize OPTIONAL
00189 );
00190
00191
NTSTATUS
00192
IoepFireWMIEvent(
00193 IN
PERRINFO ErrInfo,
00194 IN PWSTR InstanceName
00195 );
00196
00197
NTSTATUS
00198
IoepHandleErrCase(
00199 IN
PERRINFO ErrInfo,
00200 IN
PERRCASE ErrCase,
00201 IN ULONG Method,
00202 OUT PUNICODE_STRING unicodeMsg OPTIONAL
00203 );
00204
00205
PERRHANDLER
00206
IoepFindErrHandler(
00207 IN CONST GUID *ComponentGuid,
00208 IN ULONG HandlerIndex
00209 );
00210
00211 BOOLEAN
00212
IoepMatchErrIDPath(
00213 IN
PERRINFO ErrInfo,
00214 IN
PERRID ErrIDPath,
00215 IN ULONG NumErrIDs
00216 );
00217
00218
NTSTATUS
00219
IoepGetErrMessage(
00220 IN
PMSGDATA MsgData,
00221 IN
PERRINFO ErrInfo,
00222 OUT PUNICODE_STRING unicodeMsg
00223 );
00224
00225
NTSTATUS
00226
IoepCatMsgArg(
00227 IN OUT PUNICODE_STRING unicodeMsg,
00228 IN
PMSGARG MsgArg,
00229 IN
PERRINFO ErrInfo
00230 );
00231
00232
NTSTATUS
00233
IoepUnicodeStringCatN(
00234 IN OUT PUNICODE_STRING unicodeStr,
00235 IN PWSTR pwstr,
00236 IN ULONG len
00237 );
00238
00239
PERRCASEDB
00240
IoepGetErrCaseDB(
00241 VOID
00242 );
00243
00244
00245
00246
00247
NTSTATUS
00248
IopGetRegistryValue(
00249 IN HANDLE KeyHandle,
00250 IN PWSTR ValueName,
00251 OUT PKEY_VALUE_FULL_INFORMATION *Information
00252 );
00253
00254
#endif //ifndef _IOEP_H