summaryrefslogtreecommitdiff
path: root/src/inc/msodw.h
blob: d0745d25517b307222a452c49fd81486fcf73b7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#pragma once

/****************************************************************************
    This files contains the handshake structure with which apps will launch
    Watson.
****************************************************************************/

#ifndef MSODW_H
#define MSODW_H
#pragma pack(push, msodw_h)
#pragma pack(4)

#define DW_TIMEOUT_VALUE    20000
#define DW_MUTEX_TIMEOUT    DW_TIMEOUT_VALUE / 2
#define DW_NOTIFY_TIMEOUT   120000 // 2 minutes

#define DW_CURRENT_VERSION  0x00020000

#define DW_MAX_ASSERT_CCH   1024
#define DW_MAX_PATH         260
#define DW_APPNAME_LENGTH   56
#define DW_MAX_ERROR_CWC    260 // must be at least max_path
#define DW_MAX_REGSUBPATH   200
#define DW_MAX_CALLSTACK    16
#define DW_MAX_EVENTSOURCE  DW_MAX_PATH
#define DW_MAX_PIDREGKEY    DW_MAX_PATH
#define DW_MAX_BUCKETPARAM_CWC  255
#define DW_MAX_USERDOCS_CWC 1024

// return values for DW process
#define DW_RETVAL_SUCCESS   0
#define DW_RETVAL_FAILURE   1
#define DW_RETVAL_DEBUG     16

#define DW_ALLMODULES              L"*\0"
#define DW_NOTAG 0

// this is added to the command line of the restarted app if fDweTagCommandLine is set
#define DW_CMDLINE_TAG "Watson=1"

// The following are the fields that can be specified in a manifest file to
// launch DW in a file based reporting mode.
// The following are required UI fields.
#define DW_MANIFEST_GENERAL_APPNAME  L"General_AppName="
#define DW_MANIFEST_MAIN_INTRO_BOLD  L"Main_Intro_Bold="
#define DW_MANIFEST_QUEUED_EVENTDESCRIPTION L"Queued_EventDescription=" // this will only be shown if the report is queued

// The following are required reporting fields.
#define DW_MANIFEST_LCID             L"UI LCID="
#define DW_MANIFEST_VERSION          L"Version=" // set this to DW_CURRENT_VERSION defined in this file

// There are two ways to specify your bucket parameters.
// The first is to fill in as many of these as you need,
// and let DW construct URLs and UNC paths for you.
#define DW_MANIFEST_EVENTTYPE   L"EventType="
#define DW_MANIFEST_P1          L"P1="
#define DW_MANIFEST_P2          L"P2="
#define DW_MANIFEST_P3          L"P3="
#define DW_MANIFEST_P4          L"P4="
#define DW_MANIFEST_P5          L"P5="
#define DW_MANIFEST_P6          L"P6="
#define DW_MANIFEST_P7          L"P7="
#define DW_MANIFEST_P8          L"P8="
#define DW_MANIFEST_P9          L"P9="
#define DW_MANIFEST_P10         L"P10="

// Alternatively, you can spell it all out for us.
#define DW_MANIFEST_URL1         L"Stage1URL="
#define DW_MANIFEST_URL2         L"Stage2URL="
#define DW_MANIFEST_ERRORSUBPATH L"ErrorSubPath="

// The following are optional; DW has default behavior for all of these.
// These are UI fields (see UserInterfaceBlock for documentation if not listed below)
#define DW_MANIFEST_GENERAL_REPORTEE    L"General_Reportee="

#define DW_MANIFEST_MAIN_CAPTION        L"Main_Caption="
#define DW_MANIFEST_MAIN_ICONFILE       L"Main_IconFile=" // otherwise, no icon
#define DW_MANIFEST_MAIN_INTRO_REG      L"Main_Intro_Reg=" // otherwise DAL collapses space
#define DW_MANIFEST_MAIN_CHECKBOX       L"Main_CheckBox="
#define DW_MANIFEST_MAIN_PLEA_BOLD      L"Main_Plea_Bold="
#define DW_MANIFEST_MAIN_PLEA_REG       L"Main_Plea_Reg=" // otherwise DAL collapses space
#define DW_MANIFEST_MAIN_DETAILSLINK    L"Main_DetailsLink="
#define DW_MANIFEST_MAIN_REPORTBTN      L"Main_ReportBtn="
#define DW_MANIFEST_MAIN_NOREPORTBTN    L"Main_NoReportBtn="
#define DW_MANIFEST_MAIN_ALWAYSREPORTBTN L"Main_AlwaysReportBtn="
#define DW_MANIFEST_MAIN_QUEUEBTN       L"Main_QueueBtn="
#define DW_MANIFEST_MAIN_NOQUEUEBTN     L"Main_NoQueueBtn="
#define DW_MANIFEST_MAIN_QUEUETEXT      L"Main_QueueText="
#define DW_MANIFEST_MAIN_FEEDBACKLINK   L"Main_FeedbackLink="

