kvm-guest-drivers-windows
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
33int virtioDebugLevel;34int bDebugPrint;35int 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 25645
46static void DebugPrintFuncSerial(const char *format, ...)47{
48char buf[TEMP_BUFFER_SIZE];49NTSTATUS status;50size_t len;51va_list list;52va_start(list, format);53status = RtlStringCbVPrintfA(buf, sizeof(buf), format, list);54if (status == STATUS_SUCCESS)55{56len = strlen(buf);57}58else59{60len = 2;61buf[0] = 'O';62buf[1] = '\n';63}64if (len)65{66WRITE_PORT_BUFFER_UCHAR(RHEL_DEBUG_PORT, (PUCHAR)buf, len);67WRITE_PORT_UCHAR(RHEL_DEBUG_PORT, '\r');68}69va_end(list);70}
71#elif defined(PRINT_DEBUG)72static void DebugPrintFunc(const char *format, ...)73{
74va_list list;75va_start(list, format);76vDbgPrintEx(DPFLTR_DEFAULT_ID, 9 | DPFLTR_MASK, format, list);77va_end(list);78}
79#else80static void NoDebugPrintFunc(const char *format, ...)81{
82
83}
84#endif85
86void InitializeDebugPrints(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)87{
88//TBD - Read nDebugLevel and bDebugPrint from the registry89bDebugPrint = 1;90virtioDebugLevel = 0;91nVioscsiDebugLevel = TRACE_LEVEL_ERROR;92
93#if defined(PRINT_DEBUG)94VirtioDebugPrintProc = DebugPrintFunc;95#elif defined(COM_DEBUG)96VirtioDebugPrintProc = DebugPrintFuncSerial;97#else98VirtioDebugPrintProc = NoDebugPrintFunc;99#endif100}
101
102tDebugPrintFunc VirtioDebugPrintProc;103#else104void InitializeDebugPrints(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)105{
106//TBD - Read nDebugLevel and bDebugPrint from the registry107bDebugPrint = 0;108virtioDebugLevel = 0;109nVioscsiDebugLevel = 4;// TRACE_LEVEL_ERROR;110}
111
112tDebugPrintFunc VirtioDebugPrintProc = DbgPrint;113#endif114
115
116#undef MAKE_CASE117#define MAKE_CASE(scsiOpCode) \118case scsiOpCode: \119scsiOpStr = #scsiOpCode; \120break;121
122char *DbgGetScsiOpStr(IN UCHAR opCode)123{
124char *scsiOpStr = "?";125switch (opCode)126{127MAKE_CASE(SCSIOP_TEST_UNIT_READY) // Code 0x00128MAKE_CASE(SCSIOP_REWIND) // Code 0x01129MAKE_CASE(SCSIOP_REQUEST_BLOCK_ADDR) // Code 0x02130MAKE_CASE(SCSIOP_REQUEST_SENSE) // Code 0x03131MAKE_CASE(SCSIOP_FORMAT_UNIT) // Code 0x04132MAKE_CASE(SCSIOP_READ_BLOCK_LIMITS) // Code 0x05133MAKE_CASE(SCSIOP_INIT_ELEMENT_STATUS) // Code 0x07, aka SCSIOP_REASSIGN_BLOCKS134MAKE_CASE(SCSIOP_READ6) // Code 0x08, aka SCSIOP_RECEIVE135MAKE_CASE(SCSIOP_WRITE6) // Code 0x0A, aka SCSIOP_PRINT, SCSIOP_SEND136MAKE_CASE(SCSIOP_SEEK6) // Code 0x0B, aka SCSIOP_SET_CAPACITY, SCSIOP_SLEW_PRINT, SCSIOP_TRACK_SELECT137MAKE_CASE(SCSIOP_SEEK_BLOCK) // Code 0x0C138MAKE_CASE(SCSIOP_PARTITION) // Code 0x0D139MAKE_CASE(SCSIOP_READ_REVERSE) // Code 0x0F140MAKE_CASE(SCSIOP_FLUSH_BUFFER) // Code 0x10, aka SCSIOP_WRITE_FILEMARKS141MAKE_CASE(SCSIOP_SPACE) // Code 0x11142MAKE_CASE(SCSIOP_INQUIRY) // Code 0x12143MAKE_CASE(SCSIOP_VERIFY6) // Code 0x13144MAKE_CASE(SCSIOP_RECOVER_BUF_DATA) // Code 0x14145MAKE_CASE(SCSIOP_MODE_SELECT) // Code 0x15146MAKE_CASE(SCSIOP_RESERVE_UNIT) // Code 0x16147MAKE_CASE(SCSIOP_RELEASE_UNIT) // Code 0x17148MAKE_CASE(SCSIOP_COPY) // Code 0x18149MAKE_CASE(SCSIOP_ERASE) // Code 0x19150MAKE_CASE(SCSIOP_MODE_SENSE) // Code 0x1A151MAKE_CASE(SCSIOP_START_STOP_UNIT) // Code 0x1B, aka SCSIOP_LOAD_UNLOAD, SCSIOP_STOP_PRINT152MAKE_CASE(SCSIOP_RECEIVE_DIAGNOSTIC) // Code 0x1C153MAKE_CASE(SCSIOP_SEND_DIAGNOSTIC) // Code 0x1D154MAKE_CASE(SCSIOP_MEDIUM_REMOVAL) // Code 0x1E155MAKE_CASE(SCSIOP_READ_FORMATTED_CAPACITY) // Code 0x23156MAKE_CASE(SCSIOP_READ_CAPACITY) // Code 0x25157MAKE_CASE(SCSIOP_READ) // Code 0x28158MAKE_CASE(SCSIOP_WRITE) // Code 0x2A159MAKE_CASE(SCSIOP_SEEK) // Code 0x2B, aka SCSIOP_LOCATE, SCSIOP_POSITION_TO_ELEMENT160MAKE_CASE(SCSIOP_WRITE_VERIFY) // Code 0x2E161MAKE_CASE(SCSIOP_VERIFY) // Code 0x2F162MAKE_CASE(SCSIOP_SEARCH_DATA_HIGH) // Code 0x30163MAKE_CASE(SCSIOP_SEARCH_DATA_EQUAL) // Code 0x31164MAKE_CASE(SCSIOP_SEARCH_DATA_LOW) // Code 0x32165MAKE_CASE(SCSIOP_SET_LIMITS) // Code 0x33166MAKE_CASE(SCSIOP_READ_POSITION) // Code 0x34167MAKE_CASE(SCSIOP_SYNCHRONIZE_CACHE) // Code 0x35168MAKE_CASE(SCSIOP_COMPARE) // Code 0x39169MAKE_CASE(SCSIOP_COPY_COMPARE) // Code 0x3A170MAKE_CASE(SCSIOP_WRITE_DATA_BUFF) // Code 0x3B171MAKE_CASE(SCSIOP_READ_DATA_BUFF) // Code 0x3C172MAKE_CASE(SCSIOP_WRITE_LONG) // Code 0x3F173MAKE_CASE(SCSIOP_CHANGE_DEFINITION) // Code 0x40174MAKE_CASE(SCSIOP_WRITE_SAME) // Code 0x41175MAKE_CASE(SCSIOP_UNMAP) // Code 0x42, aka SCSIOP_READ_SUB_CHANNEL176MAKE_CASE(SCSIOP_READ_TOC) // Code 0x43177MAKE_CASE(SCSIOP_READ_HEADER) // Code 0x44, aka SCSIOP_REPORT_DENSITY_SUPPORT178MAKE_CASE(SCSIOP_PLAY_AUDIO) // Code 0x45179MAKE_CASE(SCSIOP_GET_CONFIGURATION) // Code 0x46180MAKE_CASE(SCSIOP_PLAY_AUDIO_MSF) // Code 0x47181MAKE_CASE(SCSIOP_SANITIZE) // Code 0x48, aka SCSIOP_PLAY_TRACK_INDEX182MAKE_CASE(SCSIOP_PLAY_TRACK_RELATIVE) // Code 0x49183MAKE_CASE(SCSIOP_GET_EVENT_STATUS) // Code 0x4A184MAKE_CASE(SCSIOP_PAUSE_RESUME) // Code 0x4B185MAKE_CASE(SCSIOP_LOG_SELECT) // Code 0x4C186MAKE_CASE(SCSIOP_LOG_SENSE) // Code 0x4D187MAKE_CASE(SCSIOP_STOP_PLAY_SCAN) // Code 0x4E188MAKE_CASE(SCSIOP_XDWRITE) // Code 0x50189MAKE_CASE(SCSIOP_READ_DISC_INFORMATION) // Code 0x51, aka SCSIOP_XPWRITE190MAKE_CASE(SCSIOP_READ_TRACK_INFORMATION) // Code 0x52191MAKE_CASE(SCSIOP_XDWRITE_READ) // Code 0x53, aka SCSIOP_RESERVE_TRACK_RZONE192MAKE_CASE(SCSIOP_SEND_OPC_INFORMATION) // Code 0x54193MAKE_CASE(SCSIOP_MODE_SELECT10) // Code 0x55194MAKE_CASE(SCSIOP_RESERVE_ELEMENT) // Code 0x56, aka SCSIOP_RESERVE_UNIT10195MAKE_CASE(SCSIOP_RELEASE_ELEMENT) // Code 0x57, aka SCSIOP_RELEASE_UNIT10196MAKE_CASE(SCSIOP_REPAIR_TRACK) // Code 0x58197MAKE_CASE(SCSIOP_MODE_SENSE10) // Code 0x5A198MAKE_CASE(SCSIOP_CLOSE_TRACK_SESSION) // Code 0x5B199MAKE_CASE(SCSIOP_READ_BUFFER_CAPACITY) // Code 0x5C200MAKE_CASE(SCSIOP_SEND_CUE_SHEET) // Code 0x5D201MAKE_CASE(SCSIOP_PERSISTENT_RESERVE_IN) // Code 0x5E202MAKE_CASE(SCSIOP_PERSISTENT_RESERVE_OUT) // Code 0x5F203MAKE_CASE(SCSIOP_OPERATION32) // Code 0x7F204MAKE_CASE(SCSIOP_XDWRITE_EXTENDED16) // Code 0x80, aka SCSIOP_WRITE_FILEMARKS16205MAKE_CASE(SCSIOP_REBUILD16) // Code 0x81, aka SCSIOP_READ_REVERSE16206MAKE_CASE(SCSIOP_REGENERATE16) // Code 0x82207MAKE_CASE(SCSIOP_WRITE_USING_TOKEN) // Code 0x83, aka SCSIOP_EXTENDED_COPY, SCSIOP_POPULATE_TOKEN208MAKE_CASE(SCSIOP_RECEIVE_ROD_TOKEN_INFORMATION) // Code 0x84, aka SCSIOP_RECEIVE_COPY_RESULTS209MAKE_CASE(SCSIOP_ATA_PASSTHROUGH16) // Code 0x85210MAKE_CASE(SCSIOP_ACCESS_CONTROL_IN) // Code 0x86211MAKE_CASE(SCSIOP_ACCESS_CONTROL_OUT) // Code 0x87212MAKE_CASE(SCSIOP_READ16) // Code 0x88213MAKE_CASE(SCSIOP_COMPARE_AND_WRITE) // Code 0x89214MAKE_CASE(SCSIOP_WRITE16) // Code 0x8A215MAKE_CASE(SCSIOP_READ_ATTRIBUTES) // Code 0x8C216MAKE_CASE(SCSIOP_WRITE_ATTRIBUTES) // Code 0x8D217MAKE_CASE(SCSIOP_WRITE_VERIFY16) // Code 0x8E218MAKE_CASE(SCSIOP_VERIFY16) // Code 0x8F219MAKE_CASE(SCSIOP_PREFETCH16) // Code 0x90220MAKE_CASE(SCSIOP_SYNCHRONIZE_CACHE16) // Code 0x91, aka SCSIOP_SPACE16221MAKE_CASE(SCSIOP_LOCK_UNLOCK_CACHE16) // Code 0x92, aka SCSIOP_LOCATE16222MAKE_CASE(SCSIOP_WRITE_SAME16) // Code 0x93, aka SCSIOP_ERASE16223MAKE_CASE(SCSIOP_ZBC_OUT) // Code 0x94224MAKE_CASE(SCSIOP_ZBC_IN) // Code 0x95225MAKE_CASE(SCSIOP_READ_DATA_BUFF16) // Code 0x9B226MAKE_CASE(SCSIOP_GET_LBA_STATUS) // Code 0x9E, aka SCSIOP_GET_PHYSICAL_ELEMENT_STATUS, SCSIOP_READ_CAPACITY16, SCSIOP_REMOVE_ELEMENT_AND_TRUNCATE, SCSIOP_SERVICE_ACTION_IN16227MAKE_CASE(SCSIOP_SERVICE_ACTION_OUT16) // Code 0x9F228MAKE_CASE(SCSIOP_REPORT_LUNS) // Code 0xA0229MAKE_CASE(SCSIOP_BLANK) // Code 0xA1, aka SCSIOP_ATA_PASSTHROUGH12230MAKE_CASE(SCSIOP_SEND_EVENT) // Code 0xA2231MAKE_CASE(SCSIOP_MAINTENANCE_IN) // Code 0xA3, aka SCSIOP_SEND_KEY232MAKE_CASE(SCSIOP_MAINTENANCE_OUT) // Code 0xA4, aka SCSIOP_REPORT_KEY233MAKE_CASE(SCSIOP_MOVE_MEDIUM) // Code 0xA5234MAKE_CASE(SCSIOP_LOAD_UNLOAD_SLOT) // Code 0xA6235MAKE_CASE(SCSIOP_SET_READ_AHEAD) // Code 0xA7236MAKE_CASE(SCSIOP_READ12) // Code 0xA8237MAKE_CASE(SCSIOP_SERVICE_ACTION_OUT12) // Code 0xA9238MAKE_CASE(SCSIOP_WRITE12) // Code 0xAA239MAKE_CASE(SCSIOP_SEND_MESSAGE) // Code 0xAB240MAKE_CASE(SCSIOP_GET_PERFORMANCE) // Code 0xAC241MAKE_CASE(SCSIOP_READ_DVD_STRUCTURE) // Code 0xAD242MAKE_CASE(SCSIOP_WRITE_VERIFY12) // Code 0xAE243MAKE_CASE(SCSIOP_VERIFY12) // Code 0xAF244MAKE_CASE(SCSIOP_SEARCH_DATA_HIGH12) // Code 0xB0245MAKE_CASE(SCSIOP_SEARCH_DATA_EQUAL12) // Code 0xB1246MAKE_CASE(SCSIOP_SEARCH_DATA_LOW12) // Code 0xB2247MAKE_CASE(SCSIOP_SET_LIMITS12) // Code 0xB3248MAKE_CASE(SCSIOP_READ_ELEMENT_STATUS_ATTACHED) // Code 0xB4249MAKE_CASE(SCSIOP_REQUEST_VOL_ELEMENT) // Code 0xB5, aka SCSIOP_SECURITY_PROTOCOL_OUT250MAKE_CASE(SCSIOP_SEND_VOLUME_TAG) // Code 0xB6251MAKE_CASE(SCSIOP_READ_DEFECT_DATA) // Code 0xB7252MAKE_CASE(SCSIOP_READ_ELEMENT_STATUS) // Code 0xB8253MAKE_CASE(SCSIOP_READ_CD_MSF) // Code 0xB9254MAKE_CASE(SCSIOP_REDUNDANCY_GROUP_IN) // Code 0xBA255MAKE_CASE(SCSIOP_REDUNDANCY_GROUP_OUT) // Code 0xBB256MAKE_CASE(SCSIOP_SPARE_IN) // Code 0xBC257MAKE_CASE(SCSIOP_SPARE_OUT) // Code 0xBD, aka SCSIOP_MECHANISM_STATUS258MAKE_CASE(SCSIOP_VOLUME_SET_IN) // Code 0xBE259MAKE_CASE(SCSIOP_VOLUME_SET_OUT) // Code 0xBF260MAKE_CASE(SCSIOP_INIT_ELEMENT_RANGE) // Code 0xE7261}262return scsiOpStr;263}
264