kvm-guest-drivers-windows

Форк
0
263 строки · 13.6 Кб
1
/*
2
 * This file contains debug print routine implementation.
3
 *
4
 * Copyright (c) 2012-2017 Red Hat, Inc.
5
 *
6
 * Redistribution and use in source and binary forms, with or without
7
 * modification, are permitted provided that the following conditions
8
 * are met :
9
 * 1. Redistributions of source code must retain the above copyright
10
 *    notice, this list of conditions and the following disclaimer.
11
 * 2. Redistributions in binary form must reproduce the above copyright
12
 *    notice, this list of conditions and the following disclaimer in the
13
 *    documentation and / or other materials provided with the distribution.
14
 * 3. Neither the names of the copyright holders nor the names of their contributors
15
 *    may be used to endorse or promote products derived from this software
16
 *    without specific prior written permission.
17
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
18
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
 * ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
21
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27
 * SUCH DAMAGE.
28
 */
29

30
#include "helper.h"
31
#include "trace.h"
32

33
int virtioDebugLevel;
34
int bDebugPrint;
35
int nVioscsiDebugLevel;
36

37

38
#if !defined(EVENT_TRACING)
39

40
#if defined(COM_DEBUG)
41
#include <ntstrsafe.h>
42

43
#define RHEL_DEBUG_PORT     ((PUCHAR)0x3F8)
44
#define TEMP_BUFFER_SIZE    256
45

46
static void DebugPrintFuncSerial(const char *format, ...)
47
{
48
    char buf[TEMP_BUFFER_SIZE];
49
    NTSTATUS status;
50
    size_t len;
51
    va_list list;
52
    va_start(list, format);
53
    status = RtlStringCbVPrintfA(buf, sizeof(buf), format, list);
54
    if (status == STATUS_SUCCESS)
55
    {
56
        len = strlen(buf);
57
    }
58
    else
59
    {
60
        len = 2;
61
        buf[0] = 'O';
62
        buf[1] = '\n';
63
    }
64
    if (len)
65
    {
66
        WRITE_PORT_BUFFER_UCHAR(RHEL_DEBUG_PORT, (PUCHAR)buf, len);
67
        WRITE_PORT_UCHAR(RHEL_DEBUG_PORT, '\r');
68
    }
69
    va_end(list);
70
}
71
#elif defined(PRINT_DEBUG)
72
static void DebugPrintFunc(const char *format, ...)
73
{
74
    va_list list;
75
    va_start(list, format);
76
    vDbgPrintEx(DPFLTR_DEFAULT_ID, 9 | DPFLTR_MASK, format, list);
77
    va_end(list);
78
}
79
#else
80
static void NoDebugPrintFunc(const char *format, ...)
81
{
82

83
}
84
#endif
85

86
void InitializeDebugPrints(IN PDRIVER_OBJECT  DriverObject, IN PUNICODE_STRING RegistryPath)
87
{
88
    //TBD - Read nDebugLevel and bDebugPrint from the registry
89
    bDebugPrint = 1;
90
    virtioDebugLevel = 0;
91
    nVioscsiDebugLevel = TRACE_LEVEL_ERROR;
92

93
#if defined(PRINT_DEBUG)
94
    VirtioDebugPrintProc = DebugPrintFunc;
95
#elif defined(COM_DEBUG)
96
    VirtioDebugPrintProc = DebugPrintFuncSerial;
97
#else
98
    VirtioDebugPrintProc = NoDebugPrintFunc;
99
#endif
100
}
101

102
tDebugPrintFunc VirtioDebugPrintProc;
103
#else
104
void InitializeDebugPrints(IN PDRIVER_OBJECT  DriverObject, IN PUNICODE_STRING RegistryPath)
105
{
106
    //TBD - Read nDebugLevel and bDebugPrint from the registry
107
    bDebugPrint = 0;
108
    virtioDebugLevel = 0;
109
    nVioscsiDebugLevel = 4;// TRACE_LEVEL_ERROR;
110
}
111