#define DW_MANIFEST_DETAILS_CAPTION     L"Details_Caption="
#define DW_MANIFEST_DETAILS_PRE_HEADER  L"Details_Pre_Header="
#define DW_MANIFEST_DETAILS_PRE_BODY    L"Details_Pre_Body="
#define DW_MANIFEST_DETAILS_SIG_HEADER  L"Details_Sig_Header="
#define DW_MANIFEST_DETAILS_SIG_BODY    L"Details_Sig_Body="
#define DW_MANIFEST_DETAILS_POST_HEADER L"Details_Post_Header="
#define DW_MANIFEST_DETAILS_POST_BODY   L"Details_Post_Body=" // pretty similar to exception mode, but calls out DigPid too.
#define DW_MANIFEST_DETAILS_TECHLINK    L"Details_TechLink="
#define DW_MANIFEST_DETAILS_DCPLINK     L"Details_DCPLink="

#define DW_MANIFEST_TECH_CAPTION        L"Tech_Caption="
#define DW_MANIFEST_TECH_FILES_HEADER   L"Tech_Files_Header="

#define DW_MANIFEST_TRANSFER_CAPTION    L"Transfer_Caption="
#define DW_MANIFEST_TRANSFER_1CHECK     L"Transfer_1check="
#define DW_MANIFEST_TRANSFER_2CHECK     L"Transfer_2check="
#define DW_MANIFEST_TRANSFER_3CHECK     L"Transfer_3check="
#define DW_MANIFEST_TRANSFER_STATUS_INPROGRESS      L"Transfer_Status_InProgress="
#define DW_MANIFEST_TRANSFER_STATUS_DONE            L"Transfer_Status_Done="
#define DW_MANIFEST_TRANSFER_CHECKBOX   L"Transfer_Checkbox="

#define DW_MANIFEST_SECONDLEVEL_CAPTION     L"SecondLevel_Caption="
#define DW_MANIFEST_SECONDLEVEL_PRE         L"SecondLevel_Pre="
#define DW_MANIFEST_SECONDLEVEL_POST        L"SecondLevel_Post="

#define DW_MANIFEST_FINAL_CAPTION           L"Final_Caption="
#define DW_MANIFEST_FINAL_TEXT              L"Final_Text="
#define DW_MANIFEST_FINAL_TEXT_USERCANCEL   L"Final_Text_UserCancel="
#define DW_MANIFEST_FINAL_LINK              L"Final_Link="
#define DW_MANIFEST_FINAL_LINK_SURVEY       L"Final_Link_Survey="

#define DW_MANIFEST_STANDBY_CAPTION     L"Standby_Caption="
#define DW_MANIFEST_STANDBY_BODY        L"Standby_Body="

// These are reporting fields.
#define DW_MANIFEST_RFLAGS       L"ReportingFlags="
#define DW_MANIFEST_UFLAGS       L"UIFlags="
#define DW_MANIFEST_LFLAGS       L"LoggingFlags="
#define DW_MANIFEST_MFLAGS       L"MiscFlags="
#define DW_MANIFEST_BRAND        L"Brand="
#define DW_MANIFEST_EVENTSOURCE  L"EventLogSource="
#define DW_MANIFEST_EVENTID      L"EventID="
#define DW_MANIFEST_DIGPIDPATH   L"DigPidRegPath="
#define DW_MANIFEST_CHECKBOX_REGKEY L"CheckBoxRegKey="
#define DW_MANIFEST_CUSTOM_QUERY_STRING_ELEMENTS L"CustomQueryStringElements="

