1 krisbash 1.1 #if defined(_MSC_VER)
2 #ifdef _PREFAST_
3 #pragma warning(push)
4 #pragma warning(disable:26061 26071 26036) //public strsafe.h is giving errors about some of the methods hence disabling it
5 #endif
6
7 #include "strsafe.h"
8
9 #ifdef _PREFAST_
10 #pragma warning(pop)
11 #endif
12
13 #ifdef _PREFAST_
14 #pragma warning(push)
15 #pragma warning(disable:28957)
16 #endif
17 #endif
18
19 #include "omiutils.h"
20 #include <strings.h>
21 #include "OMI_Error.h"
22 krisbash 1.1 #include "OMI_DebugError.h"
23
24 #if defined(_MSC_VER)
25 #ifdef _PREFAST_
26 #pragma warning(pop)
27 #endif
28 #endif
29 #include <assert.h>
30
31
32 static struct { const MI_Char *name; MI_Uint64 id; }
33 DeclIdMap[] = {
34 { MI_T("MSFT_GUID"), 1 },
35 { MI_T("MSFT_ETWEventHeader"), 2 },
36 { MI_T("MSFT_ETWEventPayload"), 3 },
37 { MI_T("MSFT_ETWExtendedData"), 4 },
38 { MI_T("MSFT_ETWEvent"), 5 },
39 { MI_T("CIM_Error"), 6 },
40 { MI_T("OMI_Error"), 7 },
41 { MI_T("OMI_DebugError"), 8 },
42 { MI_T("MSFT_CounterValue"), 9 },
43 krisbash 1.1 { MI_T("MSFT_FormattedCounterValueReal64"), 10 },
44 { MI_T("MSFT_FormattedCounterValueUint32"), 11 },
45 { MI_T("MSFT_FormattedCounterValueUint64"), 12 },
46 { MI_T("MSFT_RawCounterValue"), 13 },
47 { NULL }
48 };
49
50 MI_Uint64 GetClassDeclId(_In_ const MI_ClassDecl* classDecl)
51 {
52 int i = 0;
53
54 for (i=0;DeclIdMap[i].name;++i)
55 if (Tcscmp(classDecl->name, DeclIdMap[i].name) == 0)
56 return DeclIdMap[i].id;
57
58 //else if //
59 if (classDecl->owningClass != (void*)-1)
60 return (MI_Uint64)(ptrdiff_t)(void*)classDecl;
61 else //if (classDecl->owningClass == -1)
62 return 0;
63 }
64 krisbash 1.1
65 /*------------------------------------------------------------------------------
66 Creates a new instance of OMI_Error and sets the values of Message,
67 OMI_ErrorCode, OMI_ErrorType and OMI_ErrorCategory properties.
68 ------------------------------------------------------------------------------*/
69
70 static MI_Result MI_CALL CreateOMIError_shared(
71 _In_z_ const MI_Char* message,
72 MI_Uint32 errorCode,
73 _In_z_ const MI_Char* errorType,
74 MI_Uint16 errorCategory,
75 const MI_ClassDecl *classDecl,
76 _Outptr_ MI_Instance **omiError)
77 {
78 MI_Result result = MI_RESULT_OK;
79 OMI_Error *err = NULL;
80 MI_Application application = {0};
81 *omiError = NULL;
82
83 result = MI_Application_Initialize(0, NULL, omiError, &application);
84 if (result != MI_RESULT_OK)
85 krisbash 1.1 return result;
86
87 result = MI_Application_NewInstance(&application, classDecl->name, classDecl, (MI_Instance**)&err);
88 if (result == MI_RESULT_OK)
89 {
90 result = OMI_Error_Set_Message(err, message);
91 if (result != MI_RESULT_OK) goto Exit;
92 result = OMI_Error_Set_error_Code(err, errorCode);
93 if (result != MI_RESULT_OK) goto Exit;
94 result = OMI_Error_Set_error_Type(err, errorType);
95 if (result != MI_RESULT_OK) goto Exit;
96 result = OMI_Error_Set_error_Category(err, errorCategory);
97 if (result != MI_RESULT_OK) goto Exit;
98 result = OMI_Error_Set_CIMStatusCode(err, MI_RESULT_FAILED);
99 if (result != MI_RESULT_OK) goto Exit;
100 *omiError = (MI_Instance*)err;
101 }
102
103 Exit:
104 if ((result != MI_RESULT_OK) && err) MI_Instance_Delete((MI_Instance*)err);
105 MI_Application_Close(&application);
106 krisbash 1.1 return result;
107 }
108
109 _Use_decl_annotations_
110 MI_Result MI_CALL CreateOMIError(
111 const MI_Char* message,
112 MI_Uint32 errorCode,
113 const MI_Char* errorType,
114 MI_Uint16 errorCategory,
115 MI_Instance **omiError)
116 {
117 return CreateOMIError_shared(
118 message, errorCode, errorType, errorCategory,
119 &OMI_Error_rtti,
120 omiError);
121 }
122
123 _Use_decl_annotations_
124 MI_Result MI_CALL CreateOMIDebugError(
125 const MI_Char* message,
126 MI_Uint32 errorCode,
127 krisbash 1.1 const MI_Char* errorType,
128 MI_Uint16 errorCategory,
129 MI_Instance **omiError)
130 {
131 return CreateOMIError_shared(
132 message, errorCode, errorType, errorCategory,
133 &OMI_DebugError_rtti,
134 omiError);
135 }
136
137
138 static MI_Result MI_CALL CreateOMIError_FromMiResult_shared(
139 MI_Result miResult,
140 const MI_ClassDecl *classDecl,
141 _Outptr_ MI_Instance **omiError)
142 {
143 const MI_Char* message;
144 MI_Uint16 errorCategory;
145
146 switch (miResult)
147 {
148 krisbash 1.1 case MI_RESULT_OK:
149 assert(0 && "Why would one call CreateOMIError_FromMiResult(MI_RESULT_OK)?");
150 message = MI_T("MI_RESULT_OK");
151 errorCategory = MI_ERRORCATEGORY_NOT_SPECIFIED;
152 break;
153 case MI_RESULT_FAILED :
154 message = MI_T("MI_RESULT_FAILED");
155 errorCategory = MI_ERRORCATEGORY_NOT_SPECIFIED;
156 break;
157 case MI_RESULT_ACCESS_DENIED :
158 message = MI_T("MI_RESULT_ACCESS_DENIED");
159 errorCategory = MI_ERRORCATEGORY_ACCESS_DENIED;
160 break;
161 case MI_RESULT_INVALID_NAMESPACE :
162 message = MI_T("MI_RESULT_INVALID_NAMESPACE");
163 errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
164 break;
165 case MI_RESULT_INVALID_PARAMETER :
166 message = MI_T("MI_RESULT_INVALID_PARAMETER");
167 errorCategory = MI_ERRORCATEGORY_INVALID_ARGUMENT;
168 break;
169 krisbash 1.1 case MI_RESULT_INVALID_CLASS :
170 message = MI_T("MI_RESULT_INVALID_CLASS");
171 errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
172 break;
173 case MI_RESULT_NOT_FOUND :
174 message = MI_T("MI_RESULT_NOT_FOUND");
175 errorCategory = MI_ERRORCATEGORY_OBJECT_NOT_FOUND;
176 break;
177 case MI_RESULT_NOT_SUPPORTED :
178 message = MI_T("MI_RESULT_NOT_SUPPORTED");
179 errorCategory = MI_ERRORCATEGORY_NOT_IMPLEMENTED;
180 break;
181 case MI_RESULT_CLASS_HAS_CHILDREN :
182 message = MI_T("MI_RESULT_CLASS_HAS_CHILDREN");
183 errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
184 break;
185 case MI_RESULT_CLASS_HAS_INSTANCES :
186 message = MI_T("MI_RESULT_CLASS_HAS_INSTANCES");
187 errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
188 break;
189 case MI_RESULT_INVALID_SUPERCLASS :
190 krisbash 1.1 message = MI_T("MI_RESULT_INVALID_SUPERCLASS");
191 errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
192 break;
193 case MI_RESULT_ALREADY_EXISTS :
194 message = MI_T("MI_RESULT_ALREADY_EXISTS");
195 errorCategory = MI_ERRORCATEGORY_RESOURCE_EXISTS;
196 break;
197 case MI_RESULT_NO_SUCH_PROPERTY :
198 message = MI_T("MI_RESULT_NO_SUCH_PROPERTY");
199 errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
200 break;
201 case MI_RESULT_TYPE_MISMATCH :
202 message = MI_T("MI_RESULT_TYPE_MISMATCH");
203 errorCategory = MI_ERRORCATEGORY_INVALID_TYPE;
204 break;
205 case MI_RESULT_QUERY_LANGUAGE_NOT_SUPPORTED :
206 message = MI_T("MI_RESULT_QUERY_LANGUAGE_NOT_SUPPORTED");
207 errorCategory = MI_ERRORCATEGORY_NOT_IMPLEMENTED;
208 break;
209 case MI_RESULT_INVALID_QUERY :
210 message = MI_T("MI_RESULT_INVALID_QUERY");
211 krisbash 1.1 errorCategory = MI_ERRORCATEGORY_INVALID_ARGUMENT;
212 break;
213 case MI_RESULT_METHOD_NOT_AVAILABLE :
214 message = MI_T("MI_RESULT_METHOD_NOT_AVAILABLE");
215 errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
216 break;
217 case MI_RESULT_METHOD_NOT_FOUND :
218 message = MI_T("MI_RESULT_METHOD_NOT_FOUND");
219 errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
220 break;
221 case MI_RESULT_NAMESPACE_NOT_EMPTY :
222 message = MI_T("MI_RESULT_NAMESPACE_NOT_EMPTY");
223 errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
224 break;
225 case MI_RESULT_INVALID_ENUMERATION_CONTEXT :
226 message = MI_T("MI_RESULT_INVALID_ENUMERATION_CONTEXT");
227 errorCategory = MI_ERRORCATEGORY_METADATA_ERROR;
228 break;
229 case MI_RESULT_INVALID_OPERATION_TIMEOUT :
230 message = MI_T("MI_RESULT_INVALID_OPERATION_TIMEOUT");
231 errorCategory = MI_ERRORCATEGORY_INVALID_ARGUMENT;
232 krisbash 1.1 break;
233 case MI_RESULT_PULL_HAS_BEEN_ABANDONED :
234 message = MI_T("MI_RESULT_PULL_HAS_BEEN_ABANDONED");
235 errorCategory = MI_ERRORCATEGORY_OPERATION_STOPPED;
236 break;
237 case MI_RESULT_PULL_CANNOT_BE_ABANDONED :
238 message = MI_T("MI_RESULT_PULL_CANNOT_BE_ABANDONED");
239 errorCategory = MI_ERRORCATEGORY_CLOS_EERROR;
240 break;
241 case MI_RESULT_FILTERED_ENUMERATION_NOT_SUPPORTED :
242 message = MI_T("MI_RESULT_FILTERED_ENUMERATION_NOT_SUPPORTED");
243 errorCategory = MI_ERRORCATEGORY_NOT_IMPLEMENTED;
244 break;
245 case MI_RESULT_CONTINUATION_ON_ERROR_NOT_SUPPORTED :
246 message = MI_T("MI_RESULT_CONTINUATION_ON_ERROR_NOT_SUPPORTED");
247 errorCategory = MI_ERRORCATEGORY_NOT_IMPLEMENTED;
248 break;
249 case MI_RESULT_SERVER_LIMITS_EXCEEDED :
250 message = MI_T("MI_RESULT_SERVER_LIMITS_EXCEEDED");
251 errorCategory = MI_ERRORCATEGORY_RESOURCE_BUSY;
252 break;
253 krisbash 1.1 case MI_RESULT_SERVER_IS_SHUTTING_DOWN :
254 message = MI_T("MI_RESULT_SERVER_IS_SHUTTING_DOWN");
255 errorCategory = MI_ERRORCATEGORY_RESOURCE_UNAVAILABLE;
256 break;
257 default:
258 errorCategory = MI_ERRORCATEGORY_NOT_SPECIFIED;
259 message = MI_T("Unrecognized MI_Result");
260 break;
261 }
262
263 return CreateOMIError_shared(message, miResult, MI_RESULT_TYPE_MI, errorCategory, classDecl, omiError);
264 }
265
266 _Use_decl_annotations_
267 MI_Result MI_CALL CreateOMIError_FromMiResult(
268 MI_Result miResult,
269 MI_Instance **omiError)
270 {
271 return CreateOMIError_FromMiResult_shared(miResult, &OMI_Error_rtti, omiError);
272 }
273
274 krisbash 1.1 _Use_decl_annotations_
275 MI_Result MI_CALL CreateOMIDebugError_FromMiResult(
276 MI_Result miResult,
277 MI_Instance **omiError)
278 {
279 return CreateOMIError_FromMiResult_shared(miResult, &OMI_DebugError_rtti, omiError);
280 }
|