repository: C:/dev/kvm-guest-drivers-windows
branch: master
commit aaad92c35a4fd1289cf9426e1ec8573862883556
Author: Yan Vugenfirer <[email protected]>
Date: Mon May 17 19:34:00 2010 +0300
[WIN-GUEST_DRIVERS] Dynamicly link to DbgPrintEx during run time. Also
handle empty NBL lists submitted by upper layers (corner cases during WHQL
testing).
Signed-off-by: Yan Vugenfirer <[email protected]>
diff --git a/NetKVM/Common/ParaNdis-Debug.c b/NetKVM/Common/ParaNdis-Debug.c
index ad3d56c..6f34730 100644
--- a/NetKVM/Common/ParaNdis-Debug.c
+++ b/NetKVM/Common/ParaNdis-Debug.c
@@ -38,6 +38,22 @@ typedef BOOLEAN (*KeDeregisterBugCheckReasonCallbackType) (
__inout PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord
);
+typedef ULONG (*vDbgPrintExType)(
+ __in ULONG ComponentId,
+ __in ULONG Level,
+ __in PCCH Format,
+ __in va_list arglist
+ );
+
+static ULONG DummyPrintProcedure(
+ __in ULONG ComponentId,
+ __in ULONG Level,
+ __in PCCH Format,
+ __in va_list arglist
+ )
+{
+ return 0;
+}
static BOOLEAN KeRegisterBugCheckReasonCallbackDummyProc(
__out PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord,
__in PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine,
@@ -55,6 +71,7 @@ BOOLEAN KeDeregisterBugCheckReasonCallbackDummyProc(
return FALSE;
}
+static vDbgPrintExType PrintProcedure = DummyPrintProcedure;
static KeRegisterBugCheckReasonCallbackType BugCheckRegisterCallback =
KeRegisterBugCheckReasonCallbackDummyProc;
static KeDeregisterBugCheckReasonCallbackType BugCheckDeregisterCallback =
KeDeregisterBugCheckReasonCallbackDummyProc;
KBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord;
@@ -68,7 +85,7 @@ static void DebugPrint(const char *fmt, ...)
NTSTATUS status;
va_list list;
va_start(list, fmt);
- vDbgPrintEx(DPFLTR_DEFAULT_ID, 9 | DPFLTR_MASK, fmt, list);
+ PrintProcedure(DPFLTR_DEFAULT_ID, 9 | DPFLTR_MASK, fmt, list);
#if defined(VIRTIO_DBG_USE_IOPORT)
{
// use this way of output only for DISPATCH_LEVEL,
@@ -149,7 +166,7 @@ static void AnotherDbgBreak()
void ParaNdis_DebugInitialize(PVOID DriverObject,PVOID RegistryPath)
{
- NDIS_STRING usRegister, usDeregister;
+ NDIS_STRING usRegister, usDeregister, usPrint;
PVOID pr, pd;
BOOLEAN res;
WPP_INIT_TRACING(DriverObject, RegistryPath);
@@ -157,8 +174,11 @@ void ParaNdis_DebugInitialize(PVOID DriverObject,PVOID
RegistryPath)
NdisAllocateSpinLock(&CrashLock);
KeInitializeCallbackRecord(&CallbackRecord);
ParaNdis_PrepareBugCheckData();
+ NdisInitUnicodeString(&usPrint, L"vDbgPrintEx");
NdisInitUnicodeString(&usRegister, L"KeRegisterBugCheckReasonCallback");
NdisInitUnicodeString(&usDeregister,
L"KeDeregisterBugCheckReasonCallback");
+ pd = MmGetSystemRoutineAddress(&usPrint);
+ if (pd) PrintProcedure = (vDbgPrintExType)pd;
pr = MmGetSystemRoutineAddress(&usRegister);
pd = MmGetSystemRoutineAddress(&usDeregister);
if (pr && pd)
diff --git a/NetKVM/Common/ndis56common.h b/NetKVM/Common/ndis56common.h
index d8a25af..7977c7a 100644
--- a/NetKVM/Common/ndis56common.h
+++ b/NetKVM/Common/ndis56common.h
@@ -351,6 +351,7 @@ typedef struct _tagPARANDIS_ADAPTER
PNET_BUFFER_LIST SendHead;
PNET_BUFFER_LIST SendTail;
PNET_BUFFER_LIST SendWaitingList;
+ LIST_ENTRY WaitingMapping;
NDIS_HANDLE DmaHandle;
NDIS_HANDLE ConnectTimer;
NDIS_HANDLE InterruptRecoveryTimer;
diff --git a/NetKVM/DebugTools/NetKVMDumpParser/NetKVMDumpParser.cpp
b/NetKVM/DebugTools/NetKVMDumpParser/NetKVMDumpParser.cpp
index b9ba556..98fd2dd 100644
--- a/NetKVM/DebugTools/NetKVMDumpParser/NetKVMDumpParser.cpp
+++ b/NetKVM/DebugTools/NetKVMDumpParser/NetKVMDumpParser.cpp
@@ -18,10 +18,18 @@
#define new DEBUG_NEW
#endif
-#define DEBUG_SYMBOLS_IF IDebugSymbols2
+#define PRINT_SEPARATOR "-------------------------------------"
+#define DEBUG_SYMBOLS_IF IDebugSymbols3
-#define PRINT(fmt, ...) printf("[%s]: "##fmt##"\n", __FUNCTION__, __VA_ARGS__);
-//#define PRINT(fmt, ...) { CString __s; __s.Format(TEXT("[%s]:
")##TEXT(fmt)##TEXT("\n"), TEXT(__FUNCTION__), __VA_ARGS__);
OutputDebugString(__s.GetBuffer()); }
+FILE *outf = stdout;
+
+//#define UNDER_DEBUGGING
+
+#ifndef UNDER_DEBUGGING
+#define PRINT(fmt, ...) fprintf(outf, "[%s]: "##fmt##"\n", __FUNCTION__,
__VA_ARGS__);
+#else
+#define PRINT(fmt, ...) { CString __s; __s.Format(TEXT("[%s]:
")##TEXT(fmt)##TEXT("\n"), TEXT(__FUNCTION__), __VA_ARGS__);
OutputDebugString(__s.GetBuffer()); }
+#endif
CString ErrorToString(HRESULT hr)
{
@@ -169,6 +177,11 @@ VALUE(DEBUG_CSS_TYPE_OPTIONS),
ENDTABLE
};
+#if !defined(DEBUG_STATUS_RESTART_REQUESTED)
+#error Path to debug SDK is not defined properly in Property Manager.
+#endif
+
+
const tNamedValue EngineExecutionStatus[] =
{
VALUE(DEBUG_STATUS_NO_CHANGE),
@@ -254,14 +267,22 @@ VALUE(SYMOPT_DEBUG),
ENDTABLE
};
+typedef struct _tagModule
+{
+ LPCSTR name;
+ ULONG64 Base;
+ ULONG index;
+}tModule;
+
class tDumpParser : public DebugBaseEventCallbacks, public
IDebugOutputCallbacks
{
public:
tDumpParser() : refCount(0), Client(NULL), Control(NULL),
DataSpaces(NULL), DebugSymbols(NULL)
{
HRESULT hr;
+ bEnableOutput = FALSE;
hr = DebugCreate(__uuidof(IDebugClient), (void **)&Client);
- if (Client) hr =
Client->QueryInterface(__uuidof(IDebugControl), (void **)&Control);
+ if (Client) hr =
Client->QueryInterface(__uuidof(IDebugControl2), (void **)&Control);
if (Client) hr =
Client->QueryInterface(__uuidof(IDebugDataSpaces3), (void **)&DataSpaces);
if (Client) hr =
Client->QueryInterface(__uuidof(DEBUG_SYMBOLS_IF), (void **)&DebugSymbols);
}
@@ -284,8 +305,6 @@ public:
DebugSymbols->AddSymbolOptions(SYMOPT_DEBUG);
//DebugSymbols->RemoveSymbolOptions(SYMOPT_DEFERRED_LOADS);
DebugSymbols->AppendSymbolPath(".");
-
//DebugSymbols->AppendSymbolPath("D:\\SVN\\Qumranet\\drivers\\Logs\\2009-4\\Install\\Vista\\x86");
-
}
else
{
@@ -303,10 +322,15 @@ public:
return hr == S_OK;
}
void ProcessDumpFile();
- void FindOurTaggedCrashData();
- void CheckLoadedSymbols();
- void ParseCrashData(tBugCheckStaticDataHeader *ph, ULONG64 databuffer,
ULONG bytesRead);
- typedef enum _tageSystemProperty {espSymbolPath, espSystemVersion }
eSystemProperty;
+ void FindOurTaggedCrashData(BOOL bWithSymbols);
+ BOOL CheckLoadedSymbols(tModule *pModule);
+ void ProcessSymbols(tModule *pModule);
+ void ParseCrashData(tBugCheckStaticDataHeader *ph, ULONG64 databuffer,
ULONG bytesRead, BOOL bWithSymbols);
+ typedef enum _tageSystemProperty {
+ espSymbolPath,
+ espSystemVersion,
+ espSystemTime,
+ } eSystemProperty;
CString GetProperty(eSystemProperty Prop);
protected:
CString Parse(ULONG64 val, const tNamedValue *pt)
@@ -497,15 +521,18 @@ DEBUG_EVENT_CHANGE_SYMBOL_STATE ;
__in PCSTR Text
)
{
- //printf("%s", Text);
- //OutputDebugString(Text);
+ if (bEnableOutput)
+ {
+ PRINT("%s", Text);
+ }
return S_OK;
}
ULONG refCount;
IDebugClient *Client;
- IDebugControl *Control;
+ IDebugControl2 *Control;
IDebugDataSpaces3 *DataSpaces;
DEBUG_SYMBOLS_IF *DebugSymbols;
+ BOOL bEnableOutput;
};
#define CHECK_INTERFACE(xf) { \
@@ -533,7 +560,7 @@ static void ParseHistoryEntry(LONGLONG basetime,
tBugCheckHistoryDataEntry *phis
}
}
-void tDumpParser::ParseCrashData(tBugCheckStaticDataHeader *ph, ULONG64
databuffer, ULONG bytesRead)
+void tDumpParser::ParseCrashData(tBugCheckStaticDataHeader *ph, ULONG64
databuffer, ULONG bytesRead, BOOL bWithSymbols)
{
UINT i;
for (i = 0; i < ph->ulMaxContexts; ++i)
@@ -544,31 +571,42 @@ void
tDumpParser::ParseCrashData(tBugCheckStaticDataHeader *ph, ULONG64 databuff
{
LONGLONG diffInt = (ph->qCrashTime.QuadPart -
pndc->LastInterruptTimeStamp.QuadPart) / 10;
LONGLONG diffTx = (ph->qCrashTime.QuadPart -
pndc->LastTxCompletionTimeStamp.QuadPart) / 10;
+ PRINT(PRINT_SEPARATOR);
PRINT("Context %I64X:", pndc->Context);
PRINT("\tLastInterrupt %I64d us before crash", diffInt);
PRINT("\tLast Tx complete %I64d us before crash",
diffTx);
PRINT("\tWaiting %d packets, %d free buffers",
pndc->nofPacketsToComplete, pndc->nofReadyTxBuffers);
+ PRINT(PRINT_SEPARATOR);
}
}
tBugCheckStaticDataContent_V0 *pd = (tBugCheckStaticDataContent_V0
*)(ph->DataArea - databuffer + (PUCHAR)ph);
tBugCheckHistoryDataEntry *phist = (tBugCheckHistoryDataEntry
*)(pd->HistoryData - databuffer + (PUCHAR)ph);
- PRINT("History: version %d, %d entries of %d, current at %d",
pd->HistoryDataVersion, pd->SizeOfHistory, pd->SizeOfHistoryEntry,
pd->CurrentHistoryIndex);
- LONG Index = pd->CurrentHistoryIndex % pd->SizeOfHistory;
- LONG EndIndex = Index;
- ParseHistoryEntry(NULL, NULL, 0);
- for (; Index < (LONG)pd->SizeOfHistory; Index++)
+ PRINT(PRINT_SEPARATOR);
+ if (pd->SizeOfHistory > 2)
{
- ParseHistoryEntry(ph->qCrashTime.QuadPart, phist, Index);
+ PRINT("History: version %d, %d entries of %d, current at %d",
pd->HistoryDataVersion, pd->SizeOfHistory, pd->SizeOfHistoryEntry,
pd->CurrentHistoryIndex);
+ LONG Index = pd->CurrentHistoryIndex % pd->SizeOfHistory;
+ LONG EndIndex = Index;
+ ParseHistoryEntry(NULL, NULL, 0);
+ for (; Index < (LONG)pd->SizeOfHistory; Index++)
+ {
+ ParseHistoryEntry(ph->qCrashTime.QuadPart, phist,
Index);
+ }
+ for (Index = 0; Index < EndIndex; Index++)
+ {
+ ParseHistoryEntry(ph->qCrashTime.QuadPart, phist,
Index);
+ }
}
- for (Index = 0; Index < EndIndex; Index++)
+ else
{
- ParseHistoryEntry(ph->qCrashTime.QuadPart, phist, Index);
+ PRINT("History records are not available");
}
+ PRINT(PRINT_SEPARATOR);
}
-void tDumpParser::FindOurTaggedCrashData()
+void tDumpParser::FindOurTaggedCrashData(BOOL bWithSymbols)
{
ULONG64 h;
if (S_OK == DataSpaces->StartEnumTagged(&h))
@@ -604,7 +642,7 @@ void tDumpParser::FindOurTaggedCrashData()
PRINT("Versions: status data %d, pre-NIC data %d, ptr size %d, %d contexts,
crash time %I64X",
ph->StaticDataVersion, ph->PerNicDataVersion, ph->SizeOfPointer,
ph->ulMaxContexts, ph->qCrashTime);
PRINT("Per-NIC data at %I64X, Static data at %I64X(%d bytes)", ph->PerNicData,
ph->DataArea, ph->DataAreaSize);
-
ParseCrashData(ph, bcdl->Address, bytesRead);
+
ParseCrashData(ph, bcdl->Address, bytesRead, bWithSymbols);
}
}
free(databuffer);
@@ -637,7 +675,7 @@ static BOOL GetModuleName(ULONG Which, ULONG64 Base,
DEBUG_SYMBOLS_IF *DebugSymb
return S_OK == hr;
}
-static BOOL TryMatchingSymbols(DEBUG_SYMBOLS_IF *DebugSymbols, PCSTR name)
+static BOOL TryMatchingSymbols(DEBUG_SYMBOLS_IF *DebugSymbols, PCSTR name,
BOOL bPrintAll = FALSE)
{
UINT n = 0;
CString s;
@@ -652,7 +690,8 @@ static BOOL TryMatchingSymbols(DEBUG_SYMBOLS_IF
*DebugSymbols, PCSTR name)
matchHandle, buf, size, NULL, NULL))
{
n++;
- break;
+ if (!bPrintAll) break;
+ PRINT("%s", buf);
}
DebugSymbols->EndSymbolMatch(matchHandle);
free(buf);
@@ -660,67 +699,29 @@ static BOOL TryMatchingSymbols(DEBUG_SYMBOLS_IF
*DebugSymbols, PCSTR name)
return n != 0;
}
-void tDumpParser::CheckLoadedSymbols()
+BOOL tDumpParser::CheckLoadedSymbols(tModule *pModule)
{
- ULONG index;
+ BOOL bLoaded = FALSE;
ULONG bufferSize = 2048, bufferUsage;
UNREFERENCED_PARAMETER(bufferUsage);
- ULONG64 Base;
char *buffer = (char *)malloc(bufferSize);
DEBUG_MODULE_PARAMETERS ModuleParams;
- PCSTR name = "netkvm";
- HRESULT hr = DebugSymbols->GetModuleByModuleName(name, 0, &index,
&Base);
+ HRESULT hr = DebugSymbols->GetModuleByModuleName(pModule->name, 0,
&pModule->index, &pModule->Base);
if (S_OK == hr)
{
CString s;
- PRINT("Found %s at %I64X", name, Base);
- if (GetModuleName(DEBUG_MODNAME_MODULE, Base, DebugSymbols, s))
+ PRINT("Found %s at %I64X", pModule->name, pModule->Base);
+ if (GetModuleName(DEBUG_MODNAME_MODULE, pModule->Base,
DebugSymbols, s))
PRINT("\tModule Name:%s", s.GetBuffer());
- if (GetModuleName(DEBUG_MODNAME_IMAGE, Base, DebugSymbols, s))
+ if (GetModuleName(DEBUG_MODNAME_IMAGE, pModule->Base,
DebugSymbols, s))
PRINT("\tImage Name:%s", s.GetBuffer());
- if (GetModuleName(DEBUG_MODNAME_SYMBOL_FILE, Base,
DebugSymbols, s))
+ if (GetModuleName(DEBUG_MODNAME_SYMBOL_FILE, pModule->Base,
DebugSymbols, s))
PRINT("\tSymbol file:%s", s.GetBuffer());
+ bLoaded = 0 != TryMatchingSymbols(DebugSymbols, pModule->name);
+ PRINT("Symbols for %s %sLOADED", pModule->name, bLoaded ? "" :
"NOT ");
-
-#if 0
- {
- // this does not retrive information, produces error
D0000147
- hr = DebugSymbols->GetModuleVersionInformation(
- index, Base, "\\", buffer, bufferSize,
&bufferUsage);
- if (S_OK == hr)
- {
- VS_FIXEDFILEINFO *ffi = (VS_FIXEDFILEINFO
*)buffer;
- PRINT("File version:%d.%d.%d.%d",
HIWORD(ffi->dwFileVersionMS), LOWORD(ffi->dwFileVersionMS),
HIWORD(ffi->dwFileVersionLS), LOWORD(ffi->dwFileVersionLS));
- }
- else
- {
- CString sError = ErrorToString(hr & 0xffff);
- PRINT("Error %08X loading symbols: %s", hr,
sError.GetBuffer());
- }
- // this does not improve clearness of loading
- // gives the wrong OK status when the PDB is not loaded
- CString sLoadFor = s;
- PRINT("Trying to load symbols for %s...", sLoadFor);
- hr = DebugSymbols->Reload(sLoadFor);
- if (S_OK == hr)
- {
- PRINT("Symbols for %s loaded successfully",
name);
- if (GetModuleName(DEBUG_MODNAME_SYMBOL_FILE,
Base, DebugSymbols, s))
- PRINT("\tSymbol file:%s",
s.GetBuffer());
- }
- else
- {
- CString sError = ErrorToString(hr);
- PRINT("Error %08X loading symbols: %s", hr,
sError.GetBuffer());
- }
- }
-#endif
- BOOL bLoaded = 0 != TryMatchingSymbols(DebugSymbols, name);
- PRINT("Symbols for %s %sLOADED", name, bLoaded ? "" : "NOT ");
-
-
- if (S_OK == DebugSymbols->GetModuleParameters(1, &Base, 0,
&ModuleParams))
+ if (S_OK == DebugSymbols->GetModuleParameters(1,
&pModule->Base, 0, &ModuleParams))
{
CString sSymbolType = Parse(ModuleParams.SymbolType,
SymbolTypeValues);
CString sFlags = Parse(ModuleParams.Flags, ModuleFlags);
@@ -734,35 +735,16 @@ void tDumpParser::CheckLoadedSymbols()
}
}
free(buffer);
-}
-
-void ExtractKernelLog(IDebugDataSpaces3 *DataSpaces)
-{
- // does not work
- ULONG SizeUsed;
- ULONG64 KdBufferAddr = 0, KdSizeAddr = 0;
- HRESULT hr = DataSpaces->ReadDebuggerData(
- DEBUG_DATA_KdPrintCircularBufferPtrAddr,
- &KdBufferAddr,
- sizeof(KdBufferAddr),
- &SizeUsed);
- if (S_OK == hr) hr = DataSpaces->ReadDebuggerData(
- DEBUG_DATA_KdPrintBufferSizeAddr,
- &KdSizeAddr,
- sizeof(KdSizeAddr),
- &SizeUsed);
- if (S_OK == hr) hr = DataSpaces->ReadDebuggerData(
- DEBUG_DATA_KdPrintBufferSizeAddr,
- &KdSizeAddr,
- sizeof(KdSizeAddr),
- &SizeUsed);
-
+ return bLoaded;
}
void tDumpParser::ProcessDumpFile()
{
ULONG SymbolOptions;
+ BOOL bSymbols;
CString s;
+ tModule module;
+ module.name = "netkvm";
if (S_OK == DebugSymbols->GetSymbolOptions(&SymbolOptions))
{
s = Parse(SymbolOptions, SymbolOptionsFlags);
@@ -773,10 +755,10 @@ void tDumpParser::ProcessDumpFile()
PRINT("Symbol path:%s", s.GetBuffer());
s = GetProperty(espSystemVersion);
PRINT("System version:%s", s.GetBuffer());
-
- FindOurTaggedCrashData();
- CheckLoadedSymbols();
- //ExtractKernelLog();
+ s = GetProperty(espSystemTime);
+ PRINT("Crash time:%s", s.GetBuffer());
+ bSymbols = CheckLoadedSymbols(&module);
+ FindOurTaggedCrashData(bSymbols);
}
CString tDumpParser::GetProperty(eSystemProperty Prop)
@@ -811,22 +793,50 @@ CString tDumpParser::GetProperty(eSystemProperty Prop)
free(buf);
}
break;
+ case espSystemTime:
+ if (Control)
+ {
+ ULONG ulSecondSince1970 = 0, ulUpTime = 0;
+ Control->GetCurrentTimeDate(&ulSecondSince1970);
+ Control->GetCurrentSystemUpTime(&ulUpTime);
+ s = "Unknown";
+ if (ulSecondSince1970)
+ {
+ char buffer[256] = {0};
+ ULONG days, hours, min, sec, rem;
+ days = ulUpTime / (60*60*24);
+ rem = ulUpTime - days * 60*60*24;
+ hours = rem / (60*60);
+ rem = rem - hours * 60 * 60;
+ min = rem / 60;
+ rem = rem - min * 60;
+ sec = rem;
+ __time32_t timestamp =
ulSecondSince1970;
+ tm *timer = _localtime32(×tamp);
+ strftime(buffer, sizeof(buffer), "%b %d
%H:%M:%S %Y(Local)", timer);
+ s.Format("%s (Up time %d:%d:%d:%d)",
buffer, days, hours, min, sec);
+ }
+ }
default:
break;
}
return s;
}
-
int ParseDumpFile(int argc, TCHAR* argv[])
{
- if (1)
+ if (argc == 2)
{
+ CString s = argv[1];
+ s += ".txt";
+ FILE *f = fopen(s.GetBuffer(), "w+t");
+ if (f) outf = f;
tDumpParser Parser;
- if (argc == 2)
- {
- if (!Parser.LoadFile(argv[1])) PRINT("Failed to load
dump file %s", argv[1]);
- }
+#ifdef UNDER_DEBUGGING
+ fputs("UNDER_DEBUGGING, the output is redirected to debugger",
f);
+#endif
+ if (!Parser.LoadFile(argv[1])) PRINT("Failed to load dump file
%s", argv[1]);
+ if (f) fclose(f);
}
else
{
diff --git a/NetKVM/buildAll.bat b/NetKVM/buildAll.bat
index 73c15a5..9379f4a 100644
--- a/NetKVM/buildAll.bat
+++ b/NetKVM/buildAll.bat
@@ -23,8 +23,7 @@ set
_DRIVER_ISO_NAME=Install-%_MINORVERSION_%%_MAJORVERSION_%.iso
if not "%1"=="" goto parameters_here
echo no parameters specified, rebuild all
call clean.bat
-:call "%0" Vista Vista64 XP XP64 Win2K
-call "%0" Win7 Win7_64 Vista Vista64 XP XP64
+call "%0" Vista Vista64 XP XP64 Win2K
call :PackInstall
goto :eof
:parameters_here
diff --git a/NetKVM/clean.bat b/NetKVM/clean.bat
index 8987cb7..1d293a8 100644
--- a/NetKVM/clean.bat
+++ b/NetKVM/clean.bat
@@ -1,8 +1,5 @@
rmdir /S /Q wlh\objfre_wlh_x86
rmdir /S /Q wlh\objfre_wlh_amd64
-rmdir /S /Q wlh\objfre_win7_amd64
-rmdir /S /Q wlh\objfre_win7_x86
-
del wlh\BuildLog.htm
rmdir /S /Q wxp\objfre_wnet_amd64
@@ -15,16 +12,12 @@ rmdir /S /Q virtio\objfre_wnet_amd64
rmdir /S /Q virtio\objfre_w2k_x86
rmdir /S /Q virtio\objfre_wxp_x86
rmdir /S /Q virtio\objfre_wlh_amd64
-rmdir /S /Q virtio\objfre_win7_amd64
-rmdir /S /Q virtio\objfre_win7_x86
rmdir /S /Q common\objfre_wlh_x86
rmdir /S /Q common\objfre_wnet_amd64
rmdir /S /Q common\objfre_w2k_x86
rmdir /S /Q common\objfre_wxp_x86
rmdir /S /Q common\objfre_wlh_amd64
-rmdir /S /Q common\objfre_win7_amd64
-rmdir /S /Q common\objfre_win7_x86
rmdir /S /Q Install
diff --git a/NetKVM/wlh/ParaNdis6-Impl.c b/NetKVM/wlh/ParaNdis6-Impl.c
index 59d7ff9..b295202 100644
--- a/NetKVM/wlh/ParaNdis6-Impl.c
+++ b/NetKVM/wlh/ParaNdis6-Impl.c
@@ -450,6 +450,8 @@ NDIS_STATUS
ParaNdis_FinishSpecificInitialization(PARANDIS_ADAPTER *pContext)
NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS mic;
DEBUG_ENTRY(0);
+ InitializeListHead(&pContext->WaitingMapping);
+
NdisZeroMemory(&mic, sizeof(mic));
mic.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_INTERRUPT;
mic.Header.Revision = NDIS_MINIPORT_INTERRUPT_REVISION_1;
@@ -1286,13 +1288,13 @@ static BOOLEAN PrepareSingleNBL(
bOK = FALSE;
pFailReason = "Failure to allocate BLE";
}
-
+
if (bOK && !pB)
{
bOK = FALSE;
pFailReason = "Empty NBL";
}
-
+
while (pB && bOK)
{
ULONG dataLength = NET_BUFFER_DATA_LENGTH(pB);
@@ -1403,6 +1405,8 @@ static void StartTransferSingleNBL(PARANDIS_ADAPTER
*pContext, PNET_BUFFER_LIST
tNetBufferEntry *pnbe = (tNetBufferEntry
*)RemoveHeadList(&list);
DPrintf(4, ("[%s] mapping entry %p", __FUNCTION__, pnbe));
//ParaNdis_DebugHistory(pContext, hopSendPacketRequest, pNBL,
0, 0, status);
+ NdisInterlockedInsertTailList(&pContext->WaitingMapping,
&pnbe->list, &pContext->SendLock);
+
if (bPassive) irql = KeRaiseIrqlToDpcLevel();
if (pContext->bUseScatterGather)
{
@@ -1533,7 +1537,14 @@ VOID ProcessSGListHandler(
PNET_BUFFER_LIST pNBL = pnbe->nbl;
LONG DoneCounter;
tNetBufferListEntry *pble = (tNetBufferListEntry *)pNBL->Scratch;
+
+ NdisAcquireSpinLock(&pContext->SendLock);
+ // remove the netbuffer entry from WaitingMapping list
+ RemoveEntryList(&pnbe->list);
+ // insert it into list of buffers under netbufferlist entry
InsertTailList(&pble->bufferEntries, &pnbe->list);
+ NdisReleaseSpinLock(&pContext->SendLock);
+
pnbe->pSGList = pSGL;
DoneCounter = InterlockedIncrement(&pble->nBuffersMapped);
DPrintf(3, ("[%s] mapped %d of %d(%d)", __FUNCTION__,
--
To unsubscribe from this list: send the line "unsubscribe kvm-commits" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html