// DW expects at least one of these to be set.
#define DW_MANIFEST_DELETABLEFILES      L"FilesToDelete="
#define DW_MANIFEST_NONDELETABLEFILES   L"FilesToKeep="

// These may be optionally set, and will be used on second-level data requests.
#define DW_MANIFEST_USERFILES           L"UserDocs="
#define DW_MANIFEST_HEAP                L"Heap="


#define DW_X(X)                  L##X
#define DW_Y(X)                  DW_X(X)

// Seperator for file lists (Manifest DataFiles and Exception Additional Files)
#define DW_FILESEPA              '|'
#define DW_FILESEP               DW_Y(DW_FILESEPA)

#define DW_OMIT_SECTION          L"NIL"
#define DW_APPNAME_TOKEN         L"%General_AppName%"
#define DW_REPORTEE_TOKEN        L"%General_Reportee%"

// the following is required for queued information file only
#define DW_QR_VERSION              L"QueueVer="
#define DW_QR_DATE                 L"Date="
#define DW_QR_TIME                 L"Time="
#define DW_QR_REPORTSIZE           L"ReportSize="
#define DW_QR_BYTES                L"Bytes="
#define DW_QR_KILOBYTES            L"Kilobytes="
#define DW_QR_MEGABYTES            L"Megabytes="
#define DW_QR_MOREINFO             L"MoreInfo="
#define DW_QR_BP0                  L"BP0="
#define DW_QR_BP1                  L"BP1="
#define DW_QR_BP2                  L"BP2="
#define DW_QR_BP3                  L"BP3="
#define DW_QR_BP4                  L"BP4="
#define DW_QR_BP5                  L"BP5="
#define DW_QR_BP6                  L"BP6="
#define DW_QR_BP7                  L"BP7="
#define DW_QR_BP8                  L"BP8="
#define DW_QR_BP9                  L"BP9="
#define DW_QR_BP10                 L"BP10="
#define DW_QR_CBP                  L"CBP="
#define DW_QR_DWVER0               L"DWVer0="
#define DW_QR_DWVER1               L"DWVer1="
#define DW_QR_DWVER2               L"DWVer2="
#define DW_QR_DWVER3               L"DWVer3="
#define DW_QR_MODE                 L"QueueMode="


// shared reg values between DW and DW COM EXE
#define DEFAULT_SUBPATH L"Microsoft\\PCHealth\\ErrorReporting\\DW"
#define QUEUE_REG_SUBPATH  L"Software\\" DEFAULT_SUBPATH
#define QUEUE_REG_OKTOREPORT_VALUE L"OkToReportFromTheseQueues"
#define WATSON_INSTALLED_REG_SUBPATH QUEUE_REG_SUBPATH L"\\Installed"
#define WATSON_INSTALLED_REG_SUBPATH_IA64 L"Software\\Wow6432Node\\"DEFAULT_SUBPATH L"\\Installed"
#define WATSON_INSTALLED_REG_VAL L"DW0200" // keep in sync with %MSI%\src\sdl\shared\watson.sreg
#define WATSON_INSTALLED_REG_VAL_IA64 L"DW0201" // keep in sync with %MSI%\src\sdl\shared\watson.sreg

// names for the Watson exes
#define DW_EXEA            "dw20.exe"
#define DW_EXE             DW_Y(DW_EXEA)
#define DW_COM_EXEA        "dwtrig20.exe"
#define DW_COM_EXE         DW_Y(DW_COM_EXEA)

// the following option is used to exec DW to set the trigger for queued reporting
// ie Run 'dw20 -k <queue number>'
#define OPTSQRTA 'k' // queued reporting trigger
#define OPTSQRT DW_Y(OPTSQRTA)

// the following option is used to exec DW in queued reporting mode
// ie Run 'dw20 -q <queue types to report from>'
#define OPTQRMA 'q' // queued reporting mode
#define OPTQRM DW_Y(OPTQRMA)

// the following option is used to exec the DW COM EXE to trigger queued reporting after a delay time
// ie Run 'dwtrig20 -t'
#define OPTQRTA 't' // queued reporting trigger
#define OPTQRT DW_Y(OPTQRTA)

// the following option is used to exec the DW COM EXE to trigger queued reporting immediately
// ie Run 'dwtrig20 -f <queue types to report from>'
#define OPTQRFA 'f' // force queued reporting
#define OPTQRF DW_Y(OPTQRFA)