112
tDebugPrintFunc VirtioDebugPrintProc = DbgPrint;
113
#endif
114

115

116
#undef MAKE_CASE
117
#define MAKE_CASE(scsiOpCode)    \
118
    case scsiOpCode:             \
119
        scsiOpStr = #scsiOpCode; \
120
        break;
121

122
char *DbgGetScsiOpStr(IN UCHAR opCode)
123
{
124
    char *scsiOpStr = "?";
125
    switch (opCode)
126
    {
127
        MAKE_CASE(SCSIOP_TEST_UNIT_READY)               // Code 0x00
128
        MAKE_CASE(SCSIOP_REWIND)                        // Code 0x01
129
        MAKE_CASE(SCSIOP_REQUEST_BLOCK_ADDR)            // Code 0x02
130
        MAKE_CASE(SCSIOP_REQUEST_SENSE)                 // Code 0x03
131
        MAKE_CASE(SCSIOP_FORMAT_UNIT)                   // Code 0x04
132
        MAKE_CASE(SCSIOP_READ_BLOCK_LIMITS)             // Code 0x05
133
        MAKE_CASE(SCSIOP_INIT_ELEMENT_STATUS)           // Code 0x07, aka SCSIOP_REASSIGN_BLOCKS
134
        MAKE_CASE(SCSIOP_READ6)                         // Code 0x08, aka SCSIOP_RECEIVE
135
        MAKE_CASE(SCSIOP_WRITE6)                        // Code 0x0A, aka SCSIOP_PRINT, SCSIOP_SEND
136
        MAKE_CASE(SCSIOP_SEEK6)                         // Code 0x0B, aka SCSIOP_SET_CAPACITY, SCSIOP_SLEW_PRINT, SCSIOP_TRACK_SELECT
137
        MAKE_CASE(SCSIOP_SEEK_BLOCK)                    // Code 0x0C
138
        MAKE_CASE(SCSIOP_PARTITION)                     // Code 0x0D
139
        MAKE_CASE(SCSIOP_READ_REVERSE)                  // Code 0x0F
140
        MAKE_CASE(SCSIOP_FLUSH_BUFFER)                  // Code 0x10, aka SCSIOP_WRITE_FILEMARKS
141
        MAKE_CASE(SCSIOP_SPACE)                         // Code 0x11
142
        MAKE_CASE(SCSIOP_INQUIRY)                       // Code 0x12
143
        MAKE_CASE(SCSIOP_VERIFY6)                       // Code 0x13
144
        MAKE_CASE(SCSIOP_RECOVER_BUF_DATA)              // Code 0x14
145
        MAKE_CASE(SCSIOP_MODE_SELECT)                   // Code 0x15
146
        MAKE_CASE(SCSIOP_RESERVE_UNIT)                  // Code 0x16
147
        MAKE_CASE(SCSIOP_RELEASE_UNIT)                  // Code 0x17
148
        MAKE_CASE(SCSIOP_COPY)                          // Code 0x18
149
        MAKE_CASE(SCSIOP_ERASE)                         // Code 0x19
150
        MAKE_CASE(SCSIOP_MODE_SENSE)                    // Code 0x1A
151
        MAKE_CASE(SCSIOP_START_STOP_UNIT)               // Code 0x1B, aka SCSIOP_LOAD_UNLOAD, SCSIOP_STOP_PRINT
152
        MAKE_CASE(SCSIOP_RECEIVE_DIAGNOSTIC)            // Code 0x1C
153
        MAKE_CASE(SCSIOP_SEND_DIAGNOSTIC)               // Code 0x1D
154
        MAKE_CASE(SCSIOP_MEDIUM_REMOVAL)                // Code 0x1E
155
        MAKE_CASE(SCSIOP_READ_FORMATTED_CAPACITY)       // Code 0x23
156
        MAKE_CASE(SCSIOP_READ_CAPACITY)                 // Code 0x25
157
        MAKE_CASE(SCSIOP_READ)                          // Code 0x28
158
        MAKE_CASE(SCSIOP_WRITE)                         // Code 0x2A
159
        MAKE_CASE(SCSIOP_SEEK)                          // Code 0x2B, aka SCSIOP_LOCATE, SCSIOP_POSITION_TO_ELEMENT
160
        MAKE_CASE(SCSIOP_WRITE_VERIFY)                  // Code 0x2E
161
        MAKE_CASE(SCSIOP_VERIFY)                        // Code 0x2F
162
        MAKE_CASE(SCSIOP_SEARCH_DATA_HIGH)              // Code 0x30
163
        MAKE_CASE(SCSIOP_SEARCH_DATA_EQUAL)             // Code 0x31
164
        MAKE_CASE(SCSIOP_SEARCH_DATA_LOW)               // Code 0x32
165
        MAKE_CASE(SCSIOP_SET_LIMITS)                    // Code 0x33
166
        MAKE_CASE(SCSIOP_READ_POSITION)                 // Code 0x34
167
        MAKE_CASE(SCSIOP_SYNCHRONIZE_CACHE)             // Code 0x35
168
        MAKE_CASE(SCSIOP_COMPARE)                       // Code 0x39
169
        MAKE_CASE(SCSIOP_COPY_COMPARE)                  // Code 0x3A
170
        MAKE_CASE(SCSIOP_WRITE_DATA_BUFF)               // Code 0x3B
171
        MAKE_CASE(SCSIOP_READ_DATA_BUFF)                // Code 0x3C
172
        MAKE_CASE(SCSIOP_WRITE_LONG)                    // Code 0x3F
173
        MAKE_CASE(SCSIOP_CHANGE_DEFINITION)             // Code 0x40
174
        MAKE_CASE(SCSIOP_WRITE_SAME)                    // Code 0x41
175
        MAKE_CASE(SCSIOP_UNMAP)                         // Code 0x42, aka SCSIOP_READ_SUB_CHANNEL
176
        MAKE_CASE(SCSIOP_READ_TOC)                      // Code 0x43
177
        MAKE_CASE(SCSIOP_READ_HEADER)                   // Code 0x44, aka SCSIOP_REPORT_DENSITY_SUPPORT
178
        MAKE_CASE(SCSIOP_PLAY_AUDIO)                    // Code 0x45
179
        MAKE_CASE(SCSIOP_GET_CONFIGURATION)             // Code 0x46
180
        MAKE_CASE(SCSIOP_PLAY_AUDIO_MSF)                // Code 0x47
181
        MAKE_CASE(SCSIOP_SANITIZE)                      // Code 0x48, aka SCSIOP_PLAY_TRACK_INDEX
182
        MAKE_CASE(SCSIOP_PLAY_TRACK_RELATIVE)           // Code 0x49
183
        MAKE_CASE(SCSIOP_GET_EVENT_STATUS)              // Code 0x4A
184
        MAKE_CASE(SCSIOP_PAUSE_RESUME)                  // Code 0x4B
185
        MAKE_CASE(SCSIOP_LOG_SELECT)                    // Code 0x4C
186
        MAKE_CASE(SCSIOP_LOG_SENSE)                     // Code 0x4D
187
        MAKE_CASE(SCSIOP_STOP_PLAY_SCAN)                // Code 0x4E
188
        MAKE_CASE(SCSIOP_XDWRITE)                       // Code 0x50
189
        MAKE_CASE(SCSIOP_READ_DISC_INFORMATION)         // Code 0x51, aka SCSIOP_XPWRITE
190
        MAKE_CASE(SCSIOP_READ_TRACK_INFORMATION)        // Code 0x52
191
        MAKE_CASE(SCSIOP_XDWRITE_READ)                  // Code 0x53, aka SCSIOP_RESERVE_TRACK_RZONE
192
        MAKE_CASE(SCSIOP_SEND_OPC_INFORMATION)          // Code 0x54
193
        MAKE_CASE(SCSIOP_MODE_SELECT10)                 // Code 0x55
194
        MAKE_CASE(SCSIOP_RESERVE_ELEMENT)               // Code 0x56, aka SCSIOP_RESERVE_UNIT10
195
        MAKE_CASE(SCSIOP_RELEASE_ELEMENT)               // Code 0x57, aka SCSIOP_RELEASE_UNIT10
196
        MAKE_CASE(SCSIOP_REPAIR_TRACK)                  // Code 0x58
197
        MAKE_CASE(SCSIOP_MODE_SENSE10)                  // Code 0x5A
198
        MAKE_CASE(SCSIOP_CLOSE_TRACK_SESSION)           // Code 0x5B
199
        MAKE_CASE(SCSIOP_READ_BUFFER_CAPACITY)          // Code 0x5C
200
        MAKE_CASE(SCSIOP_SEND_CUE_SHEET)                // Code 0x5D
201
        MAKE_CASE(SCSIOP_PERSISTENT_RESERVE_IN)         // Code 0x5E
202
        MAKE_CASE(SCSIOP_PERSISTENT_RESERVE_OUT)        // Code 0x5F
203
        MAKE_CASE(SCSIOP_OPERATION32)                   // Code 0x7F
204
        MAKE_CASE(SCSIOP_XDWRITE_EXTENDED16)            // Code 0x80, aka SCSIOP_WRITE_FILEMARKS16
205
        MAKE_CASE(SCSIOP_REBUILD16)                     // Code 0x81, aka SCSIOP_READ_REVERSE16
206
        MAKE_CASE(SCSIOP_REGENERATE16)                  // Code 0x82
207
        MAKE_CASE(SCSIOP_WRITE_USING_TOKEN)             // Code 0x83, aka SCSIOP_EXTENDED_COPY, SCSIOP_POPULATE_TOKEN
208
        MAKE_CASE(SCSIOP_RECEIVE_ROD_TOKEN_INFORMATION) // Code 0x84, aka SCSIOP_RECEIVE_COPY_RESULTS
209
        MAKE_CASE(SCSIOP_ATA_PASSTHROUGH16)             // Code 0x85
210
        MAKE_CASE(SCSIOP_ACCESS_CONTROL_IN)             // Code 0x86
211
        MAKE_CASE(SCSIOP_ACCESS_CONTROL_OUT)            // Code 0x87
212
        MAKE_CASE(SCSIOP_READ16)                        // Code 0x88
213
        MAKE_CASE(SCSIOP_COMPARE_AND_WRITE)             // Code 0x89
214
        MAKE_CASE(SCSIOP_WRITE16)                       // Code 0x8A
215
        MAKE_CASE(SCSIOP_READ_ATTRIBUTES)               // Code 0x8C
216
        MAKE_CASE(SCSIOP_WRITE_ATTRIBUTES)              // Code 0x8D
217
        MAKE_CASE(SCSIOP_WRITE_VERIFY16)                // Code 0x8E
218
        MAKE_CASE(SCSIOP_VERIFY16)                      // Code 0x8F
219
        MAKE_CASE(SCSIOP_PREFETCH16)                    // Code 0x90
220
        MAKE_CASE(SCSIOP_SYNCHRONIZE_CACHE16)           // Code 0x91, aka SCSIOP_SPACE16
221
        MAKE_CASE(SCSIOP_LOCK_UNLOCK_CACHE16)           // Code 0x92, aka SCSIOP_LOCATE16
222
        MAKE_CASE(SCSIOP_WRITE_SAME16)                  // Code 0x93, aka SCSIOP_ERASE16
223
        MAKE_CASE(SCSIOP_ZBC_OUT)                       // Code 0x94
224
        MAKE_CASE(SCSIOP_ZBC_IN)                        // Code 0x95
225
        MAKE_CASE(SCSIOP_READ_DATA_BUFF16)              // Code 0x9B
226
        MAKE_CASE(SCSIOP_GET_LBA_STATUS)                // Code 0x9E, aka SCSIOP_GET_PHYSICAL_ELEMENT_STATUS, SCSIOP_READ_CAPACITY16, SCSIOP_REMOVE_ELEMENT_AND_TRUNCATE, SCSIOP_SERVICE_ACTION_IN16
227
        MAKE_CASE(SCSIOP_SERVICE_ACTION_OUT16)          // Code 0x9F
228
        MAKE_CASE(SCSIOP_REPORT_LUNS)                   // Code 0xA0
229
        MAKE_CASE(SCSIOP_BLANK)                         // Code 0xA1, aka SCSIOP_ATA_PASSTHROUGH12
230
        MAKE_CASE(SCSIOP_SEND_EVENT)                    // Code 0xA2
231
        MAKE_CASE(SCSIOP_MAINTENANCE_IN)                // Code 0xA3, aka SCSIOP_SEND_KEY
232
        MAKE_CASE(SCSIOP_MAINTENANCE_OUT)               // Code 0xA4, aka SCSIOP_REPORT_KEY
233
        MAKE_CASE(SCSIOP_MOVE_MEDIUM)                   // Code 0xA5
234
        MAKE_CASE(SCSIOP_LOAD_UNLOAD_SLOT)              // Code 0xA6
235
        MAKE_CASE(SCSIOP_SET_READ_AHEAD)                // Code 0xA7
236
        MAKE_CASE(SCSIOP_READ12)                        // Code 0xA8
237
        MAKE_CASE(SCSIOP_SERVICE_ACTION_OUT12)          // Code 0xA9
238
        MAKE_CASE(SCSIOP_WRITE12)                       // Code 0xAA
239
        MAKE_CASE(SCSIOP_SEND_MESSAGE)                  // Code 0xAB
240
        MAKE_CASE(SCSIOP_GET_PERFORMANCE)               // Code 0xAC
241
        MAKE_CASE(SCSIOP_READ_DVD_STRUCTURE)            // Code 0xAD
242
        MAKE_CASE(SCSIOP_WRITE_VERIFY12)                // Code 0xAE
243
        MAKE_CASE(SCSIOP_VERIFY12)                      // Code 0xAF
244
        MAKE_CASE(SCSIOP_SEARCH_DATA_HIGH12)            // Code 0xB0
245
        MAKE_CASE(SCSIOP_SEARCH_DATA_EQUAL12)           // Code 0xB1
246
        MAKE_CASE(SCSIOP_SEARCH_DATA_LOW12)             // Code 0xB2
247
        MAKE_CASE(SCSIOP_SET_LIMITS12)                  // Code 0xB3
248
        MAKE_CASE(SCSIOP_READ_ELEMENT_STATUS_ATTACHED)  // Code 0xB4
249
        MAKE_CASE(SCSIOP_REQUEST_VOL_ELEMENT)           // Code 0xB5, aka SCSIOP_SECURITY_PROTOCOL_OUT
250
        MAKE_CASE(SCSIOP_SEND_VOLUME_TAG)               // Code 0xB6
251
        MAKE_CASE(SCSIOP_READ_DEFECT_DATA)              // Code 0xB7
252
        MAKE_CASE(SCSIOP_READ_ELEMENT_STATUS)           // Code 0xB8
253
        MAKE_CASE(SCSIOP_READ_CD_MSF)                   // Code 0xB9
254
        MAKE_CASE(SCSIOP_REDUNDANCY_GROUP_IN)           // Code 0xBA
255
        MAKE_CASE(SCSIOP_REDUNDANCY_GROUP_OUT)          // Code 0xBB
256
        MAKE_CASE(SCSIOP_SPARE_IN)                      // Code 0xBC
257
        MAKE_CASE(SCSIOP_SPARE_OUT)                     // Code 0xBD, aka SCSIOP_MECHANISM_STATUS
258
        MAKE_CASE(SCSIOP_VOLUME_SET_IN)                 // Code 0xBE
259
        MAKE_CASE(SCSIOP_VOLUME_SET_OUT)                // Code 0xBF
260
        MAKE_CASE(SCSIOP_INIT_ELEMENT_RANGE)            // Code 0xE7
261
    }
262
    return scsiOpStr;
263
}
264

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.