#define C_QUEUE_TYPES      3

enum // EQueueTypes
{
    dwqueueMin              = 0x00000001,

    // all the queues types
    // these must be consecutive
    // (valid range for queue types is 0x00000001 - 0x00008000, 16 total)
    dwqueueRegular          = 0x00000001,
    dwqueueSignOff          = 0x00000002,
    dwqueueHeadless         = 0x00000004,
    // next valid queue type: 0x00000008

    // the maximum dwqueueMax is 0x00008000
    dwqueueMax              = 0x00000004,

    // triggering flags (valid range for triggers is 0x00010000 - 0x08000000, 12 total)
    dwtriggerAtLogon          = 0x00010000,
    dwtriggerAtConnectionMade = 0x00020000,

    // special flags (valid range for special flags is 0x1000000 - 0x80000000, 4 total)
    dwqueueAnyAdmin                = 0x10000000, // Admin queue

    // flag combinations
    dwqueueTypes            = 0x00000007, // Regular | SignOff | Headless
};

enum // EQueuedReportingDialogResults
{
      qrdrCancel           = 0x00000001,
      qrdrLater            = 0x00000002,
      qrdrDone             = 0x00000004,
};


#ifdef DEBUG
enum // AssertActionCodes
{
    DwAssertActionFail = 0,
    DwAssertActionDebug,
    DwAssertActionIgnore,
    DwAssertActionAlwaysIgnore,
    DwAssertActionIgnoreAll,
    DwAssertActionQuit,
};
#endif

//  Caller is the app that has experienced an exception and launches DW

enum // ECrashTimeDialogStates  // msoctds
{
    msoctdsNull          = 0x00000000,
    msoctdsQuit          = 0x00000001,
    msoctdsRestart       = 0x00000002,
    msoctdsRecover       = 0x00000004,
    msoctdsUnused        = 0x00000008,
    msoctdsDebug         = 0x00000010,
};

#define MSODWRECOVERQUIT (msoctdsRecover | msoctdsQuit)
#define MSODWRESTARTQUIT (msoctdsRestart | msoctdsQuit)
#define MSODWRESPONSES (msoctdsQuit | msoctdsRestart | msoctdsRecover)

// THIS IS PHASED OUT -- DON'T USE
enum  // EMsoCrashHandlerFlags  // msochf
{
    msochfNull                = 0x00000000,
    msochfCheckboxOff         = 0x00000001,

    msochfUnused              = msoctdsUnused,  // THESE MUST BE THE SAME 0x8
    msochfCanRecoverDocuments = msoctdsRecover, // 0x4

    msochfObsoleteCanDebug    = 0x00010001,  // not used anymore
    msochfCannotSneakyDebug   = 0x00010002,  // The "hidden" debug feature won't work
    msochfDefaultDontReport   = 0x00010004,
    msochReportingDisabled    = 0x00010008,  // User cannot change default reporting choice
};


//
enum  // EMsoCrashHandlerResults  // msochr
{
    msochrNotHandled        = msoctdsNull,
    msochrUnused            = msoctdsUnused,
    msochrDebug             = msoctdsDebug,
    msochrRecoverDocuments  = msoctdsRecover,
    msochrRestart           = msoctdsRestart,
    msochrQuit              = msoctdsQuit,
};

enum  // EDwReportingFlags
{
    fDwrDeleteFiles          = 0x00000001,   // delete "files to delete" after use (plus heap, minidump, manifest).
    fDwrIgnoreHKCU           = 0x00000002,   // Only look at HKLM. If you do not set this, we will look at both HKCU and HKLM.
    fDwrForceOfflineMode     = 0x00000008,   // DW will force the report to be queued
    fDwrForceToAdminQueue    = 0x00000004 | fDwrForceOfflineMode,   // DW will force the report to be queued on the Admin queue
    fDwrDenyOfflineMode      = 0x00000010,   // DW will not allow report to be queued
    fDwrNoHeapCollection     = 0x00000020,   // DW will not gather the heap.
    fDwrNoSecondLevelCollection = 0x00000040 | fDwrNoHeapCollection, // DW will not send any second level data, including the heap
    fDwrNeverUpload          = 0x00000080,   // don't report
    fDwrDontPromptIfCantReport = 0x00000100, // DW will not show any UI if we're not going to report.
    fDwrNoDefaultCabLimit    = 0x00000200,   // DW under CER won't use 5 as the fallback but unlimited instead (policy still overrides)
};

enum  // EDwUIFlags
{
    fDwuNoEventUI            = 0x00000001,   // DW will always try to send headless, regardless of DWAllowHeadless
    // Having no UI reporting from the queue means that there is no UI at the time of the event
    fDwuNoQueueUI            = 0x00000002 | fDwuNoEventUI, // DW will put the report in the headless queue with no UI
    fDwuShowFeedbackLink     = 0x00000004,   // Show the "Why should I report" link.
    fDwuUseIE                = 0x00000008,   // always launch w/ IE

    // DO NOT use this flag.  It doesn't work.  Instead customize by using the UserInterfaceBlock.
    fDwuUseLitePlea          = 0x00000010,   // DW won't suggest product change in report plea

    fDwuManifestDebug        = 0x00000020,   // DW will provide a debug button in manifest mode
    fDwuDenySuspend          = 0x00000040,   // DW will keep powersave mode from suspending it, until transfer is complete.
};

enum  // EDwLoggingFlags
{
    fDwlNoParameterLog       = 0x00000001,   // DW won't log the initial parameters
    fDwlNoBucketLog          = 0x00000002,   // DW won't log the bucket ID and the bucket parameters
    fDwlResponseLog          = 0x00000004,   // log the resolved response, including extra args, to the event log with event 1010.
};

enum  // EDwExceptionModeFlags
{
    fDweCheckSig             = 0x00000001,   // checks the signatures of the App/Mod list
    fDweTagCommandLine       = 0x00000002,   // adds DW_CMDLINE_TAG to command line when restarting apps.
    fDweDefaultQuit          = 0x00000004,   // In exception mode, DW will default the restart/recover box to off. Doesn't affect regkey-based checkboxes.
    fDweKeepMinidump         = 0x00000008,   // Don't delete the minidump when we're done using it.
    fDweIgnoreAeDebug        = 0x00000010,   // Don't check AeDebug to determine whether or not to show the Debug button.
    fDweGatherHeapAsMdmp     = 0x00000020,   // Use the minidump API to gather the heap, rather than the minimal version we build directly
    fDweReleaseBeforeCabbing = 0x00000040,   // Release the thread doing the dump and cab the files in the background.
};

enum  // EDwMiscFlags
{
    fDwmOfficeDigPID         = 0x00000001,   // use custom internal code to figure out what SKU of Office is installed
    fDwmOfficeSQMReporting   = 0x00000002,   // DW should collect SQM data and save it for Office to upload (if QMEnabled reg key is set).
    fDwmContainsOnlyAnonymousData = 0x00000003, // DW does nothing with this flag, but the LH shim will recognize it. It should be used in rare
                                                // circumstances when the silent report is known to contain NO PII.
};


typedef struct _AssertBlock
{
    // for Assert communication
    DWORD dwTag;                       // [in] AssertTag
    char szAssert[DW_MAX_ASSERT_CCH];  // [in] Sz from the assert
    int AssertActionCode;              // [out] action code to take

    DWORD cdwCallstack; // The number of actual callstack entries
    DWORD rgdwCallstack[DW_MAX_CALLSTACK]; // Callstack

} AssertBlock;

typedef struct _UserInterfaceBlock
{
    // THIS ITEM IS REQUIRED. We do not go find your executable name to use instead.
    WCHAR wzGeneral_AppName[DW_APPNAME_LENGTH];

    // everything below this point is optional
    WCHAR wzGeneral_Reportee[DW_APPNAME_LENGTH];    // on whose behalf we request the report; otherwise "Microsoft"

    WCHAR wzMain_Caption[DW_MAX_ERROR_CWC];         // otherwise <General_AppName>
    WCHAR wzMain_IconFile[DW_MAX_PATH];             // otherwise pulled from executable
    WCHAR wzMain_Intro_Bold[DW_MAX_ERROR_CWC];      // otherwise "<General_AppName> has encountered a problem and needs to close. We are sorry for the inconvenience."
    WCHAR wzMain_Intro_Reg[DW_MAX_ERROR_CWC];       // various defaults, usually "Please tell <General_Reportee> about this problem"
    WCHAR wzMain_Checkbox[DW_MAX_ERROR_CWC];        // otherwise "Don't show me this again"
    WCHAR wzMain_Plea_Bold[DW_MAX_ERROR_CWC];       // otherwise "Please tell <General_Reportee> about this problem" ("NIL" means skip whole string)
    WCHAR wzMain_Plea_Reg[DW_MAX_ERROR_CWC];        // otherwise "We have created an error report that you can send to help us improve <General_AppName>. We will treat this report as confidential and anonymous."
    WCHAR wzMain_DetailsLink[DW_MAX_ERROR_CWC];     // otherwise "See what data this error report contains."
    WCHAR wzMain_ReportBtn[DW_APPNAME_LENGTH];      // otherwise "&Send Error Report"
    WCHAR wzMain_NoReportBtn[DW_APPNAME_LENGTH];    // otherwise "&Don't Send"
    WCHAR wzMain_AlwaysReportBtn[DW_APPNAME_LENGTH];// otherwise "&Send Error Report"
    WCHAR wzMain_QueueBtn[DW_APPNAME_LENGTH];       // otherwise "&Send Report Later"
    WCHAR wzMain_NoQueueBtn[DW_APPNAME_LENGTH];     // otherwise "&Don't Report"
    WCHAR wzMain_QueueText[DW_MAX_ERROR_CWC];       // otherwise "You cannot send this error report now because you are not connected...."
    WCHAR wzMain_FeedbackLink[DW_MAX_ERROR_CWC];    // otherwise "Why should I report to %General_Reportee%?"

    WCHAR wzDetails_Caption[DW_MAX_ERROR_CWC];      // otherwise <General_AppName>
    WCHAR wzDetails_Pre_Header[DW_MAX_ERROR_CWC];   // otherwise "Error Details"
    WCHAR wzDetails_Pre_Body[DW_MAX_ERROR_CWC];     // otherwise "foo" ("NIL" means delete whole Pre section)
    WCHAR wzDetails_Sig_Header[DW_MAX_ERROR_CWC];   // otherwise "Error Signature"
    WCHAR wzDetails_Sig_Body[DW_MAX_ERROR_CWC];     // otherwise constructed by DW from bucket params from stage 2 URL ("NIL" means delete whole Sig section)
    WCHAR wzDetails_Post_Header[DW_MAX_ERROR_CWC];  // otherwise "Reporting Details"
    WCHAR wzDetails_Post_Body[DW_MAX_ERROR_CWC];    // otherwise "This error report includes:..." ("NIL" means delete whole Post section)
    WCHAR wzDetails_TechLink[DW_MAX_ERROR_CWC];     // otherwise "View the contents of this error report"
    WCHAR wzDetails_DCPLink[DW_MAX_ERROR_CWC];      // otherwise "Read our Data Collection Policy"

    WCHAR wzTech_Caption[DW_MAX_ERROR_CWC];         // otherwise "Error Report Contents"
    WCHAR wzTech_MDump_Header[DW_MAX_ERROR_CWC];    // otherwise "The following information about your process will be reported...."
    WCHAR wzTech_Files_Header[DW_MAX_ERROR_CWC];    // otherwise "The following files will be included in this error report."

    WCHAR wzTransfer_Caption[DW_MAX_ERROR_CWC];     // otherwise "Error Reporting"
    WCHAR wzTransfer_1Check[DW_MAX_ERROR_CWC];      // otherwise "Preparing error report"
    WCHAR wzTransfer_2Check[DW_MAX_ERROR_CWC];      // otherwise "Connecting to server"
    WCHAR wzTransfer_3Check[DW_MAX_ERROR_CWC];      // otherwise "Checking for the status of this problem"
    WCHAR wzTransfer_Status_InProgress[DW_MAX_ERROR_CWC];   // otherwise "Transferring report..."
    WCHAR wzTransfer_Status_Done[DW_MAX_ERROR_CWC]; // otherwise "Reporting Completed.  Thank you!"
    WCHAR wzTransfer_Checkbox[DW_MAX_ERROR_CWC];    // otherwise "Close When Done"

    WCHAR wzSecondLevel_Caption[DW_MAX_ERROR_CWC];  // otherwise "More Information"
    WCHAR wzSecondLevel_Pre[DW_MAX_ERROR_CWC];      // otherwise "In order to correctly diagnose this problem the following information...."
    WCHAR wzSecondLevel_Post[DW_MAX_ERROR_CWC];     // otherwise "Please click "Cancel" if you do not wish to share this information" (May also contain "Your files may contain sensitive information")

    WCHAR wzFinal_Caption[DW_MAX_ERROR_CWC];        // otherwise "Reporting"
    WCHAR wzFinal_Text[DW_MAX_ERROR_CWC];           // otherwise "Thank you for taking the time to report this problem."
    WCHAR wzFinal_Text_UserCancel[DW_MAX_ERROR_CWC]; // otherwise "Reporting stopped on user cancel."
    WCHAR wzFinal_Link[DW_MAX_ERROR_CWC];           // otherwise "Get more information about preventing this problem in the future."
    WCHAR wzFinal_Link_Survey[DW_MAX_ERROR_CWC];    // otherwise "Provide additional information about this problem via a short questionnaire."

    WCHAR wzStandby_Caption[DW_MAX_ERROR_CWC];      // otherwise "Power Management"
    WCHAR wzStandby_Body[DW_MAX_ERROR_CWC];         // otherwise "Windows cannot go on standby because <General_AppName> has experienced..."

    WCHAR wzDialup_Caption[DW_MAX_ERROR_CWC];       // otherwise "Active Internet Connection Required"
    WCHAR wzDialup_Body[DW_MAX_ERROR_CWC];          // otherwise "In order to report this problem, you must connect to the Internet. Please start your connection before continuing."

    WCHAR wzHangup_Caption[DW_MAX_ERROR_CWC];       // otherwise "Finished Reporting"
    WCHAR wzHangup_Body[DW_MAX_ERROR_CWC];          // otherwise "Reporting has finished. You may close your Internet connection now."
    WCHAR wzHangup_Body_UserCancel[DW_MAX_ERROR_CWC];   // otherwise "Reporting has been cancelled. You may close your Internet connection now."

    WCHAR wzQueued_EventDescription[DW_MAX_ERROR_CWC];  // otherwise "Application Error"

} UserInterfaceBlock;


typedef struct _CustomMinidumpBlock
{
    BOOL  fCustomMinidump;
    DWORD dwMinidumpType;
    BOOL  fOnlyThisThread;
    DWORD dwThisThreadFlags;
    DWORD dwOtherThreadFlags;
    DWORD dwThisThreadExFlags;
    DWORD dwOtherThreadExFlags;
    DWORD dwPreferredModuleFlags;
    DWORD dwOtherModuleFlags;
} CustomMinidumpBlock;

typedef struct _GenericModeBlock
{
    BOOL fInited;
    WCHAR wzEventTypeName[DW_MAX_BUCKETPARAM_CWC];
    WCHAR wzP1[DW_MAX_BUCKETPARAM_CWC];
    WCHAR wzP2[DW_MAX_BUCKETPARAM_CWC];
    WCHAR wzP3[DW_MAX_BUCKETPARAM_CWC];
    WCHAR wzP4[DW_MAX_BUCKETPARAM_CWC];
    WCHAR wzP5[DW_MAX_BUCKETPARAM_CWC];
    WCHAR wzP6[DW_MAX_BUCKETPARAM_CWC];
    WCHAR wzP7[DW_MAX_BUCKETPARAM_CWC];
    WCHAR wzP8[DW_MAX_BUCKETPARAM_CWC];
    WCHAR wzP9[DW_MAX_BUCKETPARAM_CWC];
    WCHAR wzP10[DW_MAX_BUCKETPARAM_CWC];
} GenericModeBlock;


typedef struct _DWSharedMem20
{
    DWORD dwSize;               // should be set to size of DWSharedMem
    DWORD dwVersion;            // callers should set this to DWCurrentVersion as in this header

    DWORD pid;                  // Process Id of caller
    DWORD tid;                  // Id of excepting thread
    DWORD_PTR eip;              // EIP of the excepting instruction
    PEXCEPTION_POINTERS pep;    // Exception pointers given to the callee's
                                // exception handler
    HANDLE hEventDone;          // event DW signals when done
                                // caller will also signal this if it things
                                // DW has hung and restarts itself
    HANDLE hEventNotifyDone;    // App sets when it's done w/ notifcation phase
    HANDLE hEventAlive;         // heartbeat event DW signals per EVENT_TIMEOUT
    HANDLE hMutex;              // to protect the signaling of EventDone
    HANDLE hProc;               // handle to the calling process

    DWORD bfDWRFlags;           // controls caller-specific behaviors wrt REPORTING
    DWORD bfDWUFlags;           // controls caller-specific behaviors wrt UI
    DWORD bfDWLFlags;           // controls caller-specific behaviors wrt LOGGING
    DWORD bfDWEFlags;           // controls caller-specific behaviors wrt EXCEPTION MODE SPECIFICS
    DWORD bfDWMFlags;           // controls caller-specific behaviors wrt MISCELLANEOUS THINGS

    LCID lcidUI;                // will try this UI langauge if non-zero
                                // next DW will use the system LCID,
                                // and if it can't find an intl dll for that,
                                // will fall back on US English (1033)

    DWORD bfmsoctdsOffer;     // bitfield of user choices to offer
                              // note that you must specify two of:
                              // Quit, Restart, Recover, Ignore
                              // The Debug choice is independent
    DWORD bfmsoctdsNotify;    // bitfield of user choices for which the
                              // app wants control back instead of simply being
                              // terminated by DW.  The app will then be
                              // responsible for pinging DW (if desired) with
                              // hEventAlive and for notify DW it's ok to
                              // terminate the app w/ hEventDone

    DWORD bfmsoctdsLetRun;    // bitfield of user choices for which the
                              // app wants control back instead of being
                              // terminated by DW.  DW can then safely ignore
                              // the app and exit.

    WCHAR wzEventLogSource[DW_MAX_EVENTSOURCE];    // Set this as your source if you want to log events.

    WCHAR wzModuleFileName[DW_MAX_PATH];        // The result of GetModuleFileName(NULL)

    char szPIDRegKey[DW_MAX_PIDREGKEY];     // name of the key that holds the PID
                                       // can be used by the Server for
                                       // spoof-detection
    char szBrand[DW_APPNAME_LENGTH];   // passed as a param to Privacy Policy link
    char szCustomQueryStringElements[DW_MAX_PATH]; // passsed as param to Privacy Policy Link and Response Link

    char szCheckBoxRegKey[DW_MAX_PATH];   // If we get a key, we should show the
                                          // "Never send reports for this type of event" checkbox.
                                          // That string can be overridden in the UIB.

    WCHAR wzDotDataDlls[DW_MAX_PATH];  // contains the list of DLLs, terminated
                                       // by '\0' characters, that DW will
                                       // collect the .data sections into the
                                       // full minidump version
                                       // e.g. "mso9.dll\0outllib.dll\0"

    WCHAR wzFilesToDelete[1024];    // File list, seperated by DW_FILESEP
                                    // each of these files gets added to the
                                    // cab at upload time
                                    // These are files that we will delete
                                    // if fDwrDeleteFiles is sent.

    WCHAR wzFilesToKeep[1024];  // File list, seperated by DW_FILESEP
                                // each of these files gets added to the
                                // cab at upload time
                                // These are files that we will NOT delete
                                // if fDwrDeleteFiles is sent.

    WCHAR wzUserDocs[DW_MAX_USERDOCS_CWC]; // File list, seperated by DW_FILESEP
                            // each of these files gets added to the
                            // cab at upload time IFF we get a second-level request for them.
                            // These are files that we will NOT delete
                            // if fDwrDeleteFiles is sent.

    UserInterfaceBlock uib;     // encapsulates UI override data. You must set the appname in here.
    AssertBlock ab;             // encapsulates assert-tag data
    GenericModeBlock gmb;       // encapsulates custom bucket parameters for generic mode
    CustomMinidumpBlock cmb;    // encapsulates customization info for minidump gathering

    // OUTPARAMS
    DWORD msoctdsResult;      // result from crash-time dialog
    BOOL fReportProblem;      // did user approve reporting?
    WCHAR wzMinidumpLocation[DW_MAX_PATH];  // when fDweKeepMinidump is set, we write its name here.
                                            // it is available for access once hEventDone is signaled.

    // DYNAMIC INPARAMS used during recovery conversation for DW's UI
    int iPingCurrent;         // current count for the recovery progress bar
    int iPingEnd;             // index for the end of the recovery progress bar

} DWSharedMem20, DWSharedMem;


#pragma pack(pop, msodw_h)
#endif // MSODW_H