From win-pv-devel-bounces@lists.xenproject.org Thu Jul 02 09:35:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 02 Jul 2015 09:35:38 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZAau9-0001mf-RG; Thu, 02 Jul 2015 09:35:37 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZAau8-0001mX-P0
	for win-pv-devel@lists.xenproject.org; Thu, 02 Jul 2015 09:35:36 +0000
Received: from [193.109.254.147] by server-3.bemta-14.messagelabs.com id
	F0/9D-18676-8E505955; Thu, 02 Jul 2015 09:35:36 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1435829734!28629347!1
X-Originating-IP: [209.85.160.181]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15699 invoked from network); 2 Jul 2015 09:35:35 -0000
Received: from mail-yk0-f181.google.com (HELO mail-yk0-f181.google.com)
	(209.85.160.181)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Jul 2015 09:35:35 -0000
Received: by ykdr198 with SMTP id r198so62885248ykd.3
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 02 Jul 2015 02:35:34 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=KE+rJN7KcWj8M0K+2vprJ9NvhG13ubHodQdZjJFTHUY=;
	b=RyM/RGF48W4Q/2IjRY7LuGbbqb+wB0F3hHC2Wqybd5ds/zvqWrh76oibpPuL0KhEnV
	I0ZIzDHoyk30It3BMgrL5hYJbLls+4HPK8htf0PlRdtmXcHZx7V0hEyxYJqzYaaywaam
	OFJN1O+TzzsvsZOIGLxti773v1vsjr7LBjJvL/kcq1QUQEUoGyqBPW1nCubZMVtBp11I
	oeY6SBnFOH1XaYeAWhDt2pTYXGY/N+FX6fRwCSOF1AOfp9uZ8CskQMo0bcgChnBkmKCD
	Syqa1TU2LmZ0IfVVPwmlLUph+Cs8y0Z0eZkBLnZFA4LfNAVHa9waurk5UnjHH/ndwe0f
	5U+g==
X-Received: by 10.13.204.142 with SMTP id o136mr38058373ywd.171.1435829734556; 
	Thu, 02 Jul 2015 02:35:34 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by mx.google.com with ESMTPSA id w13sm4988890ywd.30.2015.07.02.02.35.32
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 02 Jul 2015 02:35:33 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  2 Jul 2015 10:35:12 +0100
Message-Id: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 0/4] Various fixes and imrpovements...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Patch #1 improves the code handling failure to set up per-CPU event channel
upcalls (if Xen does not implement them)

Patch #2 gets rid of the long PDO descriptions, which were ugly, and also
adds assertions that HardwareIDs or CompatibleIDs do not overflow.

Patch #3 fixes a (very) long-standing potential buffer overflow in XENFILT

Patch #4 fixes fall-back to the two-level EVTCHN ABI if Xen does not
implement FIFO.

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 02 09:35:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 02 Jul 2015 09:35:38 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZAau9-0001mf-RG; Thu, 02 Jul 2015 09:35:37 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZAau8-0001mX-P0
	for win-pv-devel@lists.xenproject.org; Thu, 02 Jul 2015 09:35:36 +0000
Received: from [193.109.254.147] by server-3.bemta-14.messagelabs.com id
	F0/9D-18676-8E505955; Thu, 02 Jul 2015 09:35:36 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1435829734!28629347!1
X-Originating-IP: [209.85.160.181]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15699 invoked from network); 2 Jul 2015 09:35:35 -0000
Received: from mail-yk0-f181.google.com (HELO mail-yk0-f181.google.com)
	(209.85.160.181)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Jul 2015 09:35:35 -0000
Received: by ykdr198 with SMTP id r198so62885248ykd.3
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 02 Jul 2015 02:35:34 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=KE+rJN7KcWj8M0K+2vprJ9NvhG13ubHodQdZjJFTHUY=;
	b=RyM/RGF48W4Q/2IjRY7LuGbbqb+wB0F3hHC2Wqybd5ds/zvqWrh76oibpPuL0KhEnV
	I0ZIzDHoyk30It3BMgrL5hYJbLls+4HPK8htf0PlRdtmXcHZx7V0hEyxYJqzYaaywaam
	OFJN1O+TzzsvsZOIGLxti773v1vsjr7LBjJvL/kcq1QUQEUoGyqBPW1nCubZMVtBp11I
	oeY6SBnFOH1XaYeAWhDt2pTYXGY/N+FX6fRwCSOF1AOfp9uZ8CskQMo0bcgChnBkmKCD
	Syqa1TU2LmZ0IfVVPwmlLUph+Cs8y0Z0eZkBLnZFA4LfNAVHa9waurk5UnjHH/ndwe0f
	5U+g==
X-Received: by 10.13.204.142 with SMTP id o136mr38058373ywd.171.1435829734556; 
	Thu, 02 Jul 2015 02:35:34 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by mx.google.com with ESMTPSA id w13sm4988890ywd.30.2015.07.02.02.35.32
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 02 Jul 2015 02:35:33 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  2 Jul 2015 10:35:12 +0100
Message-Id: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 0/4] Various fixes and imrpovements...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Patch #1 improves the code handling failure to set up per-CPU event channel
upcalls (if Xen does not implement them)

Patch #2 gets rid of the long PDO descriptions, which were ugly, and also
adds assertions that HardwareIDs or CompatibleIDs do not overflow.

Patch #3 fixes a (very) long-standing potential buffer overflow in XENFILT

Patch #4 fixes fall-back to the two-level EVTCHN ABI if Xen does not
implement FIFO.

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 02 09:35:39 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 02 Jul 2015 09:35:39 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZAauB-0001n9-So; Thu, 02 Jul 2015 09:35:39 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZAauA-0001ml-QO
	for win-pv-devel@lists.xenproject.org; Thu, 02 Jul 2015 09:35:38 +0000
Received: from [85.158.137.68] by server-5.bemta-3.messagelabs.com id
	59/19-23832-AE505955; Thu, 02 Jul 2015 09:35:38 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-5.tower-31.messagelabs.com!1435829736!21993222!1
X-Originating-IP: [209.85.160.180]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11193 invoked from network); 2 Jul 2015 09:35:37 -0000
Received: from mail-yk0-f180.google.com (HELO mail-yk0-f180.google.com)
	(209.85.160.180)
	by server-5.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Jul 2015 09:35:37 -0000
Received: by ykdy1 with SMTP id y1so63128298ykd.2
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 02 Jul 2015 02:35:36 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=3+rjG0DCFN9cNX8OerbVKyPz1adMqpH7n+SWfFSRA9o=;
	b=cNY8e3zpav6PEyoSa+6AUERawBhr8/ndAJDSownF0We434lAVkViKMWp0PcD4mcGlo
	zX2aavganx/xGhqcv2UWkN3RJLZY6EYsSNdQQbberM24lqBGJG+VBAMpq2CXjn/dxIlA
	l30eGqkVBCX8C2PfuvpLutrwJVZXwCzI3/GX39znqLmyR9tj8EmX9miObXaGa6F4w5hv
	2kMBqfMLujSq9sbdEnV0YQdlVGvt5oGostipgloC+MbF3qsy9cq34K2Gq8NML23bAxMD
	wnhL7rAScb/dkyUUYTtbNCS+piXYutNDqYr8pN8MaC8PTSTI0nRp5BLx2mC650IkOyoC
	reIA==
X-Received: by 10.13.221.141 with SMTP id g135mr37192387ywe.11.1435829736645; 
	Thu, 02 Jul 2015 02:35:36 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by mx.google.com with ESMTPSA id w13sm4988890ywd.30.2015.07.02.02.35.34
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 02 Jul 2015 02:35:35 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  2 Jul 2015 10:35:13 +0100
Message-Id: <1435829716-20840-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
References: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/4] Make it more obvious when per-CPU
	upcalls are not implemented...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...and break out of the per-CPU loop at that point.

Also mention that the callback via has been set up and which vector it is
using.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/evtchn.c | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/src/xenbus/evtchn.c b/src/xenbus/evtchn.c
index a5a3caf..fa5a980 100644
--- a/src/xenbus/evtchn.c
+++ b/src/xenbus/evtchn.c
@@ -971,6 +971,7 @@ EvtchnInterruptEnable(
         PXENBUS_EVTCHN_PROCESSOR    Processor;
         unsigned int                vcpu_id;
         UCHAR                       Vector;
+        PROCESSOR_NUMBER            ProcNumber;
 
         Processor = &Context->Processor[Index];
 
@@ -981,15 +982,22 @@ EvtchnInterruptEnable(
         Vector = FdoGetInterruptVector(Context->Fdo, Processor->Interrupt);
 
         status = HvmSetEvtchnUpcallVector(vcpu_id, Vector);
-        if (NT_SUCCESS(status)) {
-            PROCESSOR_NUMBER    ProcNumber;
+        if (!NT_SUCCESS(status)) {
+            if (status != STATUS_NOT_IMPLEMENTED )
+                continue;
 
-            status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
-            ASSERT(NT_SUCCESS(status));
-
-            Info("CPU %u:%u\n", ProcNumber.Group, ProcNumber.Number);
-            Processor->UpcallEnabled = TRUE;
+            Info("PER-CPU UPCALL NOT IMPLEMENTED\n");
+            break;
         }
+
+        status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
+        ASSERT(NT_SUCCESS(status));
+
+        Info("CPU %u:%u (Vector = %u)\n",
+             ProcNumber.Group,
+             ProcNumber.Number,
+             Vector);
+        Processor->UpcallEnabled = TRUE;
     }
 
     Line = FdoGetInterruptLine(Context->Fdo, Context->Interrupt);
@@ -997,6 +1005,8 @@ EvtchnInterruptEnable(
     status = HvmSetParam(HVM_PARAM_CALLBACK_IRQ, Line);
     ASSERT(NT_SUCCESS(status));
 
+    Info("CALLBACK VIA (Vector = %u)\n", Line);
+
     Trace("<====\n");
 }
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 02 09:35:39 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 02 Jul 2015 09:35:39 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZAauB-0001n9-So; Thu, 02 Jul 2015 09:35:39 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZAauA-0001ml-QO
	for win-pv-devel@lists.xenproject.org; Thu, 02 Jul 2015 09:35:38 +0000
Received: from [85.158.137.68] by server-5.bemta-3.messagelabs.com id
	59/19-23832-AE505955; Thu, 02 Jul 2015 09:35:38 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-5.tower-31.messagelabs.com!1435829736!21993222!1
X-Originating-IP: [209.85.160.180]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11193 invoked from network); 2 Jul 2015 09:35:37 -0000
Received: from mail-yk0-f180.google.com (HELO mail-yk0-f180.google.com)
	(209.85.160.180)
	by server-5.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Jul 2015 09:35:37 -0000
Received: by ykdy1 with SMTP id y1so63128298ykd.2
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 02 Jul 2015 02:35:36 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=3+rjG0DCFN9cNX8OerbVKyPz1adMqpH7n+SWfFSRA9o=;
	b=cNY8e3zpav6PEyoSa+6AUERawBhr8/ndAJDSownF0We434lAVkViKMWp0PcD4mcGlo
	zX2aavganx/xGhqcv2UWkN3RJLZY6EYsSNdQQbberM24lqBGJG+VBAMpq2CXjn/dxIlA
	l30eGqkVBCX8C2PfuvpLutrwJVZXwCzI3/GX39znqLmyR9tj8EmX9miObXaGa6F4w5hv
	2kMBqfMLujSq9sbdEnV0YQdlVGvt5oGostipgloC+MbF3qsy9cq34K2Gq8NML23bAxMD
	wnhL7rAScb/dkyUUYTtbNCS+piXYutNDqYr8pN8MaC8PTSTI0nRp5BLx2mC650IkOyoC
	reIA==
X-Received: by 10.13.221.141 with SMTP id g135mr37192387ywe.11.1435829736645; 
	Thu, 02 Jul 2015 02:35:36 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by mx.google.com with ESMTPSA id w13sm4988890ywd.30.2015.07.02.02.35.34
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 02 Jul 2015 02:35:35 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  2 Jul 2015 10:35:13 +0100
Message-Id: <1435829716-20840-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
References: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/4] Make it more obvious when per-CPU
	upcalls are not implemented...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...and break out of the per-CPU loop at that point.

Also mention that the callback via has been set up and which vector it is
using.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/evtchn.c | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/src/xenbus/evtchn.c b/src/xenbus/evtchn.c
index a5a3caf..fa5a980 100644
--- a/src/xenbus/evtchn.c
+++ b/src/xenbus/evtchn.c
@@ -971,6 +971,7 @@ EvtchnInterruptEnable(
         PXENBUS_EVTCHN_PROCESSOR    Processor;
         unsigned int                vcpu_id;
         UCHAR                       Vector;
+        PROCESSOR_NUMBER            ProcNumber;
 
         Processor = &Context->Processor[Index];
 
@@ -981,15 +982,22 @@ EvtchnInterruptEnable(
         Vector = FdoGetInterruptVector(Context->Fdo, Processor->Interrupt);
 
         status = HvmSetEvtchnUpcallVector(vcpu_id, Vector);
-        if (NT_SUCCESS(status)) {
-            PROCESSOR_NUMBER    ProcNumber;
+        if (!NT_SUCCESS(status)) {
+            if (status != STATUS_NOT_IMPLEMENTED )
+                continue;
 
-            status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
-            ASSERT(NT_SUCCESS(status));
-
-            Info("CPU %u:%u\n", ProcNumber.Group, ProcNumber.Number);
-            Processor->UpcallEnabled = TRUE;
+            Info("PER-CPU UPCALL NOT IMPLEMENTED\n");
+            break;
         }
+
+        status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
+        ASSERT(NT_SUCCESS(status));
+
+        Info("CPU %u:%u (Vector = %u)\n",
+             ProcNumber.Group,
+             ProcNumber.Number,
+             Vector);
+        Processor->UpcallEnabled = TRUE;
     }
 
     Line = FdoGetInterruptLine(Context->Fdo, Context->Interrupt);
@@ -997,6 +1005,8 @@ EvtchnInterruptEnable(
     status = HvmSetParam(HVM_PARAM_CALLBACK_IRQ, Line);
     ASSERT(NT_SUCCESS(status));
 
+    Info("CALLBACK VIA (Vector = %u)\n", Line);
+
     Trace("<====\n");
 }
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 02 09:35:45 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 02 Jul 2015 09:35:45 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZAauH-0001o9-Um; Thu, 02 Jul 2015 09:35:45 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZAauH-0001nx-2j
	for win-pv-devel@lists.xenproject.org; Thu, 02 Jul 2015 09:35:45 +0000
Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id
	90/1D-19853-0F505955; Thu, 02 Jul 2015 09:35:44 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-206.messagelabs.com!1435829742!18387100!1
X-Originating-IP: [209.85.160.172]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15046 invoked from network); 2 Jul 2015 09:35:42 -0000
Received: from mail-yk0-f172.google.com (HELO mail-yk0-f172.google.com)
	(209.85.160.172)
	by server-12.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Jul 2015 09:35:42 -0000
Received: by ykfy125 with SMTP id y125so63136407ykf.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 02 Jul 2015 02:35:42 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=Or4Oc65svJ5DySIx97tXRab22ajqrnqYMItnEeJ361M=;
	b=bTUjV7b3v2doEQgiftj6fkFGr9r+eg/HFR/Tu6i7i4i4RcBLjWEkxfJe7Xsa/E2IyQ
	Fk8lFIWGDYzHeCwLrJReAvQFp04SjWlV19PlVQi0m1TPhHfo/n+1iDStqSzgCXp9gcjv
	oakucyc6EnWUUAyCP57EOT7kfd4ptfQauaiY4793D4xhBCzS5mKfkqSv9J8W2POQhCbW
	rWPwdgLF1IjJrsGTpbudPwVSiuVNl3vpZokHr83oSKa97Q+pHU5HH3CMbYbpZ3R2/CLy
	68gd2KAjLTNBcfPcCPyHnGL2AXfQpNimJ2SXSomjWepZKArwrhjUkp1GuClhYy97+hB5
	yPBg==
X-Received: by 10.13.210.5 with SMTP id u5mr36144957ywd.137.1435829742069;
	Thu, 02 Jul 2015 02:35:42 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by mx.google.com with ESMTPSA id w13sm4988890ywd.30.2015.07.02.02.35.39
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 02 Jul 2015 02:35:40 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  2 Jul 2015 10:35:15 +0100
Message-Id: <1435829716-20840-4-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
References: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 3/4] Fix potential buffer overflow
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The __min in XENFILT's FdoQueryDeviceRelations() should be a __max. The only
reason this mistake did not lead to an immediate buffer overflow was because
the allocation incorrectly used sizeof (DEVICE_OBJECT) rather than
sizeof (PDEVICE_OBJECT).

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenfilt/fdo.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/xenfilt/fdo.c b/src/xenfilt/fdo.c
index 42a40e8..cff179b 100644
--- a/src/xenfilt/fdo.c
+++ b/src/xenfilt/fdo.c
@@ -1160,7 +1160,7 @@ FdoQueryDeviceRelations(
     }
 
     Size = FIELD_OFFSET(DEVICE_RELATIONS, Objects) +
-           (sizeof (DEVICE_OBJECT) * __min(Count, 1));
+           (sizeof (PDEVICE_OBJECT) * __max(Count, 1));
 
     Relations = __AllocatePoolWithTag(PagedPool, Size, 'TLIF');
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 02 09:35:45 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 02 Jul 2015 09:35:45 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZAauH-0001o9-Um; Thu, 02 Jul 2015 09:35:45 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZAauH-0001nx-2j
	for win-pv-devel@lists.xenproject.org; Thu, 02 Jul 2015 09:35:45 +0000
Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id
	90/1D-19853-0F505955; Thu, 02 Jul 2015 09:35:44 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-206.messagelabs.com!1435829742!18387100!1
X-Originating-IP: [209.85.160.172]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15046 invoked from network); 2 Jul 2015 09:35:42 -0000
Received: from mail-yk0-f172.google.com (HELO mail-yk0-f172.google.com)
	(209.85.160.172)
	by server-12.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Jul 2015 09:35:42 -0000
Received: by ykfy125 with SMTP id y125so63136407ykf.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 02 Jul 2015 02:35:42 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=Or4Oc65svJ5DySIx97tXRab22ajqrnqYMItnEeJ361M=;
	b=bTUjV7b3v2doEQgiftj6fkFGr9r+eg/HFR/Tu6i7i4i4RcBLjWEkxfJe7Xsa/E2IyQ
	Fk8lFIWGDYzHeCwLrJReAvQFp04SjWlV19PlVQi0m1TPhHfo/n+1iDStqSzgCXp9gcjv
	oakucyc6EnWUUAyCP57EOT7kfd4ptfQauaiY4793D4xhBCzS5mKfkqSv9J8W2POQhCbW
	rWPwdgLF1IjJrsGTpbudPwVSiuVNl3vpZokHr83oSKa97Q+pHU5HH3CMbYbpZ3R2/CLy
	68gd2KAjLTNBcfPcCPyHnGL2AXfQpNimJ2SXSomjWepZKArwrhjUkp1GuClhYy97+hB5
	yPBg==
X-Received: by 10.13.210.5 with SMTP id u5mr36144957ywd.137.1435829742069;
	Thu, 02 Jul 2015 02:35:42 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by mx.google.com with ESMTPSA id w13sm4988890ywd.30.2015.07.02.02.35.39
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 02 Jul 2015 02:35:40 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  2 Jul 2015 10:35:15 +0100
Message-Id: <1435829716-20840-4-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
References: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 3/4] Fix potential buffer overflow
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The __min in XENFILT's FdoQueryDeviceRelations() should be a __max. The only
reason this mistake did not lead to an immediate buffer overflow was because
the allocation incorrectly used sizeof (DEVICE_OBJECT) rather than
sizeof (PDEVICE_OBJECT).

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenfilt/fdo.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/xenfilt/fdo.c b/src/xenfilt/fdo.c
index 42a40e8..cff179b 100644
--- a/src/xenfilt/fdo.c
+++ b/src/xenfilt/fdo.c
@@ -1160,7 +1160,7 @@ FdoQueryDeviceRelations(
     }
 
     Size = FIELD_OFFSET(DEVICE_RELATIONS, Objects) +
-           (sizeof (DEVICE_OBJECT) * __min(Count, 1));
+           (sizeof (PDEVICE_OBJECT) * __max(Count, 1));
 
     Relations = __AllocatePoolWithTag(PagedPool, Size, 'TLIF');
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 02 09:35:48 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 02 Jul 2015 09:35:48 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZAauJ-0001om-Vu; Thu, 02 Jul 2015 09:35:47 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZAauI-0001oU-J3
	for win-pv-devel@lists.xenproject.org; Thu, 02 Jul 2015 09:35:46 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	A5/62-12923-1F505955; Thu, 02 Jul 2015 09:35:45 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-11.tower-206.messagelabs.com!1435829744!14293235!1
X-Originating-IP: [209.85.160.181]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24840 invoked from network); 2 Jul 2015 09:35:44 -0000
Received: from mail-yk0-f181.google.com (HELO mail-yk0-f181.google.com)
	(209.85.160.181)
	by server-11.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Jul 2015 09:35:44 -0000
Received: by ykdr198 with SMTP id r198so62887902ykd.3
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 02 Jul 2015 02:35:43 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=T6hwtuug84cQ1sJ/6oLMy0SkFopnGyDcRYKyT2r1TW8=;
	b=b1pdLa8/MHH7JN/vAHymbYN9BXCIeAJgM4KrA3QsRYPa4W/DboDTkP03ASN0ngKsoK
	/I/S/CsQKgBA7W4HTVzeofVk4QsUaskBDP00s/FNQVVjEFIlfUGpK3LQuyS3gFbbhwfY
	MM0UZvczVcOSi5Y8bXqo8qJ+9xuuLzmEbAn9OPAgzXCcurEvbZkrXMXFNumrx+QRW+09
	5LX238qBONabNFjI71l2wt2vmqRL54pYfXbAvxWchJdeQjS1Rwg+/8etn1JJalj8FKuN
	FanTBJJYzuiFnL2e+PLZrhqC1jJ8037EZC6FHYS1JL6tmH9vFCvDBEVj9X4YxZKgpKSk
	Gxvw==
X-Received: by 10.129.125.213 with SMTP id y204mr38481103ywc.42.1435829743802; 
	Thu, 02 Jul 2015 02:35:43 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by mx.google.com with ESMTPSA id w13sm4988890ywd.30.2015.07.02.02.35.42
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 02 Jul 2015 02:35:42 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  2 Jul 2015 10:35:16 +0100
Message-Id: <1435829716-20840-5-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
References: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 4/4] Fix fall-back to two-level EVTCHN ABI
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

When the EVTCHN code attempts to acquire the FIFO ABI it may fail to do
so because the version of Xen may not support it. In this case the code
was issuing an EventChannelReset() which has the unfortunate side effect of
killing any toolstack-created channels, such as the xenstored channel.

This patch moves the existent EvtchnFifoReset function into the base
evtchn source module (since it's not ABI specific) and uses that function
as the only mechanism of issuing an EventChannelReset() since it contains
code to preserve event channel bindings. (Prior to the move it only
preserved the xenstore channel but this patch adds code to preserve the
console event channel too, if it exists).

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/evtchn.c      | 114 +++++++++++++++++++++++++++++++++++++++++++++++
 src/xenbus/evtchn.h      |   5 +++
 src/xenbus/evtchn_fifo.c |  50 +--------------------
 3 files changed, 121 insertions(+), 48 deletions(-)

diff --git a/src/xenbus/evtchn.c b/src/xenbus/evtchn.c
index fa5a980..051ec1f 100644
--- a/src/xenbus/evtchn.c
+++ b/src/xenbus/evtchn.c
@@ -906,6 +906,120 @@ EvtchnInterruptCallback(
     return DoneSomething;
 }
 
+VOID
+EvtchnReset(
+    VOID
+    )
+{
+    ULONGLONG                   Value;
+    XENBUS_EVTCHN_CHANNEL       Store;
+    XENBUS_EVTCHN_CHANNEL       Console;
+    NTSTATUS                    status;
+
+    //
+    // When we reset the event channel ABI we will lose our
+    // binding to the any event channel which was set up
+    // by the toolstack during domain build.
+    // We need to get the binding back, so we must query the
+    // remote domain and port, and then re-bind after the
+    // reset.
+    //
+
+    RtlZeroMemory(&Store, sizeof (Store));
+    RtlZeroMemory(&Console, sizeof (Console));
+
+    status = HvmGetParam(HVM_PARAM_STORE_EVTCHN, &Value);
+    if (NT_SUCCESS(status))
+        Store.LocalPort = (ULONG)Value;
+
+    status = HvmGetParam(HVM_PARAM_CONSOLE_EVTCHN, &Value);
+    if (NT_SUCCESS(status))
+        Console.LocalPort = (ULONG)Value;
+
+    if (Store.LocalPort != 0) {
+        domid_t         RemoteDomain;
+        evtchn_port_t   RemotePort;
+
+        status = EventChannelQueryInterDomain(Store.LocalPort,
+                                              &RemoteDomain,
+                                              &RemotePort);
+        ASSERT(NT_SUCCESS(status));
+
+        Store.Parameters.InterDomain.RemoteDomain = RemoteDomain;
+        Store.Parameters.InterDomain.RemotePort = RemotePort;
+
+        LogPrintf(LOG_LEVEL_INFO, "EVTCHN_RESET: STORE (%u) -> (%u:%u)\n",
+                  Store.LocalPort,
+                  RemoteDomain,
+                  RemotePort);
+    }
+
+    if (Console.LocalPort != 0) {
+        domid_t         RemoteDomain;
+        evtchn_port_t   RemotePort;
+
+        status = EventChannelQueryInterDomain(Console.LocalPort,
+                                              &RemoteDomain,
+                                              &RemotePort);
+        ASSERT(NT_SUCCESS(status));
+
+        Console.Parameters.InterDomain.RemoteDomain = RemoteDomain;
+        Console.Parameters.InterDomain.RemotePort = RemotePort;
+
+        LogPrintf(LOG_LEVEL_INFO, "EVTCHN_RESET: CONSOLE (%u) -> (%u:%u)\n",
+                  Console.LocalPort,
+                  RemoteDomain,
+                  RemotePort);
+    }
+
+    (VOID) EventChannelReset();
+    LogPrintf(LOG_LEVEL_INFO, "EVTCHN_RESET: RESET\n");
+
+    if (Store.LocalPort != 0) {
+        domid_t         RemoteDomain;
+        evtchn_port_t   RemotePort;
+
+        RemoteDomain = Store.Parameters.InterDomain.RemoteDomain;
+        RemotePort = Store.Parameters.InterDomain.RemotePort;
+
+        status = EventChannelBindInterDomain(RemoteDomain,
+                                             RemotePort,
+                                             &Store.LocalPort);
+        ASSERT(NT_SUCCESS(status));
+
+        status = HvmSetParam(HVM_PARAM_STORE_EVTCHN, Store.LocalPort);
+        ASSERT(NT_SUCCESS(status));
+
+        LogPrintf(LOG_LEVEL_INFO, "EVTCHN_RESET: STORE (%u:%u) -> %u\n",
+                  RemoteDomain,
+                  RemotePort,
+                  Store.LocalPort);
+    }
+
+    if (Console.LocalPort != 0) {
+        domid_t         RemoteDomain;
+        evtchn_port_t   RemotePort;
+
+        RemoteDomain = Console.Parameters.InterDomain.RemoteDomain;
+        RemotePort = Console.Parameters.InterDomain.RemotePort;
+
+        status = EventChannelBindInterDomain(RemoteDomain,
+                                             RemotePort,
+                                             &Console.LocalPort);
+        ASSERT(NT_SUCCESS(status));
+
+        status = HvmSetParam(HVM_PARAM_CONSOLE_EVTCHN, Console.LocalPort);
+        ASSERT(NT_SUCCESS(status));
+
+        LogPrintf(LOG_LEVEL_INFO, "EVTCHN_RESET: CONSOLE (%u:%u) -> %u\n",
+                  RemoteDomain,
+                  RemotePort,
+                  Console.LocalPort);
+    }
+}
+
+
+
 static NTSTATUS
 EvtchnAbiAcquire(
     IN  PXENBUS_EVTCHN_CONTEXT  Context
diff --git a/src/xenbus/evtchn.h b/src/xenbus/evtchn.h
index 38a1f39..69b557e 100644
--- a/src/xenbus/evtchn.h
+++ b/src/xenbus/evtchn.h
@@ -59,6 +59,11 @@ EvtchnTeardown(
     IN  PXENBUS_EVTCHN_CONTEXT  Context
     );
 
+VOID
+EvtchnReset(
+    VOID
+    );
+
 extern BOOLEAN
 EvtchnInterrupt(
     IN  PXENBUS_EVTCHN_CONTEXT  Context
diff --git a/src/xenbus/evtchn_fifo.c b/src/xenbus/evtchn_fifo.c
index 5996b82..98ea0fa 100644
--- a/src/xenbus/evtchn_fifo.c
+++ b/src/xenbus/evtchn_fifo.c
@@ -469,52 +469,6 @@ EvtchnFifoPortDisable(
     EvtchnFifoPortMask(_Context, Port);
 }
 
-static VOID
-EvtchnFifoReset(
-    IN  PXENBUS_EVTCHN_FIFO_CONTEXT Context
-    )
-{
-    ULONGLONG                       Value;
-    ULONG                           LocalPort;
-    ULONG                           RemotePort;
-    USHORT                          RemoteDomain;
-    NTSTATUS                        status;
-
-    UNREFERENCED_PARAMETER(Context);
-
-    status = HvmGetParam(HVM_PARAM_STORE_EVTCHN, &Value);
-    ASSERT(NT_SUCCESS(status));
-
-    LocalPort = (LONG)Value;
-
-    //
-    // When we reset the event channel ABI we will lose our
-    // binding to the STORE event channel, which was set up
-    // by the toolstack during domain build.
-    // We need to get the binding back, so we must query the
-    // remote domain and port, and then re-bind after the
-    // reset.
-    //
-
-    status = EventChannelQueryInterDomain(LocalPort,
-                                          &RemoteDomain,
-                                          &RemotePort);
-    ASSERT(NT_SUCCESS(status));
-
-    LogPrintf(LOG_LEVEL_INFO, "EVTCHN_FIFO: RESET\n");
-    (VOID) EventChannelReset();
-
-    status = EventChannelBindInterDomain(RemoteDomain,
-                                         RemotePort,
-                                         &LocalPort);
-    ASSERT(NT_SUCCESS(status));
-
-    Value = LocalPort;
-
-    status = HvmSetParam(HVM_PARAM_STORE_EVTCHN, Value);
-    ASSERT(NT_SUCCESS(status));
-}
-
 static NTSTATUS
 EvtchnFifoAcquire(
     IN  PXENBUS_EVTCHN_ABI_CONTEXT  _Context
@@ -578,7 +532,7 @@ fail2:
 fail1:
     Error("fail1 (%08x)\n", status);
 
-    (VOID) EventChannelReset();
+    EvtchnReset();
 
     while (--Index >= 0) {
         unsigned int    vcpu_id;
@@ -614,7 +568,7 @@ EvtchnFifoRelease(
 
     Trace("====>\n");
 
-    EvtchnFifoReset(Context);
+    EvtchnReset();
 
     EvtchnFifoContract(Context);
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 02 09:35:48 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 02 Jul 2015 09:35:48 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZAauJ-0001om-Vu; Thu, 02 Jul 2015 09:35:47 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZAauI-0001oU-J3
	for win-pv-devel@lists.xenproject.org; Thu, 02 Jul 2015 09:35:46 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	A5/62-12923-1F505955; Thu, 02 Jul 2015 09:35:45 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-11.tower-206.messagelabs.com!1435829744!14293235!1
X-Originating-IP: [209.85.160.181]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24840 invoked from network); 2 Jul 2015 09:35:44 -0000
Received: from mail-yk0-f181.google.com (HELO mail-yk0-f181.google.com)
	(209.85.160.181)
	by server-11.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Jul 2015 09:35:44 -0000
Received: by ykdr198 with SMTP id r198so62887902ykd.3
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 02 Jul 2015 02:35:43 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=T6hwtuug84cQ1sJ/6oLMy0SkFopnGyDcRYKyT2r1TW8=;
	b=b1pdLa8/MHH7JN/vAHymbYN9BXCIeAJgM4KrA3QsRYPa4W/DboDTkP03ASN0ngKsoK
	/I/S/CsQKgBA7W4HTVzeofVk4QsUaskBDP00s/FNQVVjEFIlfUGpK3LQuyS3gFbbhwfY
	MM0UZvczVcOSi5Y8bXqo8qJ+9xuuLzmEbAn9OPAgzXCcurEvbZkrXMXFNumrx+QRW+09
	5LX238qBONabNFjI71l2wt2vmqRL54pYfXbAvxWchJdeQjS1Rwg+/8etn1JJalj8FKuN
	FanTBJJYzuiFnL2e+PLZrhqC1jJ8037EZC6FHYS1JL6tmH9vFCvDBEVj9X4YxZKgpKSk
	Gxvw==
X-Received: by 10.129.125.213 with SMTP id y204mr38481103ywc.42.1435829743802; 
	Thu, 02 Jul 2015 02:35:43 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by mx.google.com with ESMTPSA id w13sm4988890ywd.30.2015.07.02.02.35.42
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 02 Jul 2015 02:35:42 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  2 Jul 2015 10:35:16 +0100
Message-Id: <1435829716-20840-5-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
References: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 4/4] Fix fall-back to two-level EVTCHN ABI
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

When the EVTCHN code attempts to acquire the FIFO ABI it may fail to do
so because the version of Xen may not support it. In this case the code
was issuing an EventChannelReset() which has the unfortunate side effect of
killing any toolstack-created channels, such as the xenstored channel.

This patch moves the existent EvtchnFifoReset function into the base
evtchn source module (since it's not ABI specific) and uses that function
as the only mechanism of issuing an EventChannelReset() since it contains
code to preserve event channel bindings. (Prior to the move it only
preserved the xenstore channel but this patch adds code to preserve the
console event channel too, if it exists).

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/evtchn.c      | 114 +++++++++++++++++++++++++++++++++++++++++++++++
 src/xenbus/evtchn.h      |   5 +++
 src/xenbus/evtchn_fifo.c |  50 +--------------------
 3 files changed, 121 insertions(+), 48 deletions(-)

diff --git a/src/xenbus/evtchn.c b/src/xenbus/evtchn.c
index fa5a980..051ec1f 100644
--- a/src/xenbus/evtchn.c
+++ b/src/xenbus/evtchn.c
@@ -906,6 +906,120 @@ EvtchnInterruptCallback(
     return DoneSomething;
 }
 
+VOID
+EvtchnReset(
+    VOID
+    )
+{
+    ULONGLONG                   Value;
+    XENBUS_EVTCHN_CHANNEL       Store;
+    XENBUS_EVTCHN_CHANNEL       Console;
+    NTSTATUS                    status;
+
+    //
+    // When we reset the event channel ABI we will lose our
+    // binding to the any event channel which was set up
+    // by the toolstack during domain build.
+    // We need to get the binding back, so we must query the
+    // remote domain and port, and then re-bind after the
+    // reset.
+    //
+
+    RtlZeroMemory(&Store, sizeof (Store));
+    RtlZeroMemory(&Console, sizeof (Console));
+
+    status = HvmGetParam(HVM_PARAM_STORE_EVTCHN, &Value);
+    if (NT_SUCCESS(status))
+        Store.LocalPort = (ULONG)Value;
+
+    status = HvmGetParam(HVM_PARAM_CONSOLE_EVTCHN, &Value);
+    if (NT_SUCCESS(status))
+        Console.LocalPort = (ULONG)Value;
+
+    if (Store.LocalPort != 0) {
+        domid_t         RemoteDomain;
+        evtchn_port_t   RemotePort;
+
+        status = EventChannelQueryInterDomain(Store.LocalPort,
+                                              &RemoteDomain,
+                                              &RemotePort);
+        ASSERT(NT_SUCCESS(status));
+
+        Store.Parameters.InterDomain.RemoteDomain = RemoteDomain;
+        Store.Parameters.InterDomain.RemotePort = RemotePort;
+
+        LogPrintf(LOG_LEVEL_INFO, "EVTCHN_RESET: STORE (%u) -> (%u:%u)\n",
+                  Store.LocalPort,
+                  RemoteDomain,
+                  RemotePort);
+    }
+
+    if (Console.LocalPort != 0) {
+        domid_t         RemoteDomain;
+        evtchn_port_t   RemotePort;
+
+        status = EventChannelQueryInterDomain(Console.LocalPort,
+                                              &RemoteDomain,
+                                              &RemotePort);
+        ASSERT(NT_SUCCESS(status));
+
+        Console.Parameters.InterDomain.RemoteDomain = RemoteDomain;
+        Console.Parameters.InterDomain.RemotePort = RemotePort;
+
+        LogPrintf(LOG_LEVEL_INFO, "EVTCHN_RESET: CONSOLE (%u) -> (%u:%u)\n",
+                  Console.LocalPort,
+                  RemoteDomain,
+                  RemotePort);
+    }
+
+    (VOID) EventChannelReset();
+    LogPrintf(LOG_LEVEL_INFO, "EVTCHN_RESET: RESET\n");
+
+    if (Store.LocalPort != 0) {
+        domid_t         RemoteDomain;
+        evtchn_port_t   RemotePort;
+
+        RemoteDomain = Store.Parameters.InterDomain.RemoteDomain;
+        RemotePort = Store.Parameters.InterDomain.RemotePort;
+
+        status = EventChannelBindInterDomain(RemoteDomain,
+                                             RemotePort,
+                                             &Store.LocalPort);
+        ASSERT(NT_SUCCESS(status));
+
+        status = HvmSetParam(HVM_PARAM_STORE_EVTCHN, Store.LocalPort);
+        ASSERT(NT_SUCCESS(status));
+
+        LogPrintf(LOG_LEVEL_INFO, "EVTCHN_RESET: STORE (%u:%u) -> %u\n",
+                  RemoteDomain,
+                  RemotePort,
+                  Store.LocalPort);
+    }
+
+    if (Console.LocalPort != 0) {
+        domid_t         RemoteDomain;
+        evtchn_port_t   RemotePort;
+
+        RemoteDomain = Console.Parameters.InterDomain.RemoteDomain;
+        RemotePort = Console.Parameters.InterDomain.RemotePort;
+
+        status = EventChannelBindInterDomain(RemoteDomain,
+                                             RemotePort,
+                                             &Console.LocalPort);
+        ASSERT(NT_SUCCESS(status));
+
+        status = HvmSetParam(HVM_PARAM_CONSOLE_EVTCHN, Console.LocalPort);
+        ASSERT(NT_SUCCESS(status));
+
+        LogPrintf(LOG_LEVEL_INFO, "EVTCHN_RESET: CONSOLE (%u:%u) -> %u\n",
+                  RemoteDomain,
+                  RemotePort,
+                  Console.LocalPort);
+    }
+}
+
+
+
 static NTSTATUS
 EvtchnAbiAcquire(
     IN  PXENBUS_EVTCHN_CONTEXT  Context
diff --git a/src/xenbus/evtchn.h b/src/xenbus/evtchn.h
index 38a1f39..69b557e 100644
--- a/src/xenbus/evtchn.h
+++ b/src/xenbus/evtchn.h
@@ -59,6 +59,11 @@ EvtchnTeardown(
     IN  PXENBUS_EVTCHN_CONTEXT  Context
     );
 
+VOID
+EvtchnReset(
+    VOID
+    );
+
 extern BOOLEAN
 EvtchnInterrupt(
     IN  PXENBUS_EVTCHN_CONTEXT  Context
diff --git a/src/xenbus/evtchn_fifo.c b/src/xenbus/evtchn_fifo.c
index 5996b82..98ea0fa 100644
--- a/src/xenbus/evtchn_fifo.c
+++ b/src/xenbus/evtchn_fifo.c
@@ -469,52 +469,6 @@ EvtchnFifoPortDisable(
     EvtchnFifoPortMask(_Context, Port);
 }
 
-static VOID
-EvtchnFifoReset(
-    IN  PXENBUS_EVTCHN_FIFO_CONTEXT Context
-    )
-{
-    ULONGLONG                       Value;
-    ULONG                           LocalPort;
-    ULONG                           RemotePort;
-    USHORT                          RemoteDomain;
-    NTSTATUS                        status;
-
-    UNREFERENCED_PARAMETER(Context);
-
-    status = HvmGetParam(HVM_PARAM_STORE_EVTCHN, &Value);
-    ASSERT(NT_SUCCESS(status));
-
-    LocalPort = (LONG)Value;
-
-    //
-    // When we reset the event channel ABI we will lose our
-    // binding to the STORE event channel, which was set up
-    // by the toolstack during domain build.
-    // We need to get the binding back, so we must query the
-    // remote domain and port, and then re-bind after the
-    // reset.
-    //
-
-    status = EventChannelQueryInterDomain(LocalPort,
-                                          &RemoteDomain,
-                                          &RemotePort);
-    ASSERT(NT_SUCCESS(status));
-
-    LogPrintf(LOG_LEVEL_INFO, "EVTCHN_FIFO: RESET\n");
-    (VOID) EventChannelReset();
-
-    status = EventChannelBindInterDomain(RemoteDomain,
-                                         RemotePort,
-                                         &LocalPort);
-    ASSERT(NT_SUCCESS(status));
-
-    Value = LocalPort;
-
-    status = HvmSetParam(HVM_PARAM_STORE_EVTCHN, Value);
-    ASSERT(NT_SUCCESS(status));
-}
-
 static NTSTATUS
 EvtchnFifoAcquire(
     IN  PXENBUS_EVTCHN_ABI_CONTEXT  _Context
@@ -578,7 +532,7 @@ fail2:
 fail1:
     Error("fail1 (%08x)\n", status);
 
-    (VOID) EventChannelReset();
+    EvtchnReset();
 
     while (--Index >= 0) {
         unsigned int    vcpu_id;
@@ -614,7 +568,7 @@ EvtchnFifoRelease(
 
     Trace("====>\n");
 
-    EvtchnFifoReset(Context);
+    EvtchnReset();
 
     EvtchnFifoContract(Context);
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 02 09:36:05 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 02 Jul 2015 09:36:05 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZAaub-0001q4-3P; Thu, 02 Jul 2015 09:36:05 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZAauZ-0001py-KM
	for win-pv-devel@lists.xenproject.org; Thu, 02 Jul 2015 09:36:03 +0000
Received: from [193.109.254.147] by server-13.bemta-14.messagelabs.com id
	0F/73-16813-20605955; Thu, 02 Jul 2015 09:36:02 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1435829739!22488554!1
X-Originating-IP: [209.85.160.172]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29613 invoked from network); 2 Jul 2015 09:35:40 -0000
Received: from mail-yk0-f172.google.com (HELO mail-yk0-f172.google.com)
	(209.85.160.172)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Jul 2015 09:35:40 -0000
Received: by ykdy1 with SMTP id y1so63129159ykd.2
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 02 Jul 2015 02:35:39 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=q9QHjT5hsSGjE/Sg8B1CYqjoBg8NoMTA+mX9iD6uS/8=;
	b=VTv0ab+sloIfkHNR/Av8cHeEyfl091q4wRjWZHBFPbgS1D0rZ2fideE0nzNTugJCUv
	ZMaT7YsQcon0Yxj1HDZYWX4O5bP9bFAyjtzqXOqKpiodinYYORFgrk/zqPLCbH1DWUxp
	lYQMNwoes/Jr+VBioJfaH7C2en+/uwQUkwTRLxj13Dv1nUzrCtMXF4Vs6D2QrV8mzcsq
	8TcE1O7SE3h+URAmGUUEdIJPkhsijSPgbkWQoHOfEMMPqb06vM4PBWp9jegpq2AbvgLj
	ubXw7f7v+Op5tnHpyfc4dtNDzRCLMkFknR4/KCGUmfyvc3omJpS2FNPxDcw6Kjd063xj
	4T2Q==
X-Received: by 10.129.2.139 with SMTP id 133mr31789454ywc.18.1435829739628;
	Thu, 02 Jul 2015 02:35:39 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by mx.google.com with ESMTPSA id w13sm4988890ywd.30.2015.07.02.02.35.36
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 02 Jul 2015 02:35:38 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  2 Jul 2015 10:35:14 +0100
Message-Id: <1435829716-20840-3-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
References: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/4] Dispense with long PDO descriptions
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Windows does not present them well and they are somewhat ugly. The relation-
ship between interface versions and PDO revision is now simply logged.

Also this patch applies appropriate limits to the HardwareIDs and
CompatibleIDs.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/pdo.c | 153 ++++++++++++++-----------------------------------------
 1 file changed, 38 insertions(+), 115 deletions(-)

diff --git a/src/xenbus/pdo.c b/src/xenbus/pdo.c
index 7eb967c..8b86f3b 100644
--- a/src/xenbus/pdo.c
+++ b/src/xenbus/pdo.c
@@ -69,7 +69,6 @@ struct _XENBUS_PDO {
     BOOLEAN                     Ejectable;
 
     PULONG                      Revision;
-    PWCHAR                      *Description;
     ULONG                       Count;
 
     BUS_INTERFACE_STANDARD      BusInterface;
@@ -358,17 +357,7 @@ PdoGetFdo(
 static NTSTATUS
 PdoAddRevision(
     IN  PXENBUS_PDO Pdo,
-    IN  ULONG       Revision,
-    IN  ULONG       Suspend,
-    IN  ULONG       SharedInfo,
-    IN  ULONG       Evtchn,
-    IN  ULONG       Debug,
-    IN  ULONG       Store,
-    IN  ULONG       RangeSet,
-    IN  ULONG       Cache,
-    IN  ULONG       Gnttab,
-    IN  ULONG       Emulated,
-    IN  ULONG       Unplug
+    IN  ULONG       Revision
     )
 {
     PVOID           Buffer;
@@ -393,70 +382,11 @@ PdoAddRevision(
     Pdo->Revision = Buffer;
     Pdo->Revision[Pdo->Count] = Revision;
 
-    Buffer = __PdoAllocate(sizeof (PCHAR) * Count);
-
-    status = STATUS_NO_MEMORY;
-    if (Buffer == NULL)
-        goto fail2;
-
-    if (Pdo->Description != NULL) {
-        RtlCopyMemory(Buffer,
-                      Pdo->Description,
-                      sizeof (PWCHAR) * Pdo->Count);
-        __PdoFree(Pdo->Description);
-    }
-
-    Pdo->Description = Buffer;
-
-    Buffer = __PdoAllocate(MAXTEXTLEN * Count);
-
-    status = STATUS_NO_MEMORY;
-    if (Buffer == NULL)
-        goto fail3;
-
-    status = RtlStringCbPrintfW(Buffer,
-                                MAXTEXTLEN,
-                                L"%hs %hs: "
-                                L"SUSPEND v%u "
-                                L"SHARED_INFO v%u "
-                                L"EVTCHN v%u "
-                                L"DEBUG v%u "
-                                L"STORE v%u "
-                                L"RANGE_SET v%u "
-                                L"CACHE v%u "
-                                L"GNTTAB v%u "
-                                L"EMULATED v%u "
-                                L"UNPLUG v%u",
-                                FdoGetName(__PdoGetFdo(Pdo)),
-                                __PdoGetName(Pdo),
-                                Suspend,
-                                SharedInfo,
-                                Evtchn,
-                                Debug,
-                                Store,
-                                RangeSet,
-                                Cache,
-                                Gnttab,
-                                Emulated,
-                                Unplug);
-    ASSERT(NT_SUCCESS(status));
-
-    Pdo->Description[Pdo->Count] = Buffer;
-
-    Trace("%08x -> %ws\n",
-          Pdo->Revision[Pdo->Count],
-          Pdo->Description[Pdo->Count]);
-
     Pdo->Count++;
+    ASSERT3U(Pdo->Count, <=, 64);
 
     return STATUS_SUCCESS;
 
-fail3:
-    Error("fail3\n");
-
-fail2:
-    Error("fail2\n");
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -521,17 +451,30 @@ PdoSetRevisions(
                                                 Gnttab >= XENBUS_GNTTAB_INTERFACE_VERSION_MIN &&
                                                 Emulated >= XENFILT_EMULATED_INTERFACE_VERSION_MIN &&
                                                 Unplug >= XENFILT_UNPLUG_INTERFACE_VERSION_MIN) {
-                                                status = PdoAddRevision(Pdo, Revision,
-                                                                        Suspend,
-                                                                        SharedInfo,
-                                                                        Evtchn,
-                                                                        Debug,
-                                                                        Store,
-                                                                        RangeSet,
-                                                                        Cache,
-                                                                        Gnttab,
-                                                                        Emulated,
-                                                                        Unplug);
+                                                Info("%08X -> "
+                                                     "SUSPEND v%u "
+                                                     "SHARED_INFO v%u "
+                                                     "EVTCHN v%u "
+                                                     "DEBUG v%u "
+                                                     "STORE v%u "
+                                                     "RANGE_SET v%u "
+                                                     "CACHE v%u "
+                                                     "GNTTAB v%u "
+                                                     "EMULATED v%u\n",
+                                                     "UNPLUG v%u\n",
+                                                     Revision,
+                                                     Suspend,
+                                                     SharedInfo,
+                                                     Evtchn,
+                                                     Debug,
+                                                     Store,
+                                                     RangeSet,
+                                                     Cache,
+                                                     Gnttab,
+                                                     Emulated,
+                                                     Unplug);
+
+                                                status = PdoAddRevision(Pdo, Revision);
                                                 if (!NT_SUCCESS(status))
                                                     goto fail1;
                                             }   
@@ -552,13 +495,6 @@ PdoSetRevisions(
 fail1:
     Error("fail1 (%08x)\n", status);
 
-    if (Pdo->Description != NULL) {
-        while (--Revision > 0)
-            __PdoFree(Pdo->Description[Revision]);
-        __PdoFree(Pdo->Description);
-        Pdo->Description = NULL;
-    }
-
     if (Pdo->Revision != NULL) {
         __PdoFree(Pdo->Revision);
         Pdo->Revision = NULL;
@@ -1369,19 +1305,18 @@ PdoQueryDeviceText(
     Text.Length = 0;
 
     switch (StackLocation->Parameters.QueryDeviceText.DeviceTextType) {
-    case DeviceTextDescription: {
-        ULONG   Index = Pdo->Count - 1;
-
+    case DeviceTextDescription:
         status = RtlStringCbPrintfW(Buffer,
                                     MAXTEXTLEN,
-                                    L"%s",
-                                    Pdo->Description[Index]);
+                                    L"%hs %hs",
+                                    FdoGetName(__PdoGetFdo(Pdo)),
+                                    __PdoGetName(Pdo));
         ASSERT(NT_SUCCESS(status));
 
         Buffer += wcslen(Buffer);
 
         break;
-    }
+
     case DeviceTextLocationInformation:
         status = RtlStringCbPrintfW(Buffer,
                                     MAXTEXTLEN,
@@ -1440,7 +1375,7 @@ PdoWriteConfig(
     return STATUS_NOT_SUPPORTED;
 }
 
-#define MAX_DEVICE_ID_LEN   200
+#define REGSTR_VAL_MAX_HCID_LEN 1024
 
 static NTSTATUS
 PdoQueryId(
@@ -1553,6 +1488,8 @@ PdoQueryId(
         Buffer += wcslen(Buffer);
         Buffer++;
 
+        ASSERT3U((ULONG_PTR)Buffer - (ULONG_PTR)Id.Buffer, <,
+                 REGSTR_VAL_MAX_HCID_LEN);
         break;
     }
     default:
@@ -2144,7 +2081,6 @@ PdoCreate(
     PDEVICE_OBJECT      PhysicalDeviceObject;
     PXENBUS_DX          Dx;
     PXENBUS_PDO         Pdo;
-    ULONG               Index;
     NTSTATUS            status;
 
 #pragma prefast(suppress:28197) // Possibly leaking memory 'PhysicalDeviceObject'
@@ -2204,12 +2140,10 @@ PdoCreate(
     ASSERT(NT_SUCCESS(status));
     ASSERT(Pdo->SuspendInterface.Interface.Context != NULL);
 
-    for (Index = 0; Index < Pdo->Count; Index++) {
-        Info("%p (%s %08X)\n",
-             PhysicalDeviceObject,
-             __PdoGetName(Pdo),
-             Pdo->Revision[Index]);
-    }
+    Info("%p (%s: Highest Revision = %08X)\n",
+         PhysicalDeviceObject,
+         __PdoGetName(Pdo),
+         Pdo->Revision[Pdo->Count - 1]);
 
     Dx->Pdo = Pdo;
     PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
@@ -2221,11 +2155,6 @@ PdoCreate(
 fail6:
     Error("fail6\n");
 
-    for (Index = 0; Index < Pdo->Count; Index++)
-        __PdoFree(Pdo->Description[Index]);
-    __PdoFree(Pdo->Description);
-    Pdo->Description = NULL;
-
     __PdoFree(Pdo->Revision);
     Pdo->Revision = NULL;
     Pdo->Count = 0;
@@ -2274,7 +2203,6 @@ PdoDestroy(
     PXENBUS_DX      Dx = Pdo->Dx;
     PDEVICE_OBJECT  PhysicalDeviceObject = Dx->DeviceObject;
     PXENBUS_FDO     Fdo = __PdoGetFdo(Pdo);
-    ULONG           Index;
 
     ASSERT3U(__PdoGetDevicePnpState(Pdo), ==, Deleted);
 
@@ -2296,11 +2224,6 @@ PdoDestroy(
 
     BusTeardown(&Pdo->BusInterface);
 
-    for (Index = 0; Index < Pdo->Count; Index++)
-        __PdoFree(Pdo->Description[Index]);
-    __PdoFree(Pdo->Description);
-    Pdo->Description = NULL;
-
     __PdoFree(Pdo->Revision);
     Pdo->Revision = NULL;
     Pdo->Count = 0;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 02 09:36:05 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 02 Jul 2015 09:36:05 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZAaub-0001q4-3P; Thu, 02 Jul 2015 09:36:05 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZAauZ-0001py-KM
	for win-pv-devel@lists.xenproject.org; Thu, 02 Jul 2015 09:36:03 +0000
Received: from [193.109.254.147] by server-13.bemta-14.messagelabs.com id
	0F/73-16813-20605955; Thu, 02 Jul 2015 09:36:02 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1435829739!22488554!1
X-Originating-IP: [209.85.160.172]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29613 invoked from network); 2 Jul 2015 09:35:40 -0000
Received: from mail-yk0-f172.google.com (HELO mail-yk0-f172.google.com)
	(209.85.160.172)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Jul 2015 09:35:40 -0000
Received: by ykdy1 with SMTP id y1so63129159ykd.2
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 02 Jul 2015 02:35:39 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=q9QHjT5hsSGjE/Sg8B1CYqjoBg8NoMTA+mX9iD6uS/8=;
	b=VTv0ab+sloIfkHNR/Av8cHeEyfl091q4wRjWZHBFPbgS1D0rZ2fideE0nzNTugJCUv
	ZMaT7YsQcon0Yxj1HDZYWX4O5bP9bFAyjtzqXOqKpiodinYYORFgrk/zqPLCbH1DWUxp
	lYQMNwoes/Jr+VBioJfaH7C2en+/uwQUkwTRLxj13Dv1nUzrCtMXF4Vs6D2QrV8mzcsq
	8TcE1O7SE3h+URAmGUUEdIJPkhsijSPgbkWQoHOfEMMPqb06vM4PBWp9jegpq2AbvgLj
	ubXw7f7v+Op5tnHpyfc4dtNDzRCLMkFknR4/KCGUmfyvc3omJpS2FNPxDcw6Kjd063xj
	4T2Q==
X-Received: by 10.129.2.139 with SMTP id 133mr31789454ywc.18.1435829739628;
	Thu, 02 Jul 2015 02:35:39 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by mx.google.com with ESMTPSA id w13sm4988890ywd.30.2015.07.02.02.35.36
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 02 Jul 2015 02:35:38 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  2 Jul 2015 10:35:14 +0100
Message-Id: <1435829716-20840-3-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
References: <1435829716-20840-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/4] Dispense with long PDO descriptions
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Windows does not present them well and they are somewhat ugly. The relation-
ship between interface versions and PDO revision is now simply logged.

Also this patch applies appropriate limits to the HardwareIDs and
CompatibleIDs.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/pdo.c | 153 ++++++++++++++-----------------------------------------
 1 file changed, 38 insertions(+), 115 deletions(-)

diff --git a/src/xenbus/pdo.c b/src/xenbus/pdo.c
index 7eb967c..8b86f3b 100644
--- a/src/xenbus/pdo.c
+++ b/src/xenbus/pdo.c
@@ -69,7 +69,6 @@ struct _XENBUS_PDO {
     BOOLEAN                     Ejectable;
 
     PULONG                      Revision;
-    PWCHAR                      *Description;
     ULONG                       Count;
 
     BUS_INTERFACE_STANDARD      BusInterface;
@@ -358,17 +357,7 @@ PdoGetFdo(
 static NTSTATUS
 PdoAddRevision(
     IN  PXENBUS_PDO Pdo,
-    IN  ULONG       Revision,
-    IN  ULONG       Suspend,
-    IN  ULONG       SharedInfo,
-    IN  ULONG       Evtchn,
-    IN  ULONG       Debug,
-    IN  ULONG       Store,
-    IN  ULONG       RangeSet,
-    IN  ULONG       Cache,
-    IN  ULONG       Gnttab,
-    IN  ULONG       Emulated,
-    IN  ULONG       Unplug
+    IN  ULONG       Revision
     )
 {
     PVOID           Buffer;
@@ -393,70 +382,11 @@ PdoAddRevision(
     Pdo->Revision = Buffer;
     Pdo->Revision[Pdo->Count] = Revision;
 
-    Buffer = __PdoAllocate(sizeof (PCHAR) * Count);
-
-    status = STATUS_NO_MEMORY;
-    if (Buffer == NULL)
-        goto fail2;
-
-    if (Pdo->Description != NULL) {
-        RtlCopyMemory(Buffer,
-                      Pdo->Description,
-                      sizeof (PWCHAR) * Pdo->Count);
-        __PdoFree(Pdo->Description);
-    }
-
-    Pdo->Description = Buffer;
-
-    Buffer = __PdoAllocate(MAXTEXTLEN * Count);
-
-    status = STATUS_NO_MEMORY;
-    if (Buffer == NULL)
-        goto fail3;
-
-    status = RtlStringCbPrintfW(Buffer,
-                                MAXTEXTLEN,
-                                L"%hs %hs: "
-                                L"SUSPEND v%u "
-                                L"SHARED_INFO v%u "
-                                L"EVTCHN v%u "
-                                L"DEBUG v%u "
-                                L"STORE v%u "
-                                L"RANGE_SET v%u "
-                                L"CACHE v%u "
-                                L"GNTTAB v%u "
-                                L"EMULATED v%u "
-                                L"UNPLUG v%u",
-                                FdoGetName(__PdoGetFdo(Pdo)),
-                                __PdoGetName(Pdo),
-                                Suspend,
-                                SharedInfo,
-                                Evtchn,
-                                Debug,
-                                Store,
-                                RangeSet,
-                                Cache,
-                                Gnttab,
-                                Emulated,
-                                Unplug);
-    ASSERT(NT_SUCCESS(status));
-
-    Pdo->Description[Pdo->Count] = Buffer;
-
-    Trace("%08x -> %ws\n",
-          Pdo->Revision[Pdo->Count],
-          Pdo->Description[Pdo->Count]);
-
     Pdo->Count++;
+    ASSERT3U(Pdo->Count, <=, 64);
 
     return STATUS_SUCCESS;
 
-fail3:
-    Error("fail3\n");
-
-fail2:
-    Error("fail2\n");
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -521,17 +451,30 @@ PdoSetRevisions(
                                                 Gnttab >= XENBUS_GNTTAB_INTERFACE_VERSION_MIN &&
                                                 Emulated >= XENFILT_EMULATED_INTERFACE_VERSION_MIN &&
                                                 Unplug >= XENFILT_UNPLUG_INTERFACE_VERSION_MIN) {
-                                                status = PdoAddRevision(Pdo, Revision,
-                                                                        Suspend,
-                                                                        SharedInfo,
-                                                                        Evtchn,
-                                                                        Debug,
-                                                                        Store,
-                                                                        RangeSet,
-                                                                        Cache,
-                                                                        Gnttab,
-                                                                        Emulated,
-                                                                        Unplug);
+                                                Info("%08X -> "
+                                                     "SUSPEND v%u "
+                                                     "SHARED_INFO v%u "
+                                                     "EVTCHN v%u "
+                                                     "DEBUG v%u "
+                                                     "STORE v%u "
+                                                     "RANGE_SET v%u "
+                                                     "CACHE v%u "
+                                                     "GNTTAB v%u "
+                                                     "EMULATED v%u\n",
+                                                     "UNPLUG v%u\n",
+                                                     Revision,
+                                                     Suspend,
+                                                     SharedInfo,
+                                                     Evtchn,
+                                                     Debug,
+                                                     Store,
+                                                     RangeSet,
+                                                     Cache,
+                                                     Gnttab,
+                                                     Emulated,
+                                                     Unplug);
+
+                                                status = PdoAddRevision(Pdo, Revision);
                                                 if (!NT_SUCCESS(status))
                                                     goto fail1;
                                             }   
@@ -552,13 +495,6 @@ PdoSetRevisions(
 fail1:
     Error("fail1 (%08x)\n", status);
 
-    if (Pdo->Description != NULL) {
-        while (--Revision > 0)
-            __PdoFree(Pdo->Description[Revision]);
-        __PdoFree(Pdo->Description);
-        Pdo->Description = NULL;
-    }
-
     if (Pdo->Revision != NULL) {
         __PdoFree(Pdo->Revision);
         Pdo->Revision = NULL;
@@ -1369,19 +1305,18 @@ PdoQueryDeviceText(
     Text.Length = 0;
 
     switch (StackLocation->Parameters.QueryDeviceText.DeviceTextType) {
-    case DeviceTextDescription: {
-        ULONG   Index = Pdo->Count - 1;
-
+    case DeviceTextDescription:
         status = RtlStringCbPrintfW(Buffer,
                                     MAXTEXTLEN,
-                                    L"%s",
-                                    Pdo->Description[Index]);
+                                    L"%hs %hs",
+                                    FdoGetName(__PdoGetFdo(Pdo)),
+                                    __PdoGetName(Pdo));
         ASSERT(NT_SUCCESS(status));
 
         Buffer += wcslen(Buffer);
 
         break;
-    }
+
     case DeviceTextLocationInformation:
         status = RtlStringCbPrintfW(Buffer,
                                     MAXTEXTLEN,
@@ -1440,7 +1375,7 @@ PdoWriteConfig(
     return STATUS_NOT_SUPPORTED;
 }
 
-#define MAX_DEVICE_ID_LEN   200
+#define REGSTR_VAL_MAX_HCID_LEN 1024
 
 static NTSTATUS
 PdoQueryId(
@@ -1553,6 +1488,8 @@ PdoQueryId(
         Buffer += wcslen(Buffer);
         Buffer++;
 
+        ASSERT3U((ULONG_PTR)Buffer - (ULONG_PTR)Id.Buffer, <,
+                 REGSTR_VAL_MAX_HCID_LEN);
         break;
     }
     default:
@@ -2144,7 +2081,6 @@ PdoCreate(
     PDEVICE_OBJECT      PhysicalDeviceObject;
     PXENBUS_DX          Dx;
     PXENBUS_PDO         Pdo;
-    ULONG               Index;
     NTSTATUS            status;
 
 #pragma prefast(suppress:28197) // Possibly leaking memory 'PhysicalDeviceObject'
@@ -2204,12 +2140,10 @@ PdoCreate(
     ASSERT(NT_SUCCESS(status));
     ASSERT(Pdo->SuspendInterface.Interface.Context != NULL);
 
-    for (Index = 0; Index < Pdo->Count; Index++) {
-        Info("%p (%s %08X)\n",
-             PhysicalDeviceObject,
-             __PdoGetName(Pdo),
-             Pdo->Revision[Index]);
-    }
+    Info("%p (%s: Highest Revision = %08X)\n",
+         PhysicalDeviceObject,
+         __PdoGetName(Pdo),
+         Pdo->Revision[Pdo->Count - 1]);
 
     Dx->Pdo = Pdo;
     PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
@@ -2221,11 +2155,6 @@ PdoCreate(
 fail6:
     Error("fail6\n");
 
-    for (Index = 0; Index < Pdo->Count; Index++)
-        __PdoFree(Pdo->Description[Index]);
-    __PdoFree(Pdo->Description);
-    Pdo->Description = NULL;
-
     __PdoFree(Pdo->Revision);
     Pdo->Revision = NULL;
     Pdo->Count = 0;
@@ -2274,7 +2203,6 @@ PdoDestroy(
     PXENBUS_DX      Dx = Pdo->Dx;
     PDEVICE_OBJECT  PhysicalDeviceObject = Dx->DeviceObject;
     PXENBUS_FDO     Fdo = __PdoGetFdo(Pdo);
-    ULONG           Index;
 
     ASSERT3U(__PdoGetDevicePnpState(Pdo), ==, Deleted);
 
@@ -2296,11 +2224,6 @@ PdoDestroy(
 
     BusTeardown(&Pdo->BusInterface);
 
-    for (Index = 0; Index < Pdo->Count; Index++)
-        __PdoFree(Pdo->Description[Index]);
-    __PdoFree(Pdo->Description);
-    Pdo->Description = NULL;
-
     __PdoFree(Pdo->Revision);
     Pdo->Revision = NULL;
     Pdo->Count = 0;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 02 10:34:59 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 02 Jul 2015 10:34:59 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZAbpa-0005Xy-Mc; Thu, 02 Jul 2015 10:34:58 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZAbpZ-0005Xt-R1
	for win-pv-devel@lists.xenproject.org; Thu, 02 Jul 2015 10:34:58 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	69/EB-17050-1D315955; Thu, 02 Jul 2015 10:34:57 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-31.messagelabs.com!1435833296!21918569!1
X-Originating-IP: [74.125.82.43]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8432 invoked from network); 2 Jul 2015 10:34:56 -0000
Received: from mail-wg0-f43.google.com (HELO mail-wg0-f43.google.com)
	(74.125.82.43)
	by server-12.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Jul 2015 10:34:56 -0000
Received: by wgck11 with SMTP id k11so59433187wgc.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 02 Jul 2015 03:34:56 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=qf/3dHUCOQoxNDSrOspR7uTrMR1WyWFqYizz5/86MWA=;
	b=SBCGl//8x50+MKJ2i1fQ4jBJhs+k+SJ8ajdpknljEGPt0MJj69nM6AvaGxGgxPL4pX
	72wajTjcpT1xVafKiOhPa6bmNToKFOvqptRU2friKsH3bgLMu3I5jstSZPpDIeajy875
	Lnno4MEsQSwUve69CZnq5kFpgZ2a4gIiSN6fLNScCDBTLy2nOpgL1q+pEgcismcLb+Vf
	CM1R1NDBDLirFt2Tr2v+p8b0YYV234+EWwpqGeTrvaVJOwSTK1YpmEAv9u4romLwr2Ay
	ofOtjWH23Sgw4LVjh7Ug3Vk8b/Ue35+vhIK8ZNMkpqv+dZCad72ci5TFQ/q4IUi8w/3r
	GKEg==
X-Received: by 10.180.103.227 with SMTP id fz3mr14792701wib.45.1435833296277; 
	Thu, 02 Jul 2015 03:34:56 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by mx.google.com with ESMTPSA id lk5sm7877393wic.24.2015.07.02.03.34.55
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 02 Jul 2015 03:34:55 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  2 Jul 2015 11:34:43 +0100
Message-Id: <1435833283-24680-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Dispense with long PDO descriptions
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Windows does not present them well and they are somewhat ugly. The relation-
ship between interface versions and PDO revision is now simply logged.

Also this patch applies appropriate limits to the HardwareIDs and
CompatibleIDs.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/pdo.c | 105 +++++++++++++------------------------------------------
 1 file changed, 25 insertions(+), 80 deletions(-)

diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 5b6e085..61ab4ca 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -75,7 +75,6 @@ struct _XENVIF_PDO {
     UNICODE_STRING              ContainerID;
 
     PULONG                      Revision;
-    PWCHAR                      *Description;
     ULONG                       Count;
 
     NET_LUID                    Luid;
@@ -531,8 +530,7 @@ fail1:
 static NTSTATUS
 PdoAddRevision(
     IN  PXENVIF_PDO Pdo,
-    IN  ULONG       Revision,
-    IN  ULONG       Vif
+    IN  ULONG       Revision
     )
 {
     PVOID           Buffer;
@@ -557,52 +555,11 @@ PdoAddRevision(
     Pdo->Revision = Buffer;
     Pdo->Revision[Pdo->Count] = Revision;
 
-    Buffer = __PdoAllocate(sizeof (PCHAR) * Count);
-
-    status = STATUS_NO_MEMORY;
-    if (Buffer == NULL)
-        goto fail2;
-
-    if (Pdo->Description != NULL) {
-        RtlCopyMemory(Buffer,
-                      Pdo->Description,
-                      sizeof (PWCHAR) * Pdo->Count);
-        __PdoFree(Pdo->Description);
-    }
-
-    Pdo->Description = Buffer;
-
-    Buffer = __PdoAllocate(MAXTEXTLEN * Count);
-
-    status = STATUS_NO_MEMORY;
-    if (Buffer == NULL)
-        goto fail3;
-
-    status = RtlStringCbPrintfW(Buffer,
-                                MAXTEXTLEN,
-                                L"%hs %hs: "
-                                L"VIF v%u",
-                                FdoGetName(__PdoGetFdo(Pdo)),
-                                __PdoGetName(Pdo),
-                                Vif);
-    ASSERT(NT_SUCCESS(status));
-
-    Pdo->Description[Pdo->Count] = Buffer;
-
-    Trace("%08x -> %ws\n",
-          Pdo->Revision[Pdo->Count],
-          Pdo->Description[Pdo->Count]);
-
     Pdo->Count++;
+    ASSERT3U(Pdo->Count, <=, 64);
 
     return STATUS_SUCCESS;
 
-fail3:
-    Error("fail3\n");
-
-fail2:
-    Error("fail2\n");
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -633,10 +590,16 @@ PdoSetRevisions(
         for (Vif = 1; Vif <= XENVIF_VIF_INTERFACE_VERSION_MAX; Vif++) {
             Revision++;
 
-            if (Vif >= XENVIF_VIF_INTERFACE_VERSION_MIN &&
-                Cache >= XENBUS_CACHE_INTERFACE_VERSION_MIN) {
-                status = PdoAddRevision(Pdo, Revision,
-                                        Vif);
+            if (Cache >= XENBUS_CACHE_INTERFACE_VERSION_MIN &&
+                Vif >= XENVIF_VIF_INTERFACE_VERSION_MIN) {
+                Info("%08X -> "
+                     "CACHE v%u "
+                     "VIF v%u\n",
+                     Revision,
+                     Cache,
+                     Vif);
+
+                status = PdoAddRevision(Pdo, Revision);
                 if (!NT_SUCCESS(status))
                     goto fail1;
             }
@@ -649,13 +612,6 @@ PdoSetRevisions(
 fail1:
     Error("fail1 (%08x)\n", status);
 
-    if (Pdo->Description != NULL) {
-        while (--Revision > 0)
-            __PdoFree(Pdo->Description[Revision]);
-        __PdoFree(Pdo->Description);
-        Pdo->Description = NULL;
-    }
-
     if (Pdo->Revision != NULL) {
         __PdoFree(Pdo->Revision);
         Pdo->Revision = NULL;
@@ -1774,19 +1730,18 @@ PdoQueryDeviceText(
     Text.Length = 0;
 
     switch (StackLocation->Parameters.QueryDeviceText.DeviceTextType) {
-    case DeviceTextDescription: {
-        ULONG   Index = Pdo->Count - 1;
-
+    case DeviceTextDescription:
         status = RtlStringCbPrintfW(Buffer,
                                     MAXTEXTLEN,
-                                    L"%s",
-                                    Pdo->Description[Index]);
+                                    L"%hs %hs",
+                                    FdoGetName(__PdoGetFdo(Pdo)),
+                                    __PdoGetName(Pdo));
         ASSERT(NT_SUCCESS(status));
 
         Buffer += wcslen(Buffer);
 
         break;
-    }
+
     case DeviceTextLocationInformation:
         status = RtlStringCbPrintfW(Buffer,
                                     MAXTEXTLEN,
@@ -1847,6 +1802,8 @@ PdoWriteConfig(
     return STATUS_NOT_SUPPORTED;
 }
 
+#define REGSTR_VAL_MAX_HCID_LEN 1024
+
 static DECLSPEC_NOINLINE NTSTATUS
 PdoQueryId(
     IN  PXENVIF_PDO     Pdo,
@@ -1978,6 +1935,8 @@ PdoQueryId(
         Buffer += wcslen(Buffer);
         Buffer++;
 
+        ASSERT3U((ULONG_PTR)Buffer - (ULONG_PTR)Id.Buffer, <,
+                 REGSTR_VAL_MAX_HCID_LEN);
         break;
     }
     default:
@@ -2569,7 +2528,6 @@ PdoCreate(
     PDEVICE_OBJECT      PhysicalDeviceObject;
     PXENVIF_DX          Dx;
     PXENVIF_PDO         Pdo;
-    ULONG               Index;
     NTSTATUS            status;
 
 #pragma prefast(suppress:28197) // Possibly leaking memory 'PhysicalDeviceObject'
@@ -2647,12 +2605,10 @@ PdoCreate(
     if (__PdoIsEjectRequested(Pdo))
         goto fail12;
 
-    for (Index = 0; Index < Pdo->Count; Index++) {
-        Info("%p (%s %08X)\n",
-             PhysicalDeviceObject,
-             __PdoGetName(Pdo),
-             Pdo->Revision[Index]);
-    }
+    Info("%p (%s: Highest Revision = %08X)\n",
+         PhysicalDeviceObject,
+         __PdoGetName(Pdo),
+         Pdo->Revision[Pdo->Count - 1]);
 
     PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
     return STATUS_SUCCESS;
@@ -2689,11 +2645,6 @@ fail9:
 fail8:
     Error("fail8\n");
 
-    for (Index = 0; Index < Pdo->Count; Index++)
-        __PdoFree(Pdo->Description[Index]);
-    __PdoFree(Pdo->Description);
-    Pdo->Description = NULL;
-
     __PdoFree(Pdo->Revision);
     Pdo->Revision = NULL;
     Pdo->Count = 0;
@@ -2751,7 +2702,6 @@ PdoDestroy(
     PXENVIF_DX      Dx = Pdo->Dx;
     PDEVICE_OBJECT  PhysicalDeviceObject = Dx->DeviceObject;
     PXENVIF_FDO     Fdo = __PdoGetFdo(Pdo);
-    ULONG           Index;
 
     ASSERT3U(__PdoGetDevicePnpState(Pdo), ==, Deleted);
 
@@ -2782,11 +2732,6 @@ PdoDestroy(
 
     BusTeardown(&Pdo->BusInterface);
 
-    for (Index = 0; Index < Pdo->Count; Index++)
-        __PdoFree(Pdo->Description[Index]);
-    __PdoFree(Pdo->Description);
-    Pdo->Description = NULL;
-
     __PdoFree(Pdo->Revision);
     Pdo->Revision = NULL;
     Pdo->Count = 0;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 02 10:34:59 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 02 Jul 2015 10:34:59 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZAbpa-0005Xy-Mc; Thu, 02 Jul 2015 10:34:58 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZAbpZ-0005Xt-R1
	for win-pv-devel@lists.xenproject.org; Thu, 02 Jul 2015 10:34:58 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	69/EB-17050-1D315955; Thu, 02 Jul 2015 10:34:57 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-31.messagelabs.com!1435833296!21918569!1
X-Originating-IP: [74.125.82.43]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8432 invoked from network); 2 Jul 2015 10:34:56 -0000
Received: from mail-wg0-f43.google.com (HELO mail-wg0-f43.google.com)
	(74.125.82.43)
	by server-12.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Jul 2015 10:34:56 -0000
Received: by wgck11 with SMTP id k11so59433187wgc.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 02 Jul 2015 03:34:56 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=qf/3dHUCOQoxNDSrOspR7uTrMR1WyWFqYizz5/86MWA=;
	b=SBCGl//8x50+MKJ2i1fQ4jBJhs+k+SJ8ajdpknljEGPt0MJj69nM6AvaGxGgxPL4pX
	72wajTjcpT1xVafKiOhPa6bmNToKFOvqptRU2friKsH3bgLMu3I5jstSZPpDIeajy875
	Lnno4MEsQSwUve69CZnq5kFpgZ2a4gIiSN6fLNScCDBTLy2nOpgL1q+pEgcismcLb+Vf
	CM1R1NDBDLirFt2Tr2v+p8b0YYV234+EWwpqGeTrvaVJOwSTK1YpmEAv9u4romLwr2Ay
	ofOtjWH23Sgw4LVjh7Ug3Vk8b/Ue35+vhIK8ZNMkpqv+dZCad72ci5TFQ/q4IUi8w/3r
	GKEg==
X-Received: by 10.180.103.227 with SMTP id fz3mr14792701wib.45.1435833296277; 
	Thu, 02 Jul 2015 03:34:56 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by mx.google.com with ESMTPSA id lk5sm7877393wic.24.2015.07.02.03.34.55
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 02 Jul 2015 03:34:55 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  2 Jul 2015 11:34:43 +0100
Message-Id: <1435833283-24680-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Dispense with long PDO descriptions
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Windows does not present them well and they are somewhat ugly. The relation-
ship between interface versions and PDO revision is now simply logged.

Also this patch applies appropriate limits to the HardwareIDs and
CompatibleIDs.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/pdo.c | 105 +++++++++++++------------------------------------------
 1 file changed, 25 insertions(+), 80 deletions(-)

diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 5b6e085..61ab4ca 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -75,7 +75,6 @@ struct _XENVIF_PDO {
     UNICODE_STRING              ContainerID;
 
     PULONG                      Revision;
-    PWCHAR                      *Description;
     ULONG                       Count;
 
     NET_LUID                    Luid;
@@ -531,8 +530,7 @@ fail1:
 static NTSTATUS
 PdoAddRevision(
     IN  PXENVIF_PDO Pdo,
-    IN  ULONG       Revision,
-    IN  ULONG       Vif
+    IN  ULONG       Revision
     )
 {
     PVOID           Buffer;
@@ -557,52 +555,11 @@ PdoAddRevision(
     Pdo->Revision = Buffer;
     Pdo->Revision[Pdo->Count] = Revision;
 
-    Buffer = __PdoAllocate(sizeof (PCHAR) * Count);
-
-    status = STATUS_NO_MEMORY;
-    if (Buffer == NULL)
-        goto fail2;
-
-    if (Pdo->Description != NULL) {
-        RtlCopyMemory(Buffer,
-                      Pdo->Description,
-                      sizeof (PWCHAR) * Pdo->Count);
-        __PdoFree(Pdo->Description);
-    }
-
-    Pdo->Description = Buffer;
-
-    Buffer = __PdoAllocate(MAXTEXTLEN * Count);
-
-    status = STATUS_NO_MEMORY;
-    if (Buffer == NULL)
-        goto fail3;
-
-    status = RtlStringCbPrintfW(Buffer,
-                                MAXTEXTLEN,
-                                L"%hs %hs: "
-                                L"VIF v%u",
-                                FdoGetName(__PdoGetFdo(Pdo)),
-                                __PdoGetName(Pdo),
-                                Vif);
-    ASSERT(NT_SUCCESS(status));
-
-    Pdo->Description[Pdo->Count] = Buffer;
-
-    Trace("%08x -> %ws\n",
-          Pdo->Revision[Pdo->Count],
-          Pdo->Description[Pdo->Count]);
-
     Pdo->Count++;
+    ASSERT3U(Pdo->Count, <=, 64);
 
     return STATUS_SUCCESS;
 
-fail3:
-    Error("fail3\n");
-
-fail2:
-    Error("fail2\n");
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -633,10 +590,16 @@ PdoSetRevisions(
         for (Vif = 1; Vif <= XENVIF_VIF_INTERFACE_VERSION_MAX; Vif++) {
             Revision++;
 
-            if (Vif >= XENVIF_VIF_INTERFACE_VERSION_MIN &&
-                Cache >= XENBUS_CACHE_INTERFACE_VERSION_MIN) {
-                status = PdoAddRevision(Pdo, Revision,
-                                        Vif);
+            if (Cache >= XENBUS_CACHE_INTERFACE_VERSION_MIN &&
+                Vif >= XENVIF_VIF_INTERFACE_VERSION_MIN) {
+                Info("%08X -> "
+                     "CACHE v%u "
+                     "VIF v%u\n",
+                     Revision,
+                     Cache,
+                     Vif);
+
+                status = PdoAddRevision(Pdo, Revision);
                 if (!NT_SUCCESS(status))
                     goto fail1;
             }
@@ -649,13 +612,6 @@ PdoSetRevisions(
 fail1:
     Error("fail1 (%08x)\n", status);
 
-    if (Pdo->Description != NULL) {
-        while (--Revision > 0)
-            __PdoFree(Pdo->Description[Revision]);
-        __PdoFree(Pdo->Description);
-        Pdo->Description = NULL;
-    }
-
     if (Pdo->Revision != NULL) {
         __PdoFree(Pdo->Revision);
         Pdo->Revision = NULL;
@@ -1774,19 +1730,18 @@ PdoQueryDeviceText(
     Text.Length = 0;
 
     switch (StackLocation->Parameters.QueryDeviceText.DeviceTextType) {
-    case DeviceTextDescription: {
-        ULONG   Index = Pdo->Count - 1;
-
+    case DeviceTextDescription:
         status = RtlStringCbPrintfW(Buffer,
                                     MAXTEXTLEN,
-                                    L"%s",
-                                    Pdo->Description[Index]);
+                                    L"%hs %hs",
+                                    FdoGetName(__PdoGetFdo(Pdo)),
+                                    __PdoGetName(Pdo));
         ASSERT(NT_SUCCESS(status));
 
         Buffer += wcslen(Buffer);
 
         break;
-    }
+
     case DeviceTextLocationInformation:
         status = RtlStringCbPrintfW(Buffer,
                                     MAXTEXTLEN,
@@ -1847,6 +1802,8 @@ PdoWriteConfig(
     return STATUS_NOT_SUPPORTED;
 }
 
+#define REGSTR_VAL_MAX_HCID_LEN 1024
+
 static DECLSPEC_NOINLINE NTSTATUS
 PdoQueryId(
     IN  PXENVIF_PDO     Pdo,
@@ -1978,6 +1935,8 @@ PdoQueryId(
         Buffer += wcslen(Buffer);
         Buffer++;
 
+        ASSERT3U((ULONG_PTR)Buffer - (ULONG_PTR)Id.Buffer, <,
+                 REGSTR_VAL_MAX_HCID_LEN);
         break;
     }
     default:
@@ -2569,7 +2528,6 @@ PdoCreate(
     PDEVICE_OBJECT      PhysicalDeviceObject;
     PXENVIF_DX          Dx;
     PXENVIF_PDO         Pdo;
-    ULONG               Index;
     NTSTATUS            status;
 
 #pragma prefast(suppress:28197) // Possibly leaking memory 'PhysicalDeviceObject'
@@ -2647,12 +2605,10 @@ PdoCreate(
     if (__PdoIsEjectRequested(Pdo))
         goto fail12;
 
-    for (Index = 0; Index < Pdo->Count; Index++) {
-        Info("%p (%s %08X)\n",
-             PhysicalDeviceObject,
-             __PdoGetName(Pdo),
-             Pdo->Revision[Index]);
-    }
+    Info("%p (%s: Highest Revision = %08X)\n",
+         PhysicalDeviceObject,
+         __PdoGetName(Pdo),
+         Pdo->Revision[Pdo->Count - 1]);
 
     PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
     return STATUS_SUCCESS;
@@ -2689,11 +2645,6 @@ fail9:
 fail8:
     Error("fail8\n");
 
-    for (Index = 0; Index < Pdo->Count; Index++)
-        __PdoFree(Pdo->Description[Index]);
-    __PdoFree(Pdo->Description);
-    Pdo->Description = NULL;
-
     __PdoFree(Pdo->Revision);
     Pdo->Revision = NULL;
     Pdo->Count = 0;
@@ -2751,7 +2702,6 @@ PdoDestroy(
     PXENVIF_DX      Dx = Pdo->Dx;
     PDEVICE_OBJECT  PhysicalDeviceObject = Dx->DeviceObject;
     PXENVIF_FDO     Fdo = __PdoGetFdo(Pdo);
-    ULONG           Index;
 
     ASSERT3U(__PdoGetDevicePnpState(Pdo), ==, Deleted);
 
@@ -2782,11 +2732,6 @@ PdoDestroy(
 
     BusTeardown(&Pdo->BusInterface);
 
-    for (Index = 0; Index < Pdo->Count; Index++)
-        __PdoFree(Pdo->Description[Index]);
-    __PdoFree(Pdo->Description);
-    Pdo->Description = NULL;
-
     __PdoFree(Pdo->Revision);
     Pdo->Revision = NULL;
     Pdo->Count = 0;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 02 10:35:31 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 02 Jul 2015 10:35:31 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZAbq7-0005ZM-Os; Thu, 02 Jul 2015 10:35:31 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZAbq6-0005ZD-DM
	for win-pv-devel@lists.xenproject.org; Thu, 02 Jul 2015 10:35:30 +0000
Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id
	7B/E8-19215-1F315955; Thu, 02 Jul 2015 10:35:29 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-5.tower-206.messagelabs.com!1435833329!18418981!1
X-Originating-IP: [74.125.82.49]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14898 invoked from network); 2 Jul 2015 10:35:29 -0000
Received: from mail-wg0-f49.google.com (HELO mail-wg0-f49.google.com)
	(74.125.82.49)
	by server-5.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Jul 2015 10:35:29 -0000
Received: by wgqq4 with SMTP id q4so59353500wgq.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 02 Jul 2015 03:35:28 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=zX8VN2ZaZ+EdhGKOLVt/JmaT5XqWGdOx95duWUMh66w=;
	b=vJiCmlavDCX2LLicl7bMi/IN3Gtvnu9CNUxknC8z/5GC1AX8l/+fWjfftx2PI5cXMs
	PVHwdzNqCavTcMohJckZnHmpHAkEE4whCwgMY2UIqRseIk0lH8NHq95kK/P0wZrmYr9O
	kqPqaVY8MIiOp09IYIApGxfuvunlyu5bpHGKHkepydbLS4HX/J2y5JEzusTSOONwajy+
	8UsitzBFeYco8UJyhbfbrR0NPDCE3y9A4X7+I2lGDdMz1XDwcpJwnaAn5qqGc4+tXxIi
	0eF3Z2U78BNCLZvrJVV1zw8KWZjimOlkZm6DKa82k4M8oN+WSYXmm9QFAhiXm87mLFYo
	PFfA==
X-Received: by 10.194.205.101 with SMTP id lf5mr61817000wjc.37.1435833328826; 
	Thu, 02 Jul 2015 03:35:28 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by mx.google.com with ESMTPSA id q4sm7398892wju.14.2015.07.02.03.35.28
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 02 Jul 2015 03:35:28 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  2 Jul 2015 11:35:19 +0100
Message-Id: <1435833319-25940-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove erroneous use of transmitter DPC
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

If the backend does not support split event channels then the transmitter
DPC should not be used, and it contains an assertion to that effect.
The ring enable function, however, unconditionally queues the DPC leading
to an assertion failure. This patch makes sure the DPC is only queued if
the backend does indeed support split event channels.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/transmitter.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 1a3e26f..b833ab6 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -2683,11 +2683,10 @@ TransmitterRingDpc(
     ASSERT(Ring != NULL);
 
     Transmitter = Ring->Transmitter;
+    ASSERT(Transmitter->Split);
 
-    if (Ring->Enabled) {
-        ASSERT(Transmitter->Split);
+    if (Ring->Enabled)
         __TransmitterRingNotify(Ring);
-    }
 
     __TransmitterRingUnmask(Ring);
 }
@@ -2696,16 +2695,20 @@ KSERVICE_ROUTINE    TransmitterRingEvtchnCallback;
 
 BOOLEAN
 TransmitterRingEvtchnCallback(
-    IN  PKINTERRUPT         InterruptObject,
-    IN  PVOID               Argument
+    IN  PKINTERRUPT             InterruptObject,
+    IN  PVOID                   Argument
     )
 {
     PXENVIF_TRANSMITTER_RING    Ring = Argument;
+    PXENVIF_TRANSMITTER         Transmitter;
 
     UNREFERENCED_PARAMETER(InterruptObject);
 
     ASSERT(Ring != NULL);
 
+    Transmitter = Ring->Transmitter;
+    ASSERT(Transmitter->Split);
+
     Ring->Events++;
 
     if (KeInsertQueueDpc(&Ring->Dpc, NULL, NULL))
@@ -3256,12 +3259,17 @@ __TransmitterRingEnable(
     IN  PXENVIF_TRANSMITTER_RING    Ring
     )
 {
+    PXENVIF_TRANSMITTER             Transmitter;
+
+    Transmitter = Ring->Transmitter;
+
     __TransmitterRingAcquireLock(Ring);
 
     ASSERT(!Ring->Enabled);
     Ring->Enabled = TRUE;
 
-    if (KeInsertQueueDpc(&Ring->Dpc, NULL, NULL))
+    if (Transmitter->Split &&
+        KeInsertQueueDpc(&Ring->Dpc, NULL, NULL))
         Ring->Dpcs++;
 
     __TransmitterRingReleaseLock(Ring);
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 02 10:35:31 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 02 Jul 2015 10:35:31 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZAbq7-0005ZM-Os; Thu, 02 Jul 2015 10:35:31 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZAbq6-0005ZD-DM
	for win-pv-devel@lists.xenproject.org; Thu, 02 Jul 2015 10:35:30 +0000
Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id
	7B/E8-19215-1F315955; Thu, 02 Jul 2015 10:35:29 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-5.tower-206.messagelabs.com!1435833329!18418981!1
X-Originating-IP: [74.125.82.49]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14898 invoked from network); 2 Jul 2015 10:35:29 -0000
Received: from mail-wg0-f49.google.com (HELO mail-wg0-f49.google.com)
	(74.125.82.49)
	by server-5.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Jul 2015 10:35:29 -0000
Received: by wgqq4 with SMTP id q4so59353500wgq.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 02 Jul 2015 03:35:28 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=zX8VN2ZaZ+EdhGKOLVt/JmaT5XqWGdOx95duWUMh66w=;
	b=vJiCmlavDCX2LLicl7bMi/IN3Gtvnu9CNUxknC8z/5GC1AX8l/+fWjfftx2PI5cXMs
	PVHwdzNqCavTcMohJckZnHmpHAkEE4whCwgMY2UIqRseIk0lH8NHq95kK/P0wZrmYr9O
	kqPqaVY8MIiOp09IYIApGxfuvunlyu5bpHGKHkepydbLS4HX/J2y5JEzusTSOONwajy+
	8UsitzBFeYco8UJyhbfbrR0NPDCE3y9A4X7+I2lGDdMz1XDwcpJwnaAn5qqGc4+tXxIi
	0eF3Z2U78BNCLZvrJVV1zw8KWZjimOlkZm6DKa82k4M8oN+WSYXmm9QFAhiXm87mLFYo
	PFfA==
X-Received: by 10.194.205.101 with SMTP id lf5mr61817000wjc.37.1435833328826; 
	Thu, 02 Jul 2015 03:35:28 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by mx.google.com with ESMTPSA id q4sm7398892wju.14.2015.07.02.03.35.28
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 02 Jul 2015 03:35:28 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  2 Jul 2015 11:35:19 +0100
Message-Id: <1435833319-25940-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove erroneous use of transmitter DPC
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

If the backend does not support split event channels then the transmitter
DPC should not be used, and it contains an assertion to that effect.
The ring enable function, however, unconditionally queues the DPC leading
to an assertion failure. This patch makes sure the DPC is only queued if
the backend does indeed support split event channels.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/transmitter.c | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 1a3e26f..b833ab6 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -2683,11 +2683,10 @@ TransmitterRingDpc(
     ASSERT(Ring != NULL);
 
     Transmitter = Ring->Transmitter;
+    ASSERT(Transmitter->Split);
 
-    if (Ring->Enabled) {
-        ASSERT(Transmitter->Split);
+    if (Ring->Enabled)
         __TransmitterRingNotify(Ring);
-    }
 
     __TransmitterRingUnmask(Ring);
 }
@@ -2696,16 +2695,20 @@ KSERVICE_ROUTINE    TransmitterRingEvtchnCallback;
 
 BOOLEAN
 TransmitterRingEvtchnCallback(
-    IN  PKINTERRUPT         InterruptObject,
-    IN  PVOID               Argument
+    IN  PKINTERRUPT             InterruptObject,
+    IN  PVOID                   Argument
     )
 {
     PXENVIF_TRANSMITTER_RING    Ring = Argument;
+    PXENVIF_TRANSMITTER         Transmitter;
 
     UNREFERENCED_PARAMETER(InterruptObject);
 
     ASSERT(Ring != NULL);
 
+    Transmitter = Ring->Transmitter;
+    ASSERT(Transmitter->Split);
+
     Ring->Events++;
 
     if (KeInsertQueueDpc(&Ring->Dpc, NULL, NULL))
@@ -3256,12 +3259,17 @@ __TransmitterRingEnable(
     IN  PXENVIF_TRANSMITTER_RING    Ring
     )
 {
+    PXENVIF_TRANSMITTER             Transmitter;
+
+    Transmitter = Ring->Transmitter;
+
     __TransmitterRingAcquireLock(Ring);
 
     ASSERT(!Ring->Enabled);
     Ring->Enabled = TRUE;
 
-    if (KeInsertQueueDpc(&Ring->Dpc, NULL, NULL))
+    if (Transmitter->Split &&
+        KeInsertQueueDpc(&Ring->Dpc, NULL, NULL))
         Ring->Dpcs++;
 
     __TransmitterRingReleaseLock(Ring);
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 06 09:40:34 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 06 Jul 2015 09:40:34 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZC2t7-0007iR-MK; Mon, 06 Jul 2015 09:40:33 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=62259d77b=Paul.Durrant@citrix.com>)
	id 1ZC2t6-0007iK-FL
	for win-pv-devel@lists.xenproject.org; Mon, 06 Jul 2015 09:40:32 +0000
Received: from [85.158.137.68] by server-12.bemta-3.messagelabs.com id
	85/46-02952-F0D4A955; Mon, 06 Jul 2015 09:40:31 +0000
X-Env-Sender: prvs=62259d77b=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-31.messagelabs.com!1436175631!22846993!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17566 invoked from network); 6 Jul 2015 09:40:31 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-15.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Jul 2015 09:40:31 -0000
X-IronPort-AV: E=Sophos;i="5.15,414,1432598400"; 
   d="scan'208";a="1188337"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: PDO revision numbers
Thread-Index: AdC3zsM/ZHRSUM1wTNy4eC0Hh1Tb7A==
Date: Mon, 6 Jul 2015 09:40:30 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02598A892@AMSPEX01CL02.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: [win-pv-devel] PDO revision numbers
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Hi,

  In testing, it has become apparent that there is a PDO namespace clash between the Xen Project PV drivers and their immediate ancestor; the XenServer 7.x PV drivers. To avoid this I propose to change the PDO revision scheme slightly:

The upper byte (i.e. first to appear a textual representation) of the PDO revision will encode the major version number of the bus driver that creates it.

This means, of course, that moving to a new driver major number will immediately invalidate any child driver binding, but I imagine that's almost certainly something that changing the driver major number *should* do.

If anyone has any issues with this then please shout.

  Paul



_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 06 09:40:34 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 06 Jul 2015 09:40:34 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZC2t7-0007iR-MK; Mon, 06 Jul 2015 09:40:33 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=62259d77b=Paul.Durrant@citrix.com>)
	id 1ZC2t6-0007iK-FL
	for win-pv-devel@lists.xenproject.org; Mon, 06 Jul 2015 09:40:32 +0000
Received: from [85.158.137.68] by server-12.bemta-3.messagelabs.com id
	85/46-02952-F0D4A955; Mon, 06 Jul 2015 09:40:31 +0000
X-Env-Sender: prvs=62259d77b=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-31.messagelabs.com!1436175631!22846993!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17566 invoked from network); 6 Jul 2015 09:40:31 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-15.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Jul 2015 09:40:31 -0000
X-IronPort-AV: E=Sophos;i="5.15,414,1432598400"; 
   d="scan'208";a="1188337"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: PDO revision numbers
Thread-Index: AdC3zsM/ZHRSUM1wTNy4eC0Hh1Tb7A==
Date: Mon, 6 Jul 2015 09:40:30 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02598A892@AMSPEX01CL02.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: [win-pv-devel] PDO revision numbers
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Hi,

  In testing, it has become apparent that there is a PDO namespace clash between the Xen Project PV drivers and their immediate ancestor; the XenServer 7.x PV drivers. To avoid this I propose to change the PDO revision scheme slightly:

The upper byte (i.e. first to appear a textual representation) of the PDO revision will encode the major version number of the bus driver that creates it.

This means, of course, that moving to a new driver major number will immediately invalidate any child driver binding, but I imagine that's almost certainly something that changing the driver major number *should* do.

If anyone has any issues with this then please shout.

  Paul



_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:36 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:36 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUm-0004ne-0c; Wed, 08 Jul 2015 12:30:36 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUk-0004nU-7C
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:34 +0000
Received: from [193.109.254.147] by server-13.bemta-14.messagelabs.com id
	2E/E9-16813-9E71D955; Wed, 08 Jul 2015 12:30:33 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1436358632!30320053!1
X-Originating-IP: [209.85.212.176]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1574 invoked from network); 8 Jul 2015 12:30:32 -0000
Received: from mail-wi0-f176.google.com (HELO mail-wi0-f176.google.com)
	(209.85.212.176)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:32 -0000
Received: by wibdq8 with SMTP id dq8so211209579wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:32 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=jf/zfRMHfk2xjptNHgAS0iJ8khbbJ7098bMH7WQraRQ=;
	b=XXmmICOu2hi+ZVSv43YBRXx7IDrrBFua/+YHCKkAs7CySAd8r8DFWo+KFCVP7eMlFA
	4vu28aUzyTrq0kR0KWvBcvgZZnPd1u7lvIs6/0YpcM4G/5uuJYqjP251K8ET0my0bFZk
	aUhurN2DIaLYyyQ5KPgRgM8M03vWnqvsIQ3n8Ai5sjBeRjiGnhb9VmOD1K8lWiz9uhi4
	UKoU/FrXfWS49pVX+tcE3+6/oZkiepPrtqcLzw6DZqkZwODz3L5vrFL2fM2tNd85z+0v
	gJkd17wDZF1U0sVJxss/6Tp6wJ/uvhjbBRnuybTUi3anhvjamUxd9hQsMI1RoGMy2I3N
	BsWQ==
X-Received: by 10.180.76.202 with SMTP id m10mr35278859wiw.63.1436358632521;
	Wed, 08 Jul 2015 05:30:32 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.31
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:32 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:10 +0100
Message-Id: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 0/8] Add code to copy network settings
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Because the way that the network stack is bound has changed in Windows 10,
the code in XENNET's co-installer can no longer copy network settings
from an aliasing emulated device to the PV device.

This patch series adds a new implementation directly into the XENVIF driver.

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:36 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:36 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUm-0004ne-0c; Wed, 08 Jul 2015 12:30:36 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUk-0004nU-7C
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:34 +0000
Received: from [193.109.254.147] by server-13.bemta-14.messagelabs.com id
	2E/E9-16813-9E71D955; Wed, 08 Jul 2015 12:30:33 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1436358632!30320053!1
X-Originating-IP: [209.85.212.176]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1574 invoked from network); 8 Jul 2015 12:30:32 -0000
Received: from mail-wi0-f176.google.com (HELO mail-wi0-f176.google.com)
	(209.85.212.176)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:32 -0000
Received: by wibdq8 with SMTP id dq8so211209579wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:32 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=jf/zfRMHfk2xjptNHgAS0iJ8khbbJ7098bMH7WQraRQ=;
	b=XXmmICOu2hi+ZVSv43YBRXx7IDrrBFua/+YHCKkAs7CySAd8r8DFWo+KFCVP7eMlFA
	4vu28aUzyTrq0kR0KWvBcvgZZnPd1u7lvIs6/0YpcM4G/5uuJYqjP251K8ET0my0bFZk
	aUhurN2DIaLYyyQ5KPgRgM8M03vWnqvsIQ3n8Ai5sjBeRjiGnhb9VmOD1K8lWiz9uhi4
	UKoU/FrXfWS49pVX+tcE3+6/oZkiepPrtqcLzw6DZqkZwODz3L5vrFL2fM2tNd85z+0v
	gJkd17wDZF1U0sVJxss/6Tp6wJ/uvhjbBRnuybTUi3anhvjamUxd9hQsMI1RoGMy2I3N
	BsWQ==
X-Received: by 10.180.76.202 with SMTP id m10mr35278859wiw.63.1436358632521;
	Wed, 08 Jul 2015 05:30:32 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.31
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:32 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:10 +0100
Message-Id: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 0/8] Add code to copy network settings
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Because the way that the network stack is bound has changed in Windows 10,
the code in XENNET's co-installer can no longer copy network settings
from an aliasing emulated device to the PV device.

This patch series adds a new implementation directly into the XENVIF driver.

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:37 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:37 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUn-0004o1-1g; Wed, 08 Jul 2015 12:30:37 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUl-0004nZ-Jj
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:35 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	FF/AB-31258-AE71D955; Wed, 08 Jul 2015 12:30:34 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1436358633!30341930!1
X-Originating-IP: [74.125.82.48]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25177 invoked from network); 8 Jul 2015 12:30:33 -0000
Received: from mail-wg0-f48.google.com (HELO mail-wg0-f48.google.com)
	(74.125.82.48)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:33 -0000
Received: by wgxm20 with SMTP id m20so11121450wgx.3
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:33 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=K8XqMYqoYKUuCN55Pt0GPshJwf8ePfKnligvmbozIXY=;
	b=QI6iccf+vkAXrif05iRezmGhLFL+BZYdNdBR1KWGlnPpfyLuKwZkfusLyMA7OcM+1I
	bq9Xx9t3kvLZaj3sBNLrwf7NOktnsgSSV/fTpH10GVkLKOypvfuhf9FbfNGWXvQ4pSQ9
	5Ppr2cEQeu3d+7VBmmmAhkLj/n9WWa7mXyv33aQGTHEZBr7Y2iChU2tlvsSJE/iUu6ia
	gstLS7FQGZ3FBV+nycwpP9RIks/C3fxztB9deevZAFjgDn9DipZvOpyKXlLi8Xer/DlN
	+c18k8x59I60Rep9EKnlRc2B/4y6DKracemr9WGbSsCgtPzG8kpyK6bsmqn7gRXdeFcA
	RiYg==
X-Received: by 10.194.58.199 with SMTP id t7mr19567596wjq.45.1436358633498;
	Wed, 08 Jul 2015 05:30:33 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.32
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:32 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:11 +0100
Message-Id: <1436358618-11260-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
References: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/8] Remove use of 'Addresses' subkey
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

XENVIF writes the permanent address of each vif into a subkey under its
service key. This is done to allow XENNET's co-installer to copy network
settings from any emulated device that currently has that address.

As of Windows 10, this functionality cannot be provided by a co-installer
and so this subkey has become useless. Hence this patch removes its use.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/driver.c | 50 +-------------------------------------------------
 src/xenvif/driver.h |  5 -----
 src/xenvif/pdo.c    | 24 +++---------------------
 3 files changed, 4 insertions(+), 75 deletions(-)

diff --git a/src/xenvif/driver.c b/src/xenvif/driver.c
index b9e6d2f..46fe7f1 100644
--- a/src/xenvif/driver.c
+++ b/src/xenvif/driver.c
@@ -47,7 +47,6 @@ extern PULONG       InitSafeBootMode;
 typedef struct _XENVIF_DRIVER {
     PDRIVER_OBJECT      DriverObject;
     HANDLE              ParametersKey;
-    HANDLE              AddressesKey;
     HANDLE              StatusKey;
 } XENVIF_DRIVER, *PXENVIF_DRIVER;
 
@@ -102,30 +101,6 @@ DriverGetParametersKey(
 }
 
 static FORCEINLINE VOID
-__DriverSetAddressesKey(
-    IN  HANDLE  Key
-    )
-{
-    Driver.AddressesKey = Key;
-}
-
-static FORCEINLINE HANDLE
-__DriverGetAddressesKey(
-    VOID
-    )
-{
-    return Driver.AddressesKey;
-}
-
-HANDLE
-DriverGetAddressesKey(
-    VOID
-    )
-{
-    return __DriverGetAddressesKey();
-}
-
-static FORCEINLINE VOID
 __DriverSetStatusKey(
     IN  HANDLE  Key
     )
@@ -156,7 +131,6 @@ DriverUnload(
     IN  PDRIVER_OBJECT  DriverObject
     )
 {
-    HANDLE              AddressesKey;
     HANDLE              ParametersKey;
     HANDLE              StatusKey;
 
@@ -172,11 +146,6 @@ DriverUnload(
 
     RegistryCloseKey(StatusKey);
 
-    AddressesKey = __DriverGetAddressesKey();
-    __DriverSetAddressesKey(NULL);
-
-    RegistryCloseKey(AddressesKey);
-
     ParametersKey = __DriverGetParametersKey();
     __DriverSetParametersKey(NULL);
 
@@ -284,7 +253,6 @@ DriverEntry(
 {
     HANDLE              ServiceKey;
     HANDLE              ParametersKey;
-    HANDLE              AddressesKey;
     HANDLE              StatusKey;
     ULONG               Index;
     NTSTATUS            status;
@@ -331,21 +299,12 @@ DriverEntry(
 
     __DriverSetParametersKey(ParametersKey);
 
-    status = RegistryCreateSubKey(ServiceKey, 
-                                  "Addresses", 
-                                  REG_OPTION_VOLATILE, 
-                                  &AddressesKey);
-    if (!NT_SUCCESS(status))
-        goto fail4;
-
-    __DriverSetAddressesKey(AddressesKey);
-
     status = RegistryCreateSubKey(ServiceKey,
                                   "Status",
                                   REG_OPTION_VOLATILE,
                                   &StatusKey);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail4;
 
     __DriverSetStatusKey(StatusKey);
 
@@ -364,13 +323,6 @@ done:
 
     return STATUS_SUCCESS;
 
-fail5:
-    Error("fail5\n");
-
-    __DriverSetAddressesKey(NULL);
-
-    RegistryCloseKey(AddressesKey);
-
 fail4:
     Error("fail4\n");
 
diff --git a/src/xenvif/driver.h b/src/xenvif/driver.h
index 17ed726..cecefd0 100644
--- a/src/xenvif/driver.h
+++ b/src/xenvif/driver.h
@@ -43,11 +43,6 @@ DriverGetParametersKey(
     );
 
 extern HANDLE
-DriverGetAddressesKey(
-    VOID
-    );
-
-extern HANDLE
 DriverGetStatusKey(
     VOID
     );
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 61ab4ca..f2e6a8f 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -808,36 +808,16 @@ __PdoSetPermanentAddress(
     IN  PCHAR       Buffer
     )
 {
-    HANDLE          AddressesKey;
-    ANSI_STRING     Ansi;
-    ULONG           Index;
     NTSTATUS        status;
 
     status = __PdoParseAddress(Buffer, &Pdo->PermanentAddress);
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    AddressesKey = DriverGetAddressesKey();
-
-    RtlInitAnsiString(&Ansi, Buffer);
-
-    for (Index = 0; Index < Ansi.Length; Index++)
-        Ansi.Buffer[Index] = (CHAR)toupper(Ansi.Buffer[Index]);
-
-    Info("%s %Z\n", __PdoGetName(Pdo), &Ansi);
-
-    status = RegistryUpdateSzValue(AddressesKey,
-                                   __PdoGetName(Pdo),
-                                   REG_SZ,
-                                   &Ansi);
-    if (!NT_SUCCESS(status))
-        goto fail2;
+    Info("%s: %s\n", __PdoGetName(Pdo), Buffer);
 
     return STATUS_SUCCESS;
 
-fail2:
-    Error("fail2\n");
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -879,6 +859,8 @@ __PdoSetCurrentAddress(
     if (!NT_SUCCESS(status))
         goto fail2;
 
+    Info("%s: %Z\n", __PdoGetName(Pdo), &Ansi[0]);
+
     RegistryFreeSzValue(Ansi);
 
 done:
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:37 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:37 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUn-0004o1-1g; Wed, 08 Jul 2015 12:30:37 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUl-0004nZ-Jj
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:35 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	FF/AB-31258-AE71D955; Wed, 08 Jul 2015 12:30:34 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1436358633!30341930!1
X-Originating-IP: [74.125.82.48]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25177 invoked from network); 8 Jul 2015 12:30:33 -0000
Received: from mail-wg0-f48.google.com (HELO mail-wg0-f48.google.com)
	(74.125.82.48)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:33 -0000
Received: by wgxm20 with SMTP id m20so11121450wgx.3
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:33 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=K8XqMYqoYKUuCN55Pt0GPshJwf8ePfKnligvmbozIXY=;
	b=QI6iccf+vkAXrif05iRezmGhLFL+BZYdNdBR1KWGlnPpfyLuKwZkfusLyMA7OcM+1I
	bq9Xx9t3kvLZaj3sBNLrwf7NOktnsgSSV/fTpH10GVkLKOypvfuhf9FbfNGWXvQ4pSQ9
	5Ppr2cEQeu3d+7VBmmmAhkLj/n9WWa7mXyv33aQGTHEZBr7Y2iChU2tlvsSJE/iUu6ia
	gstLS7FQGZ3FBV+nycwpP9RIks/C3fxztB9deevZAFjgDn9DipZvOpyKXlLi8Xer/DlN
	+c18k8x59I60Rep9EKnlRc2B/4y6DKracemr9WGbSsCgtPzG8kpyK6bsmqn7gRXdeFcA
	RiYg==
X-Received: by 10.194.58.199 with SMTP id t7mr19567596wjq.45.1436358633498;
	Wed, 08 Jul 2015 05:30:33 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.32
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:32 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:11 +0100
Message-Id: <1436358618-11260-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
References: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/8] Remove use of 'Addresses' subkey
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

XENVIF writes the permanent address of each vif into a subkey under its
service key. This is done to allow XENNET's co-installer to copy network
settings from any emulated device that currently has that address.

As of Windows 10, this functionality cannot be provided by a co-installer
and so this subkey has become useless. Hence this patch removes its use.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/driver.c | 50 +-------------------------------------------------
 src/xenvif/driver.h |  5 -----
 src/xenvif/pdo.c    | 24 +++---------------------
 3 files changed, 4 insertions(+), 75 deletions(-)

diff --git a/src/xenvif/driver.c b/src/xenvif/driver.c
index b9e6d2f..46fe7f1 100644
--- a/src/xenvif/driver.c
+++ b/src/xenvif/driver.c
@@ -47,7 +47,6 @@ extern PULONG       InitSafeBootMode;
 typedef struct _XENVIF_DRIVER {
     PDRIVER_OBJECT      DriverObject;
     HANDLE              ParametersKey;
-    HANDLE              AddressesKey;
     HANDLE              StatusKey;
 } XENVIF_DRIVER, *PXENVIF_DRIVER;
 
@@ -102,30 +101,6 @@ DriverGetParametersKey(
 }
 
 static FORCEINLINE VOID
-__DriverSetAddressesKey(
-    IN  HANDLE  Key
-    )
-{
-    Driver.AddressesKey = Key;
-}
-
-static FORCEINLINE HANDLE
-__DriverGetAddressesKey(
-    VOID
-    )
-{
-    return Driver.AddressesKey;
-}
-
-HANDLE
-DriverGetAddressesKey(
-    VOID
-    )
-{
-    return __DriverGetAddressesKey();
-}
-
-static FORCEINLINE VOID
 __DriverSetStatusKey(
     IN  HANDLE  Key
     )
@@ -156,7 +131,6 @@ DriverUnload(
     IN  PDRIVER_OBJECT  DriverObject
     )
 {
-    HANDLE              AddressesKey;
     HANDLE              ParametersKey;
     HANDLE              StatusKey;
 
@@ -172,11 +146,6 @@ DriverUnload(
 
     RegistryCloseKey(StatusKey);
 
-    AddressesKey = __DriverGetAddressesKey();
-    __DriverSetAddressesKey(NULL);
-
-    RegistryCloseKey(AddressesKey);
-
     ParametersKey = __DriverGetParametersKey();
     __DriverSetParametersKey(NULL);
 
@@ -284,7 +253,6 @@ DriverEntry(
 {
     HANDLE              ServiceKey;
     HANDLE              ParametersKey;
-    HANDLE              AddressesKey;
     HANDLE              StatusKey;
     ULONG               Index;
     NTSTATUS            status;
@@ -331,21 +299,12 @@ DriverEntry(
 
     __DriverSetParametersKey(ParametersKey);
 
-    status = RegistryCreateSubKey(ServiceKey, 
-                                  "Addresses", 
-                                  REG_OPTION_VOLATILE, 
-                                  &AddressesKey);
-    if (!NT_SUCCESS(status))
-        goto fail4;
-
-    __DriverSetAddressesKey(AddressesKey);
-
     status = RegistryCreateSubKey(ServiceKey,
                                   "Status",
                                   REG_OPTION_VOLATILE,
                                   &StatusKey);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail4;
 
     __DriverSetStatusKey(StatusKey);
 
@@ -364,13 +323,6 @@ done:
 
     return STATUS_SUCCESS;
 
-fail5:
-    Error("fail5\n");
-
-    __DriverSetAddressesKey(NULL);
-
-    RegistryCloseKey(AddressesKey);
-
 fail4:
     Error("fail4\n");
 
diff --git a/src/xenvif/driver.h b/src/xenvif/driver.h
index 17ed726..cecefd0 100644
--- a/src/xenvif/driver.h
+++ b/src/xenvif/driver.h
@@ -43,11 +43,6 @@ DriverGetParametersKey(
     );
 
 extern HANDLE
-DriverGetAddressesKey(
-    VOID
-    );
-
-extern HANDLE
 DriverGetStatusKey(
     VOID
     );
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 61ab4ca..f2e6a8f 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -808,36 +808,16 @@ __PdoSetPermanentAddress(
     IN  PCHAR       Buffer
     )
 {
-    HANDLE          AddressesKey;
-    ANSI_STRING     Ansi;
-    ULONG           Index;
     NTSTATUS        status;
 
     status = __PdoParseAddress(Buffer, &Pdo->PermanentAddress);
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    AddressesKey = DriverGetAddressesKey();
-
-    RtlInitAnsiString(&Ansi, Buffer);
-
-    for (Index = 0; Index < Ansi.Length; Index++)
-        Ansi.Buffer[Index] = (CHAR)toupper(Ansi.Buffer[Index]);
-
-    Info("%s %Z\n", __PdoGetName(Pdo), &Ansi);
-
-    status = RegistryUpdateSzValue(AddressesKey,
-                                   __PdoGetName(Pdo),
-                                   REG_SZ,
-                                   &Ansi);
-    if (!NT_SUCCESS(status))
-        goto fail2;
+    Info("%s: %s\n", __PdoGetName(Pdo), Buffer);
 
     return STATUS_SUCCESS;
 
-fail2:
-    Error("fail2\n");
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -879,6 +859,8 @@ __PdoSetCurrentAddress(
     if (!NT_SUCCESS(status))
         goto fail2;
 
+    Info("%s: %Z\n", __PdoGetName(Pdo), &Ansi[0]);
+
     RegistryFreeSzValue(Ansi);
 
 done:
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:38 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUo-0004oY-2m; Wed, 08 Jul 2015 12:30:38 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUm-0004nj-QU
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:37 +0000
Received: from [85.158.137.68] by server-5.bemta-3.messagelabs.com id
	8D/0A-23832-CE71D955; Wed, 08 Jul 2015 12:30:36 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-31.messagelabs.com!1436358634!21403405!1
X-Originating-IP: [209.85.212.171]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9325 invoked from network); 8 Jul 2015 12:30:34 -0000
Received: from mail-wi0-f171.google.com (HELO mail-wi0-f171.google.com)
	(209.85.212.171)
	by server-14.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:34 -0000
Received: by widjy10 with SMTP id jy10so215732720wid.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:34 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=duY66ILW5hdY3a2fghEfP3FZ/im0gEMLmWhhol3pZ6c=;
	b=Mn6lK/s2zjrAArvFAdUnX8Th5xt1kODyVZmz8vPK/EpvqIII/mUyuYGgnkEuioyOKE
	jPlUlVJwlINYH5a83PUNjFAuPgjiWrRgl7/pGBR6vro6f0hGicK7G2BGXfwjaRJcYBhq
	QUReKk4+V7gUvbSXaDeKmAd5FQhQwqgIjXXWjzOagdAGsNqZY5tWABUpuRdWYGRHQ1u+
	1WmR9yf/9BIyfikbJV7t/YRuMxh2GwPp2+JPPkHaleoPAUmTgXBkv59qWmRDgH2Cd8ZN
	7aU+IS39ksUj0pj7bBkDUWnKnR6Zv7UOnGyY6ZbKsk3rtqYUxLq+Nelyfqn078BQWk4I
	AwaQ==
X-Received: by 10.194.60.131 with SMTP id h3mr19161325wjr.156.1436358634458;
	Wed, 08 Jul 2015 05:30:34 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.33
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:33 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:12 +0100
Message-Id: <1436358618-11260-3-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
References: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/8] Add functions to query and update binary
	values in the registry
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/registry.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++
 src/xenvif/registry.h |  21 +++++++
 2 files changed, 171 insertions(+)

diff --git a/src/xenvif/registry.c b/src/xenvif/registry.c
index 7f1c4cc..5c1762d 100644
--- a/src/xenvif/registry.c
+++ b/src/xenvif/registry.c
@@ -886,6 +886,148 @@ fail1:
 }
 
 NTSTATUS
+RegistryQueryBinaryValue(
+    IN  HANDLE                      Key,
+    IN  PCHAR                       Name,
+    OUT PVOID                       *Buffer,
+    OUT PULONG                      Length
+    )
+{
+    ANSI_STRING                     Ansi;
+    UNICODE_STRING                  Unicode;
+    PKEY_VALUE_PARTIAL_INFORMATION  Partial;
+    ULONG                           Size;
+    NTSTATUS                        status;
+
+    RtlInitAnsiString(&Ansi, Name);
+
+    status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = ZwQueryValueKey(Key,
+                             &Unicode,
+                             KeyValuePartialInformation,
+                             NULL,
+                             0,
+                             &Size);
+    if (status != STATUS_BUFFER_OVERFLOW &&
+        status != STATUS_BUFFER_TOO_SMALL)
+        goto fail2;
+
+#pragma prefast(suppress:6102)
+    Partial = __RegistryAllocate(Size);
+
+    status = STATUS_NO_MEMORY;
+    if (Partial == NULL)
+        goto fail3;
+
+    status = ZwQueryValueKey(Key,
+                             &Unicode,
+                             KeyValuePartialInformation,
+                             Partial,
+                             Size,
+                             &Size);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    switch (Partial->Type) {
+    case REG_BINARY:
+        *Buffer = __RegistryAllocate(Partial->DataLength);
+
+        status = STATUS_NO_MEMORY;
+        if (*Buffer == NULL)
+            break;
+
+        *Length = Partial->DataLength;
+        RtlCopyMemory(*Buffer, Partial->Data, Partial->DataLength);
+        break;
+
+    default:
+        status = STATUS_INVALID_PARAMETER;
+        *Buffer = NULL;
+        break;
+    }
+
+    if (*Buffer == NULL)
+        goto fail5;
+
+    __RegistryFree(Partial);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    return STATUS_SUCCESS;
+
+fail5:
+fail4:
+    __RegistryFree(Partial);
+
+fail3:
+fail2:
+    RtlFreeUnicodeString(&Unicode);
+
+fail1:
+    return status;
+}
+
+NTSTATUS
+RegistryUpdateBinaryValue(
+    IN  HANDLE                      Key,
+    IN  PCHAR                       Name,
+    IN  PVOID                       Buffer,
+    IN  ULONG                       Length
+    )
+{
+    ANSI_STRING                     Ansi;
+    UNICODE_STRING                  Unicode;
+    PKEY_VALUE_PARTIAL_INFORMATION  Partial;
+    NTSTATUS                        status;
+
+    RtlInitAnsiString(&Ansi, Name);
+
+    status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Partial = __RegistryAllocate(FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data) +
+                                 Length);
+
+    status = STATUS_NO_MEMORY;
+    if (Partial == NULL)
+        goto fail2;
+
+    Partial->TitleIndex = 0;
+    Partial->Type = REG_BINARY;
+    Partial->DataLength = Length;
+    RtlCopyMemory(Partial->Data, Buffer, Partial->DataLength);
+
+    status = ZwSetValueKey(Key,
+                           &Unicode,
+                           Partial->TitleIndex,
+                           Partial->Type,
+                           Partial->Data,
+                           Partial->DataLength);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    __RegistryFree(Partial);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    return STATUS_SUCCESS;
+
+fail3:
+    __RegistryFree(Partial);
+
+fail2:
+    RtlFreeUnicodeString(&Unicode);
+
+fail1:
+
+    return status;
+}
+
+NTSTATUS
 RegistryQueryKeyName(
     IN  HANDLE              Key,
     OUT PANSI_STRING        *Array
@@ -1202,6 +1344,14 @@ RegistryFreeSzValue(
 }
 
 VOID
+RegistryFreeBinaryValue(
+    IN  PVOID   Buffer
+    )
+{
+    __RegistryFree(Buffer);
+}
+
+VOID
 RegistryCloseKey(
     IN  HANDLE  Key
     )
diff --git a/src/xenvif/registry.h b/src/xenvif/registry.h
index ec129af..5fbe1bc 100644
--- a/src/xenvif/registry.h
+++ b/src/xenvif/registry.h
@@ -136,6 +136,22 @@ RegistryQuerySzValue(
     );
 
 extern NTSTATUS
+RegistryQueryBinaryValue(
+    IN  HANDLE          Key,
+    IN  PCHAR           Name,
+    OUT PVOID           *Buffer,
+    OUT PULONG          Length
+    );
+
+extern NTSTATUS
+RegistryUpdateBinaryValue(
+    IN  HANDLE          Key,
+    IN  PCHAR           Name,
+    IN  PVOID           Buffer,
+    IN  ULONG           Length
+    );
+
+extern NTSTATUS
 RegistryQueryKeyName(
     IN  HANDLE              Key,
     OUT PANSI_STRING        *Array
@@ -152,6 +168,11 @@ RegistryFreeSzValue(
     IN  PANSI_STRING    Array
     );
 
+extern VOID
+RegistryFreeBinaryValue(
+    IN  PVOID           Buffer
+    );
+
 extern NTSTATUS
 RegistryUpdateSzValue(
     IN  HANDLE          Key,
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:38 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUo-0004oY-2m; Wed, 08 Jul 2015 12:30:38 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUm-0004nj-QU
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:37 +0000
Received: from [85.158.137.68] by server-5.bemta-3.messagelabs.com id
	8D/0A-23832-CE71D955; Wed, 08 Jul 2015 12:30:36 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-31.messagelabs.com!1436358634!21403405!1
X-Originating-IP: [209.85.212.171]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9325 invoked from network); 8 Jul 2015 12:30:34 -0000
Received: from mail-wi0-f171.google.com (HELO mail-wi0-f171.google.com)
	(209.85.212.171)
	by server-14.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:34 -0000
Received: by widjy10 with SMTP id jy10so215732720wid.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:34 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=duY66ILW5hdY3a2fghEfP3FZ/im0gEMLmWhhol3pZ6c=;
	b=Mn6lK/s2zjrAArvFAdUnX8Th5xt1kODyVZmz8vPK/EpvqIII/mUyuYGgnkEuioyOKE
	jPlUlVJwlINYH5a83PUNjFAuPgjiWrRgl7/pGBR6vro6f0hGicK7G2BGXfwjaRJcYBhq
	QUReKk4+V7gUvbSXaDeKmAd5FQhQwqgIjXXWjzOagdAGsNqZY5tWABUpuRdWYGRHQ1u+
	1WmR9yf/9BIyfikbJV7t/YRuMxh2GwPp2+JPPkHaleoPAUmTgXBkv59qWmRDgH2Cd8ZN
	7aU+IS39ksUj0pj7bBkDUWnKnR6Zv7UOnGyY6ZbKsk3rtqYUxLq+Nelyfqn078BQWk4I
	AwaQ==
X-Received: by 10.194.60.131 with SMTP id h3mr19161325wjr.156.1436358634458;
	Wed, 08 Jul 2015 05:30:34 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.33
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:33 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:12 +0100
Message-Id: <1436358618-11260-3-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
References: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/8] Add functions to query and update binary
	values in the registry
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/registry.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++
 src/xenvif/registry.h |  21 +++++++
 2 files changed, 171 insertions(+)

diff --git a/src/xenvif/registry.c b/src/xenvif/registry.c
index 7f1c4cc..5c1762d 100644
--- a/src/xenvif/registry.c
+++ b/src/xenvif/registry.c
@@ -886,6 +886,148 @@ fail1:
 }
 
 NTSTATUS
+RegistryQueryBinaryValue(
+    IN  HANDLE                      Key,
+    IN  PCHAR                       Name,
+    OUT PVOID                       *Buffer,
+    OUT PULONG                      Length
+    )
+{
+    ANSI_STRING                     Ansi;
+    UNICODE_STRING                  Unicode;
+    PKEY_VALUE_PARTIAL_INFORMATION  Partial;
+    ULONG                           Size;
+    NTSTATUS                        status;
+
+    RtlInitAnsiString(&Ansi, Name);
+
+    status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = ZwQueryValueKey(Key,
+                             &Unicode,
+                             KeyValuePartialInformation,
+                             NULL,
+                             0,
+                             &Size);
+    if (status != STATUS_BUFFER_OVERFLOW &&
+        status != STATUS_BUFFER_TOO_SMALL)
+        goto fail2;
+
+#pragma prefast(suppress:6102)
+    Partial = __RegistryAllocate(Size);
+
+    status = STATUS_NO_MEMORY;
+    if (Partial == NULL)
+        goto fail3;
+
+    status = ZwQueryValueKey(Key,
+                             &Unicode,
+                             KeyValuePartialInformation,
+                             Partial,
+                             Size,
+                             &Size);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    switch (Partial->Type) {
+    case REG_BINARY:
+        *Buffer = __RegistryAllocate(Partial->DataLength);
+
+        status = STATUS_NO_MEMORY;
+        if (*Buffer == NULL)
+            break;
+
+        *Length = Partial->DataLength;
+        RtlCopyMemory(*Buffer, Partial->Data, Partial->DataLength);
+        break;
+
+    default:
+        status = STATUS_INVALID_PARAMETER;
+        *Buffer = NULL;
+        break;
+    }
+
+    if (*Buffer == NULL)
+        goto fail5;
+
+    __RegistryFree(Partial);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    return STATUS_SUCCESS;
+
+fail5:
+fail4:
+    __RegistryFree(Partial);
+
+fail3:
+fail2:
+    RtlFreeUnicodeString(&Unicode);
+
+fail1:
+    return status;
+}
+
+NTSTATUS
+RegistryUpdateBinaryValue(
+    IN  HANDLE                      Key,
+    IN  PCHAR                       Name,
+    IN  PVOID                       Buffer,
+    IN  ULONG                       Length
+    )
+{
+    ANSI_STRING                     Ansi;
+    UNICODE_STRING                  Unicode;
+    PKEY_VALUE_PARTIAL_INFORMATION  Partial;
+    NTSTATUS                        status;
+
+    RtlInitAnsiString(&Ansi, Name);
+
+    status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Partial = __RegistryAllocate(FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data) +
+                                 Length);
+
+    status = STATUS_NO_MEMORY;
+    if (Partial == NULL)
+        goto fail2;
+
+    Partial->TitleIndex = 0;
+    Partial->Type = REG_BINARY;
+    Partial->DataLength = Length;
+    RtlCopyMemory(Partial->Data, Buffer, Partial->DataLength);
+
+    status = ZwSetValueKey(Key,
+                           &Unicode,
+                           Partial->TitleIndex,
+                           Partial->Type,
+                           Partial->Data,
+                           Partial->DataLength);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    __RegistryFree(Partial);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    return STATUS_SUCCESS;
+
+fail3:
+    __RegistryFree(Partial);
+
+fail2:
+    RtlFreeUnicodeString(&Unicode);
+
+fail1:
+
+    return status;
+}
+
+NTSTATUS
 RegistryQueryKeyName(
     IN  HANDLE              Key,
     OUT PANSI_STRING        *Array
@@ -1202,6 +1344,14 @@ RegistryFreeSzValue(
 }
 
 VOID
+RegistryFreeBinaryValue(
+    IN  PVOID   Buffer
+    )
+{
+    __RegistryFree(Buffer);
+}
+
+VOID
 RegistryCloseKey(
     IN  HANDLE  Key
     )
diff --git a/src/xenvif/registry.h b/src/xenvif/registry.h
index ec129af..5fbe1bc 100644
--- a/src/xenvif/registry.h
+++ b/src/xenvif/registry.h
@@ -136,6 +136,22 @@ RegistryQuerySzValue(
     );
 
 extern NTSTATUS
+RegistryQueryBinaryValue(
+    IN  HANDLE          Key,
+    IN  PCHAR           Name,
+    OUT PVOID           *Buffer,
+    OUT PULONG          Length
+    );
+
+extern NTSTATUS
+RegistryUpdateBinaryValue(
+    IN  HANDLE          Key,
+    IN  PCHAR           Name,
+    IN  PVOID           Buffer,
+    IN  ULONG           Length
+    );
+
+extern NTSTATUS
 RegistryQueryKeyName(
     IN  HANDLE              Key,
     OUT PANSI_STRING        *Array
@@ -152,6 +168,11 @@ RegistryFreeSzValue(
     IN  PANSI_STRING    Array
     );
 
+extern VOID
+RegistryFreeBinaryValue(
+    IN  PVOID           Buffer
+    );
+
 extern NTSTATUS
 RegistryUpdateSzValue(
     IN  HANDLE          Key,
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:40 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:40 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUq-0004pP-48; Wed, 08 Jul 2015 12:30:40 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUo-0004oN-Gf
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:38 +0000
Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id
	2F/17-19853-DE71D955; Wed, 08 Jul 2015 12:30:37 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-8.tower-206.messagelabs.com!1436358636!19731409!1
X-Originating-IP: [209.85.212.171]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18109 invoked from network); 8 Jul 2015 12:30:36 -0000
Received: from mail-wi0-f171.google.com (HELO mail-wi0-f171.google.com)
	(209.85.212.171)
	by server-8.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:36 -0000
Received: by wiclp1 with SMTP id lp1so78931379wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:36 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=pe4Ju7LTbT5Gte376aITpPiY80BmbBsrEY85AQfXzi8=;
	b=mLYXqCKjwivBDSThJxYFG3fccE4r4DfhGMlj0wuveH9HicFOwJ6TR8rl0lhsTPnYsM
	HdhnI9mZopBpTPayd2SXsAlqT3Wa9uJVn8nvb1vxNyEtVeXQ7AZ2R93p6+LdrB+Q7lEc
	nlRf9nWBUToKi9USKNOKaOZOfnyaBlKe3Ay11ifq3X8JtfW29DeyHXw6T7ndLHSfr9M7
	hJr3J1GkiicFB7c2nkoxvEO9pHci4hzHt0RmEW/WX6o44qrYNVYjkmMU1CtPw7Rdk+D1
	hS7YfS/0QcBS4wHP6VBzcs4gSZ7MmJkbs2iDCTw2+OATadQfOgyXZ80OegSzt0x/zDQE
	kWsg==
X-Received: by 10.180.24.165 with SMTP id v5mr112540700wif.63.1436358635993;
	Wed, 08 Jul 2015 05:30:35 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.35
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:35 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:14 +0100
Message-Id: <1436358618-11260-5-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
References: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 4/8] Infer REG_SZ or REG_MULTI_SZ type in
	RegistryUpdateSzValue()
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The argument is a pointer to an array of ANSI_STRINGs in both cases so the
type can easily be inferred from the length of the array.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/registry.c | 27 +++++++++------------------
 src/xenvif/registry.h |  3 +--
 2 files changed, 10 insertions(+), 20 deletions(-)

diff --git a/src/xenvif/registry.c b/src/xenvif/registry.c
index 32755f3..85c924c 100644
--- a/src/xenvif/registry.c
+++ b/src/xenvif/registry.c
@@ -1258,13 +1258,12 @@ NTSTATUS
 RegistryUpdateSzValue(
     IN  HANDLE                      Key,
     IN  PCHAR                       Name,
-    IN  ULONG                       Type,
-    ...
+    IN  PANSI_STRING                Array
     )
 {
     ANSI_STRING                     Ansi;
     UNICODE_STRING                  Unicode;
-    va_list                         Arguments;
+    ULONG                           Type;
     PKEY_VALUE_PARTIAL_INFORMATION  Partial;
     NTSTATUS                        status;
 
@@ -1273,33 +1272,25 @@ RegistryUpdateSzValue(
     status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
     if (!NT_SUCCESS(status))
         goto fail1;
-        
-    va_start(Arguments, Type);
-    switch (Type) {
-    case REG_SZ: {
-        PANSI_STRING    Argument;
 
-        Argument = va_arg(Arguments, PANSI_STRING);
+    Type = (Array[1].Buffer != NULL) ? REG_MULTI_SZ : REG_SZ;
 
+    switch (Type) {
+    case REG_SZ:
         status = STATUS_NO_MEMORY;
-        Partial = RegistryAnsiToSz(Argument);        
+        Partial = RegistryAnsiToSz(Array);
         break;
-    }
-    case REG_MULTI_SZ: {
-        PANSI_STRING    Argument;
-
-        Argument = va_arg(Arguments, PANSI_STRING);
 
+    case REG_MULTI_SZ:
         status = STATUS_NO_MEMORY;
-        Partial = RegistryAnsiToMultiSz(Argument);        
+        Partial = RegistryAnsiToMultiSz(Array);
         break;
-    }
+
     default:
         status = STATUS_INVALID_PARAMETER;
         Partial = NULL;
         break;
     }
-    va_end(Arguments);
 
     if (Partial == NULL)
         goto fail2;
diff --git a/src/xenvif/registry.h b/src/xenvif/registry.h
index 1d3c885..71ce18b 100644
--- a/src/xenvif/registry.h
+++ b/src/xenvif/registry.h
@@ -177,8 +177,7 @@ extern NTSTATUS
 RegistryUpdateSzValue(
     IN  HANDLE          Key,
     IN  PCHAR           Name,
-    IN  ULONG           Type,
-    ...
+    IN  PANSI_STRING    Array
     );
 
 extern VOID
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:40 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:40 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUq-0004pP-48; Wed, 08 Jul 2015 12:30:40 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUo-0004oN-Gf
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:38 +0000
Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id
	2F/17-19853-DE71D955; Wed, 08 Jul 2015 12:30:37 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-8.tower-206.messagelabs.com!1436358636!19731409!1
X-Originating-IP: [209.85.212.171]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18109 invoked from network); 8 Jul 2015 12:30:36 -0000
Received: from mail-wi0-f171.google.com (HELO mail-wi0-f171.google.com)
	(209.85.212.171)
	by server-8.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:36 -0000
Received: by wiclp1 with SMTP id lp1so78931379wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:36 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=pe4Ju7LTbT5Gte376aITpPiY80BmbBsrEY85AQfXzi8=;
	b=mLYXqCKjwivBDSThJxYFG3fccE4r4DfhGMlj0wuveH9HicFOwJ6TR8rl0lhsTPnYsM
	HdhnI9mZopBpTPayd2SXsAlqT3Wa9uJVn8nvb1vxNyEtVeXQ7AZ2R93p6+LdrB+Q7lEc
	nlRf9nWBUToKi9USKNOKaOZOfnyaBlKe3Ay11ifq3X8JtfW29DeyHXw6T7ndLHSfr9M7
	hJr3J1GkiicFB7c2nkoxvEO9pHci4hzHt0RmEW/WX6o44qrYNVYjkmMU1CtPw7Rdk+D1
	hS7YfS/0QcBS4wHP6VBzcs4gSZ7MmJkbs2iDCTw2+OATadQfOgyXZ80OegSzt0x/zDQE
	kWsg==
X-Received: by 10.180.24.165 with SMTP id v5mr112540700wif.63.1436358635993;
	Wed, 08 Jul 2015 05:30:35 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.35
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:35 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:14 +0100
Message-Id: <1436358618-11260-5-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
References: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 4/8] Infer REG_SZ or REG_MULTI_SZ type in
	RegistryUpdateSzValue()
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The argument is a pointer to an array of ANSI_STRINGs in both cases so the
type can easily be inferred from the length of the array.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/registry.c | 27 +++++++++------------------
 src/xenvif/registry.h |  3 +--
 2 files changed, 10 insertions(+), 20 deletions(-)

diff --git a/src/xenvif/registry.c b/src/xenvif/registry.c
index 32755f3..85c924c 100644
--- a/src/xenvif/registry.c
+++ b/src/xenvif/registry.c
@@ -1258,13 +1258,12 @@ NTSTATUS
 RegistryUpdateSzValue(
     IN  HANDLE                      Key,
     IN  PCHAR                       Name,
-    IN  ULONG                       Type,
-    ...
+    IN  PANSI_STRING                Array
     )
 {
     ANSI_STRING                     Ansi;
     UNICODE_STRING                  Unicode;
-    va_list                         Arguments;
+    ULONG                           Type;
     PKEY_VALUE_PARTIAL_INFORMATION  Partial;
     NTSTATUS                        status;
 
@@ -1273,33 +1272,25 @@ RegistryUpdateSzValue(
     status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
     if (!NT_SUCCESS(status))
         goto fail1;
-        
-    va_start(Arguments, Type);
-    switch (Type) {
-    case REG_SZ: {
-        PANSI_STRING    Argument;
 
-        Argument = va_arg(Arguments, PANSI_STRING);
+    Type = (Array[1].Buffer != NULL) ? REG_MULTI_SZ : REG_SZ;
 
+    switch (Type) {
+    case REG_SZ:
         status = STATUS_NO_MEMORY;
-        Partial = RegistryAnsiToSz(Argument);        
+        Partial = RegistryAnsiToSz(Array);
         break;
-    }
-    case REG_MULTI_SZ: {
-        PANSI_STRING    Argument;
-
-        Argument = va_arg(Arguments, PANSI_STRING);
 
+    case REG_MULTI_SZ:
         status = STATUS_NO_MEMORY;
-        Partial = RegistryAnsiToMultiSz(Argument);        
+        Partial = RegistryAnsiToMultiSz(Array);
         break;
-    }
+
     default:
         status = STATUS_INVALID_PARAMETER;
         Partial = NULL;
         break;
     }
-    va_end(Arguments);
 
     if (Partial == NULL)
         goto fail2;
diff --git a/src/xenvif/registry.h b/src/xenvif/registry.h
index 1d3c885..71ce18b 100644
--- a/src/xenvif/registry.h
+++ b/src/xenvif/registry.h
@@ -177,8 +177,7 @@ extern NTSTATUS
 RegistryUpdateSzValue(
     IN  HANDLE          Key,
     IN  PCHAR           Name,
-    IN  ULONG           Type,
-    ...
+    IN  PANSI_STRING    Array
     );
 
 extern VOID
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:40 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:40 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUq-0004pX-5N; Wed, 08 Jul 2015 12:30:40 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUo-0004oS-H8
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:38 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	2D/C0-21325-DE71D955; Wed, 08 Jul 2015 12:30:37 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-3.tower-206.messagelabs.com!1436358636!12177251!1
X-Originating-IP: [74.125.82.42]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23412 invoked from network); 8 Jul 2015 12:30:36 -0000
Received: from mail-wg0-f42.google.com (HELO mail-wg0-f42.google.com)
	(74.125.82.42)
	by server-3.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:36 -0000
Received: by wgxm20 with SMTP id m20so11122715wgx.3
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:36 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=HRXNIvSsm8Ba8FFz43SOl4yD1VM0N01bDoFQMzfK9B4=;
	b=aOxNM1CbaXhoVEC9hbtGARFStWc9WE0pQSI/U4TcAEm23udXsct69cBi4yQlpvdh2f
	FtYlR1rYnR7BLepD2Ah2k0AN7cJxL1MNVPW589nb9CVgE0aV4ndVkffqwNPmO4ygORMo
	MwCsWQbIZupzbgwjkK+jcxKo/iLanEVE1hhcj23dxrdrMF1ndABwMgA02hz1MA25Jx5r
	X4e9oiAdbc2RW86qnQ6S7yNSxqscgiQugz9/qQqfBgKWFsBLm7A21Sf0Ujh3YWchND+k
	mgKHml+8YR8cip4Gn6sKpHRSq0BRkJtDOAAlfKjL+GtwzbKQrQRb8MDUhFZ0nXeJ+bgb
	xmew==
X-Received: by 10.180.10.200 with SMTP id k8mr704508wib.14.1436358636745;
	Wed, 08 Jul 2015 05:30:36 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.36
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:36 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:15 +0100
Message-Id: <1436358618-11260-6-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
References: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 5/8] Only open the PDO software key once
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

There are currently two functions where the PDO software key is opened and
closed: __PdoSetCurrentAddress() and __PdoSetLuid(). Both of these
functions are called from PdoStartDevice() so it's more efficient to open
the software key there and pass it as an argument to the aforementioned
functions.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/pdo.c | 101 +++++++++++++++++++++++++------------------------------
 1 file changed, 46 insertions(+), 55 deletions(-)

diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index f2e6a8f..0cf83b9 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -682,43 +682,32 @@ PdoGetVifContext(
 
 static FORCEINLINE NTSTATUS
 __PdoSetLuid(
-    IN  PXENVIF_PDO Pdo
+    IN  PXENVIF_PDO Pdo,
+    IN  HANDLE      Key
     )
 {
-    HANDLE          Key;
     ULONG           IfType;
     ULONG           NetLuidIndex;
     NTSTATUS        status;
 
-    status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo),
-                                     KEY_READ,
-                                     &Key);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
     status = RegistryQueryDwordValue(Key, "*IfType", &IfType);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail1;
 
     status = RegistryQueryDwordValue(Key, "NetLuidIndex", &NetLuidIndex);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail2;
 
     Pdo->Luid.Info.IfType = IfType;
     Pdo->Luid.Info.NetLuidIndex = NetLuidIndex;
 
-    RegistryCloseKey(Key);
+    Info("%s: %016llX\n", __PdoGetName(Pdo), Pdo->Luid.Value);
 
     return STATUS_SUCCESS;
 
-fail3:
-    Error("fail3\n");
-
 fail2:
     Error("fail2\n");
 
-    RegistryCloseKey(Key);
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -834,22 +823,16 @@ PdoGetPermanentAddress(
 
 static FORCEINLINE NTSTATUS
 __PdoSetCurrentAddress(
-    IN  PXENVIF_PDO Pdo
+    IN  PXENVIF_PDO Pdo,
+    IN  HANDLE      Key
     )
 {
-    HANDLE          SoftwareKey;
     PANSI_STRING    Ansi;
     NTSTATUS        status;
 
-    status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo),
-                                     KEY_READ,
-                                     &SoftwareKey);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
     RtlFillMemory(Pdo->CurrentAddress.Byte, ETHERNET_ADDRESS_LENGTH, 0xFF);
 
-    status = RegistryQuerySzValue(SoftwareKey,
+    status = RegistryQuerySzValue(Key,
                                   "NetworkAddress",
                                   &Ansi);
     if (!NT_SUCCESS(status))
@@ -857,27 +840,20 @@ __PdoSetCurrentAddress(
 
     status = __PdoParseAddress(Ansi[0].Buffer, &Pdo->CurrentAddress);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail1;
 
     Info("%s: %Z\n", __PdoGetName(Pdo), &Ansi[0]);
 
     RegistryFreeSzValue(Ansi);
 
 done:
-    RegistryCloseKey(SoftwareKey);
-
     return STATUS_SUCCESS;
 
-fail2:
-    Error("fail2\n");
-
-    RegistryFreeSzValue(Ansi);
-
-    RegistryCloseKey(SoftwareKey);
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
+    RegistryFreeSzValue(Ansi);
+
     return status;
 }
 
@@ -1168,23 +1144,38 @@ PdoStartDevice(
     PMIB_IF_TABLE2      Table;
     ULONG               Index;
     PIO_STACK_LOCATION  StackLocation;
+    HANDLE              Key;
     NTSTATUS            status;
 
+    status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo),
+                                     KEY_ALL_ACCESS,
+                                     &Key);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = __PdoSetCurrentAddress(Pdo, Key);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = __PdoSetLuid(Pdo, Key);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
     status = LinkGetRoutineAddress("netio.sys",
                                    "GetIfTable2",
                                    (PVOID *)&__GetIfTable2);
     if (!NT_SUCCESS(status))
-        goto fail1;
+        goto fail4;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "FreeMibTable",
                                    (PVOID *)&__FreeMibTable);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail5;
 
     status = __GetIfTable2(&Table);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail6;
 
     for (Index = 0; Index < Table->NumEntries; Index++) {
         PMIB_IF_ROW2    Row = &Table->Table[Index];
@@ -1203,22 +1194,14 @@ PdoStartDevice(
         if (memcmp(Row->PhysicalAddress,
                    &Pdo->PermanentAddress,
                    sizeof (ETHERNET_ADDRESS)) == 0)
-            goto fail4;
+            goto fail7;
     }
 
-    status = __PdoSetCurrentAddress(Pdo);
-    if (!NT_SUCCESS(status))
-        goto fail5;
-
-    status = __PdoSetLuid(Pdo);
-    if (!NT_SUCCESS(status))
-        goto fail6;
-
     StackLocation = IoGetCurrentIrpStackLocation(Irp);
 
     status = PdoD3ToD0(Pdo);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail8;
 
     __PdoSetDevicePnpState(Pdo, Started);
 
@@ -1227,35 +1210,43 @@ PdoStartDevice(
 
     __FreeMibTable(Table);
 
+    RegistryCloseKey(Key);
+
     return STATUS_SUCCESS;
 
+fail8:
+    Error("fail8\n");
+
+    __FreeMibTable(Table);
+    goto fail6;
+
 fail7:
     Error("fail7\n");
 
-    RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID));
+    PdoRequestReboot(Pdo);
+    __FreeMibTable(Table);
 
 fail6:
     Error("fail6\n");
 
-    RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
-
 fail5:
     Error("fail5\n");
 
-    goto fail3;
-
 fail4:
     Error("fail4\n");
 
-    PdoRequestReboot(Pdo);
-    __FreeMibTable(Table);
+    RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID));
 
 fail3:
     Error("fail3\n");
 
+    RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
+
 fail2:
     Error("fail2\n");
 
+    RegistryCloseKey(Key);
+
 fail1:
     Error("fail1 (%08x)\n", status);
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:40 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:40 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUq-0004pX-5N; Wed, 08 Jul 2015 12:30:40 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUo-0004oS-H8
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:38 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	2D/C0-21325-DE71D955; Wed, 08 Jul 2015 12:30:37 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-3.tower-206.messagelabs.com!1436358636!12177251!1
X-Originating-IP: [74.125.82.42]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23412 invoked from network); 8 Jul 2015 12:30:36 -0000
Received: from mail-wg0-f42.google.com (HELO mail-wg0-f42.google.com)
	(74.125.82.42)
	by server-3.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:36 -0000
Received: by wgxm20 with SMTP id m20so11122715wgx.3
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:36 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=HRXNIvSsm8Ba8FFz43SOl4yD1VM0N01bDoFQMzfK9B4=;
	b=aOxNM1CbaXhoVEC9hbtGARFStWc9WE0pQSI/U4TcAEm23udXsct69cBi4yQlpvdh2f
	FtYlR1rYnR7BLepD2Ah2k0AN7cJxL1MNVPW589nb9CVgE0aV4ndVkffqwNPmO4ygORMo
	MwCsWQbIZupzbgwjkK+jcxKo/iLanEVE1hhcj23dxrdrMF1ndABwMgA02hz1MA25Jx5r
	X4e9oiAdbc2RW86qnQ6S7yNSxqscgiQugz9/qQqfBgKWFsBLm7A21Sf0Ujh3YWchND+k
	mgKHml+8YR8cip4Gn6sKpHRSq0BRkJtDOAAlfKjL+GtwzbKQrQRb8MDUhFZ0nXeJ+bgb
	xmew==
X-Received: by 10.180.10.200 with SMTP id k8mr704508wib.14.1436358636745;
	Wed, 08 Jul 2015 05:30:36 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.36
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:36 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:15 +0100
Message-Id: <1436358618-11260-6-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
References: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 5/8] Only open the PDO software key once
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

There are currently two functions where the PDO software key is opened and
closed: __PdoSetCurrentAddress() and __PdoSetLuid(). Both of these
functions are called from PdoStartDevice() so it's more efficient to open
the software key there and pass it as an argument to the aforementioned
functions.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/pdo.c | 101 +++++++++++++++++++++++++------------------------------
 1 file changed, 46 insertions(+), 55 deletions(-)

diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index f2e6a8f..0cf83b9 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -682,43 +682,32 @@ PdoGetVifContext(
 
 static FORCEINLINE NTSTATUS
 __PdoSetLuid(
-    IN  PXENVIF_PDO Pdo
+    IN  PXENVIF_PDO Pdo,
+    IN  HANDLE      Key
     )
 {
-    HANDLE          Key;
     ULONG           IfType;
     ULONG           NetLuidIndex;
     NTSTATUS        status;
 
-    status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo),
-                                     KEY_READ,
-                                     &Key);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
     status = RegistryQueryDwordValue(Key, "*IfType", &IfType);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail1;
 
     status = RegistryQueryDwordValue(Key, "NetLuidIndex", &NetLuidIndex);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail2;
 
     Pdo->Luid.Info.IfType = IfType;
     Pdo->Luid.Info.NetLuidIndex = NetLuidIndex;
 
-    RegistryCloseKey(Key);
+    Info("%s: %016llX\n", __PdoGetName(Pdo), Pdo->Luid.Value);
 
     return STATUS_SUCCESS;
 
-fail3:
-    Error("fail3\n");
-
 fail2:
     Error("fail2\n");
 
-    RegistryCloseKey(Key);
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -834,22 +823,16 @@ PdoGetPermanentAddress(
 
 static FORCEINLINE NTSTATUS
 __PdoSetCurrentAddress(
-    IN  PXENVIF_PDO Pdo
+    IN  PXENVIF_PDO Pdo,
+    IN  HANDLE      Key
     )
 {
-    HANDLE          SoftwareKey;
     PANSI_STRING    Ansi;
     NTSTATUS        status;
 
-    status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo),
-                                     KEY_READ,
-                                     &SoftwareKey);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
     RtlFillMemory(Pdo->CurrentAddress.Byte, ETHERNET_ADDRESS_LENGTH, 0xFF);
 
-    status = RegistryQuerySzValue(SoftwareKey,
+    status = RegistryQuerySzValue(Key,
                                   "NetworkAddress",
                                   &Ansi);
     if (!NT_SUCCESS(status))
@@ -857,27 +840,20 @@ __PdoSetCurrentAddress(
 
     status = __PdoParseAddress(Ansi[0].Buffer, &Pdo->CurrentAddress);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail1;
 
     Info("%s: %Z\n", __PdoGetName(Pdo), &Ansi[0]);
 
     RegistryFreeSzValue(Ansi);
 
 done:
-    RegistryCloseKey(SoftwareKey);
-
     return STATUS_SUCCESS;
 
-fail2:
-    Error("fail2\n");
-
-    RegistryFreeSzValue(Ansi);
-
-    RegistryCloseKey(SoftwareKey);
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
+    RegistryFreeSzValue(Ansi);
+
     return status;
 }
 
@@ -1168,23 +1144,38 @@ PdoStartDevice(
     PMIB_IF_TABLE2      Table;
     ULONG               Index;
     PIO_STACK_LOCATION  StackLocation;
+    HANDLE              Key;
     NTSTATUS            status;
 
+    status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo),
+                                     KEY_ALL_ACCESS,
+                                     &Key);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = __PdoSetCurrentAddress(Pdo, Key);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = __PdoSetLuid(Pdo, Key);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
     status = LinkGetRoutineAddress("netio.sys",
                                    "GetIfTable2",
                                    (PVOID *)&__GetIfTable2);
     if (!NT_SUCCESS(status))
-        goto fail1;
+        goto fail4;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "FreeMibTable",
                                    (PVOID *)&__FreeMibTable);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail5;
 
     status = __GetIfTable2(&Table);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail6;
 
     for (Index = 0; Index < Table->NumEntries; Index++) {
         PMIB_IF_ROW2    Row = &Table->Table[Index];
@@ -1203,22 +1194,14 @@ PdoStartDevice(
         if (memcmp(Row->PhysicalAddress,
                    &Pdo->PermanentAddress,
                    sizeof (ETHERNET_ADDRESS)) == 0)
-            goto fail4;
+            goto fail7;
     }
 
-    status = __PdoSetCurrentAddress(Pdo);
-    if (!NT_SUCCESS(status))
-        goto fail5;
-
-    status = __PdoSetLuid(Pdo);
-    if (!NT_SUCCESS(status))
-        goto fail6;
-
     StackLocation = IoGetCurrentIrpStackLocation(Irp);
 
     status = PdoD3ToD0(Pdo);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail8;
 
     __PdoSetDevicePnpState(Pdo, Started);
 
@@ -1227,35 +1210,43 @@ PdoStartDevice(
 
     __FreeMibTable(Table);
 
+    RegistryCloseKey(Key);
+
     return STATUS_SUCCESS;
 
+fail8:
+    Error("fail8\n");
+
+    __FreeMibTable(Table);
+    goto fail6;
+
 fail7:
     Error("fail7\n");
 
-    RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID));
+    PdoRequestReboot(Pdo);
+    __FreeMibTable(Table);
 
 fail6:
     Error("fail6\n");
 
-    RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
-
 fail5:
     Error("fail5\n");
 
-    goto fail3;
-
 fail4:
     Error("fail4\n");
 
-    PdoRequestReboot(Pdo);
-    __FreeMibTable(Table);
+    RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID));
 
 fail3:
     Error("fail3\n");
 
+    RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
+
 fail2:
     Error("fail2\n");
 
+    RegistryCloseKey(Key);
+
 fail1:
     Error("fail1 (%08x)\n", status);
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:41 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:41 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUr-0004qQ-7B; Wed, 08 Jul 2015 12:30:41 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUp-0004ni-Nw
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:39 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	5B/33-17050-CE71D955; Wed, 08 Jul 2015 12:30:36 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1436358635!23892645!1
X-Originating-IP: [209.85.212.177]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15251 invoked from network); 8 Jul 2015 12:30:35 -0000
Received: from mail-wi0-f177.google.com (HELO mail-wi0-f177.google.com)
	(209.85.212.177)
	by server-3.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:35 -0000
Received: by wibdq8 with SMTP id dq8so211210819wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:35 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=y0vqnp8tD/6Wc4zhQ0dp1+nuaraTMgxalBNXoTpd9qw=;
	b=pjmpekIevp1pfQxLmcEg8y30smLKMCtsc7cDhviKTbgHVQuKBC7QHnOQtZq6WCH1xE
	R6JozV2+4PQjSZWEKwshUnu7kIw09038yUDWUzvrnxGTaEz6+p+QxbYmAhXx0rpIsaS8
	a6TU5cU3KQNTEdeXK2Daoqw2SyZuMcwoLlfs69dYNWFPzFu/RIdNDoLCdQDVnrXOdrEX
	WbKUY0IPr64a6DreNcs4iinaFbMIHTlQZTiBILDJqH3FBn43fbvzCKGoxElqZTR+SHHr
	DvFDVuB7vbm4Qq5yqhN1Um3lXtUH6XuJqDjrSpIk9ISP4AmhzPE0ALqMzyYxj5dRFqlY
	42DA==
X-Received: by 10.194.100.104 with SMTP id ex8mr20267027wjb.69.1436358635211; 
	Wed, 08 Jul 2015 05:30:35 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.34
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:34 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:13 +0100
Message-Id: <1436358618-11260-4-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
References: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 3/8] Add a type argument to the
	RegistryEnumerateValues() callback...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...and pass ANSI_STRINGs rather than PCHARs.

Also fix both RegistryEnumerateSubKeys() and RegistryEnumerateValues() to
not clobber their own buffer sizes when calling ZwEnumerateKey() or
ZwEnumerateValueKey() respectively.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/registry.c | 14 ++++++++------
 src/xenvif/registry.h |  4 ++--
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/src/xenvif/registry.c b/src/xenvif/registry.c
index 5c1762d..32755f3 100644
--- a/src/xenvif/registry.c
+++ b/src/xenvif/registry.c
@@ -347,7 +347,7 @@ fail1:
 NTSTATUS
 RegistryEnumerateSubKeys(
     IN  HANDLE              Key,
-    IN  NTSTATUS            (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS            (*Callback)(PVOID, HANDLE, PANSI_STRING),
     IN  PVOID               Context
     )
 {
@@ -390,6 +390,7 @@ RegistryEnumerateSubKeys(
         goto fail4;
 
     for (Index = 0; Index < Full->SubKeys; Index++) {
+        ULONG           Ignore;
         UNICODE_STRING  Unicode;
         ANSI_STRING     Ansi;
 
@@ -398,7 +399,7 @@ RegistryEnumerateSubKeys(
                                 KeyBasicInformation,
                                 Basic,
                                 Size,
-                                &Size);
+                                &Ignore);
         if (!NT_SUCCESS(status))
             goto fail5;
 
@@ -418,7 +419,7 @@ RegistryEnumerateSubKeys(
 
         Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));        
 
-        status = Callback(Context, Key, Ansi.Buffer);
+        status = Callback(Context, Key, &Ansi);
 
         __RegistryFree(Ansi.Buffer);
         Ansi.Buffer = NULL;
@@ -450,7 +451,7 @@ fail1:
 NTSTATUS
 RegistryEnumerateValues(
     IN  HANDLE                      Key,
-    IN  NTSTATUS                    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS                    (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
     IN  PVOID                       Context
     )
 {
@@ -493,6 +494,7 @@ RegistryEnumerateValues(
         goto fail4;
 
     for (Index = 0; Index < Full->Values; Index++) {
+        ULONG           Ignore;
         UNICODE_STRING  Unicode;
         ANSI_STRING     Ansi;
 
@@ -501,7 +503,7 @@ RegistryEnumerateValues(
                                      KeyValueBasicInformation,
                                      Basic,
                                      Size,
-                                     &Size);
+                                     &Ignore);
         if (!NT_SUCCESS(status))
             goto fail5;
 
@@ -517,7 +519,7 @@ RegistryEnumerateValues(
 
         Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));        
 
-        status = Callback(Context, Key, Ansi.Buffer);
+        status = Callback(Context, Key, &Ansi, Basic->Type);
 
         __RegistryFree(Ansi.Buffer);
 
diff --git a/src/xenvif/registry.h b/src/xenvif/registry.h
index 5fbe1bc..1d3c885 100644
--- a/src/xenvif/registry.h
+++ b/src/xenvif/registry.h
@@ -97,14 +97,14 @@ RegistryDeleteSubKey(
 extern NTSTATUS
 RegistryEnumerateSubKeys(
     IN  HANDLE      Key,
-    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PANSI_STRING),
     IN  PVOID       Context
     );
 
 extern NTSTATUS
 RegistryEnumerateValues(
     IN  HANDLE      Key,
-    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
     IN  PVOID       Context
     );
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:41 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:41 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUr-0004qQ-7B; Wed, 08 Jul 2015 12:30:41 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUp-0004ni-Nw
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:39 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	5B/33-17050-CE71D955; Wed, 08 Jul 2015 12:30:36 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1436358635!23892645!1
X-Originating-IP: [209.85.212.177]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15251 invoked from network); 8 Jul 2015 12:30:35 -0000
Received: from mail-wi0-f177.google.com (HELO mail-wi0-f177.google.com)
	(209.85.212.177)
	by server-3.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:35 -0000
Received: by wibdq8 with SMTP id dq8so211210819wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:35 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=y0vqnp8tD/6Wc4zhQ0dp1+nuaraTMgxalBNXoTpd9qw=;
	b=pjmpekIevp1pfQxLmcEg8y30smLKMCtsc7cDhviKTbgHVQuKBC7QHnOQtZq6WCH1xE
	R6JozV2+4PQjSZWEKwshUnu7kIw09038yUDWUzvrnxGTaEz6+p+QxbYmAhXx0rpIsaS8
	a6TU5cU3KQNTEdeXK2Daoqw2SyZuMcwoLlfs69dYNWFPzFu/RIdNDoLCdQDVnrXOdrEX
	WbKUY0IPr64a6DreNcs4iinaFbMIHTlQZTiBILDJqH3FBn43fbvzCKGoxElqZTR+SHHr
	DvFDVuB7vbm4Qq5yqhN1Um3lXtUH6XuJqDjrSpIk9ISP4AmhzPE0ALqMzyYxj5dRFqlY
	42DA==
X-Received: by 10.194.100.104 with SMTP id ex8mr20267027wjb.69.1436358635211; 
	Wed, 08 Jul 2015 05:30:35 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.34
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:34 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:13 +0100
Message-Id: <1436358618-11260-4-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
References: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 3/8] Add a type argument to the
	RegistryEnumerateValues() callback...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...and pass ANSI_STRINGs rather than PCHARs.

Also fix both RegistryEnumerateSubKeys() and RegistryEnumerateValues() to
not clobber their own buffer sizes when calling ZwEnumerateKey() or
ZwEnumerateValueKey() respectively.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/registry.c | 14 ++++++++------
 src/xenvif/registry.h |  4 ++--
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/src/xenvif/registry.c b/src/xenvif/registry.c
index 5c1762d..32755f3 100644
--- a/src/xenvif/registry.c
+++ b/src/xenvif/registry.c
@@ -347,7 +347,7 @@ fail1:
 NTSTATUS
 RegistryEnumerateSubKeys(
     IN  HANDLE              Key,
-    IN  NTSTATUS            (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS            (*Callback)(PVOID, HANDLE, PANSI_STRING),
     IN  PVOID               Context
     )
 {
@@ -390,6 +390,7 @@ RegistryEnumerateSubKeys(
         goto fail4;
 
     for (Index = 0; Index < Full->SubKeys; Index++) {
+        ULONG           Ignore;
         UNICODE_STRING  Unicode;
         ANSI_STRING     Ansi;
 
@@ -398,7 +399,7 @@ RegistryEnumerateSubKeys(
                                 KeyBasicInformation,
                                 Basic,
                                 Size,
-                                &Size);
+                                &Ignore);
         if (!NT_SUCCESS(status))
             goto fail5;
 
@@ -418,7 +419,7 @@ RegistryEnumerateSubKeys(
 
         Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));        
 
-        status = Callback(Context, Key, Ansi.Buffer);
+        status = Callback(Context, Key, &Ansi);
 
         __RegistryFree(Ansi.Buffer);
         Ansi.Buffer = NULL;
@@ -450,7 +451,7 @@ fail1:
 NTSTATUS
 RegistryEnumerateValues(
     IN  HANDLE                      Key,
-    IN  NTSTATUS                    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS                    (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
     IN  PVOID                       Context
     )
 {
@@ -493,6 +494,7 @@ RegistryEnumerateValues(
         goto fail4;
 
     for (Index = 0; Index < Full->Values; Index++) {
+        ULONG           Ignore;
         UNICODE_STRING  Unicode;
         ANSI_STRING     Ansi;
 
@@ -501,7 +503,7 @@ RegistryEnumerateValues(
                                      KeyValueBasicInformation,
                                      Basic,
                                      Size,
-                                     &Size);
+                                     &Ignore);
         if (!NT_SUCCESS(status))
             goto fail5;
 
@@ -517,7 +519,7 @@ RegistryEnumerateValues(
 
         Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));        
 
-        status = Callback(Context, Key, Ansi.Buffer);
+        status = Callback(Context, Key, &Ansi, Basic->Type);
 
         __RegistryFree(Ansi.Buffer);
 
diff --git a/src/xenvif/registry.h b/src/xenvif/registry.h
index 5fbe1bc..1d3c885 100644
--- a/src/xenvif/registry.h
+++ b/src/xenvif/registry.h
@@ -97,14 +97,14 @@ RegistryDeleteSubKey(
 extern NTSTATUS
 RegistryEnumerateSubKeys(
     IN  HANDLE      Key,
-    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PANSI_STRING),
     IN  PVOID       Context
     );
 
 extern NTSTATUS
 RegistryEnumerateValues(
     IN  HANDLE      Key,
-    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
     IN  PVOID       Context
     );
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:42 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUs-0004r3-8T; Wed, 08 Jul 2015 12:30:42 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUq-0004pO-He
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:40 +0000
Received: from [85.158.137.68] by server-12.bemta-3.messagelabs.com id
	15/86-02952-FE71D955; Wed, 08 Jul 2015 12:30:39 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-11.tower-31.messagelabs.com!1436358638!23856214!1
X-Originating-IP: [74.125.82.44]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13399 invoked from network); 8 Jul 2015 12:30:38 -0000
Received: from mail-wg0-f44.google.com (HELO mail-wg0-f44.google.com)
	(74.125.82.44)
	by server-11.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:38 -0000
Received: by wgov12 with SMTP id v12so9794178wgo.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:38 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=fYql2pGzyG81yLBTklPBtjcwEgw7RCda4z2B0FU5xTM=;
	b=FMQpXMfmI/baMPg3wVsE66Cbg4Mo26rUcns/171CCUM4jFS8xtrEvVXjGSZ3L6x1go
	0CP1+iCHkYZZ2zRVXluHDnzSBph3A+PJcs3BFFuU7utZsKKWY0u4WrI/B/356NB33PVJ
	YLOVm5OuXP7HgvOE8GrAImGF+YGfDfdTjj3znLR572zT529vt+ZVrA7MYwJvtccxoHg8
	S5SbrqzxayuQWNJ2WyRw9vZJAVjI5i1kZSH46hr+XxfES7H9F1PkjeA+/XBswTD0dlmG
	MfoBR7v5r4GnOTZgYq56igCAsnMHeykyZ6cZ92VGFbAwwxMUwfDdVOCjZyeVUpwhQSi+
	Eg0g==
X-Received: by 10.180.80.9 with SMTP id n9mr111436032wix.87.1436358638364;
	Wed, 08 Jul 2015 05:30:38 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.37
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:37 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:17 +0100
Message-Id: <1436358618-11260-8-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
References: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 7/8] Stop synthesizing the NET_LUID
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

>From Windows 10 the lifetime of the registry keys used to synthesize the
PDO's NET_LUID has changed. Instead of using a synthesized NET_LUID, look it
up in the MIB interface table (keyed by the permanent physical address)

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/frontend.c | 101 ++++++++++++++++++++++++++++++++++++++++----------
 src/xenvif/pdo.c      |  91 ++++++++++-----------------------------------
 src/xenvif/pdo.h      |   5 ---
 3 files changed, 102 insertions(+), 95 deletions(-)

diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index 9f032c3..aea907d 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -455,6 +455,37 @@ fail1:
 }
 
 static NTSTATUS
+FrontendGetLuid(
+    IN  PXENVIF_FRONTEND    Frontend,
+    IN  PMIB_IF_TABLE2      Table,
+    OUT PNET_LUID           Luid
+    )
+{
+    ETHERNET_ADDRESS        PermanentPhysicalAddress;
+    ULONG                   Index;
+    PMIB_IF_ROW2            Row;
+
+    MacQueryPermanentAddress(__FrontendGetMac(Frontend),
+                             &PermanentPhysicalAddress);
+
+    for (Index = 0; Index < Table->NumEntries; Index++) {
+        Row = &Table->Table[Index];
+
+        if (memcmp(Row->PermanentPhysicalAddress,
+                   &PermanentPhysicalAddress,
+                   sizeof (ETHERNET_ADDRESS)) == 0)
+            goto found;
+    }
+
+    return STATUS_UNSUCCESSFUL;
+
+found:
+    *Luid = Row->InterfaceLuid;
+
+    return STATUS_SUCCESS;
+}
+
+static NTSTATUS
 FrontendInsertAddress(
     IN OUT  PSOCKADDR_INET      *AddressTable,
     IN      const SOCKADDR_INET *Address,
@@ -511,22 +542,22 @@ fail1:
 static NTSTATUS
 FrontendProcessAddressTable(
     IN  PXENVIF_FRONTEND            Frontend,
-    IN  PMIB_UNICASTIPADDRESS_TABLE MibTable,
+    IN  PMIB_UNICASTIPADDRESS_TABLE Table,
+    IN  PNET_LUID                   Luid,
     OUT PSOCKADDR_INET              *AddressTable,
     OUT PULONG                      AddressCount
     )
 {
-    PNET_LUID                       Luid;
     ULONG                           Index;
     NTSTATUS                        status;
 
+    UNREFERENCED_PARAMETER(Frontend);
+
     *AddressTable = NULL;
     *AddressCount = 0;
 
-    Luid = PdoGetLuid(__FrontendGetPdo(Frontend));
-
-    for (Index = 0; Index < MibTable->NumEntries; Index++) {
-        PMIB_UNICASTIPADDRESS_ROW   Row = &MibTable->Table[Index];
+    for (Index = 0; Index < Table->NumEntries; Index++) {
+        PMIB_UNICASTIPADDRESS_ROW   Row = &Table->Table[Index];
 
         if (Row->InterfaceLuid.Info.IfType != Luid->Info.IfType)
             continue;
@@ -717,6 +748,7 @@ FrontendMib(
 {
     PXENVIF_FRONTEND    Frontend = Context;
     PKEVENT             Event;
+    NTSTATUS            (*__GetIfTable2)(PMIB_IF_TABLE2 *);
     NTSTATUS            (*__NotifyUnicastIpAddressChange)(ADDRESS_FAMILY,
                                                           PUNICAST_IPADDRESS_CHANGE_CALLBACK,
                                                           PVOID,    
@@ -733,28 +765,34 @@ FrontendMib(
     Trace("====>\n");
 
     status = LinkGetRoutineAddress("netio.sys",
+                                   "GetIfTable2",
+                                   (PVOID *)&__GetIfTable2);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = LinkGetRoutineAddress("netio.sys",
                                    "NotifyUnicastIpAddressChange",
                                    (PVOID *)&__NotifyUnicastIpAddressChange);
     if (!NT_SUCCESS(status))
-        goto fail1;
+        goto fail2;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "GetUnicastIpAddressTable",
                                    (PVOID *)&__GetUnicastIpAddressTable);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail3;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "FreeMibTable",
                                    (PVOID *)&__FreeMibTable);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail4;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "CancelMibChangeNotify2",
                                    (PVOID *)&__CancelMibChangeNotify2);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail5;
 
     status = __NotifyUnicastIpAddressChange(AF_UNSPEC,
                                             FrontendIpAddressChange,
@@ -762,12 +800,14 @@ FrontendMib(
                                             TRUE,
                                             &Handle);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail6;
 
     Event = ThreadGetEvent(Self);
 
     for (;;) { 
-        PMIB_UNICASTIPADDRESS_TABLE MibTable;
+        PMIB_IF_TABLE2              IfTable;
+        NET_LUID                    Luid;
+        PMIB_UNICASTIPADDRESS_TABLE UnicastIpAddressTable;
         KIRQL                       Irql;
         PSOCKADDR_INET              AddressTable;
         ULONG                       AddressCount;
@@ -782,23 +822,38 @@ FrontendMib(
         if (ThreadIsAlerted(Self))
             break;
 
-        status = __GetUnicastIpAddressTable(AF_UNSPEC, &MibTable);
+        IfTable = NULL;
+        UnicastIpAddressTable = NULL;
+
+        status = __GetIfTable2(&IfTable);
         if (!NT_SUCCESS(status))
-            continue;
+            goto loop;
+
+        status = FrontendGetLuid(Frontend,
+                                 IfTable,
+                                 &Luid);
+        if (!NT_SUCCESS(status))
+            goto loop;
+
+        status = __GetUnicastIpAddressTable(AF_UNSPEC,
+                                            &UnicastIpAddressTable);
+        if (!NT_SUCCESS(status))
+            goto loop;
 
         KeAcquireSpinLock(&Frontend->Lock, &Irql);
 
         // It is not safe to use interfaces before this point
         if (Frontend->State != FRONTEND_CONNECTED &&
             Frontend->State != FRONTEND_ENABLED)
-            goto loop;
+            goto unlock;
 
         status = FrontendProcessAddressTable(Frontend,
-                                             MibTable,
+                                             UnicastIpAddressTable,
+                                             &Luid,
                                              &AddressTable,
                                              &AddressCount);
         if (!NT_SUCCESS(status))
-            goto loop;
+            goto unlock;
 
         TransmitterUpdateAddressTable(__FrontendGetTransmitter(Frontend),
                                       AddressTable,
@@ -811,10 +866,15 @@ FrontendMib(
         if (AddressCount != 0)
             __FrontendFree(AddressTable);
 
-loop:
+unlock:
         KeReleaseSpinLock(&Frontend->Lock, Irql);
 
-        __FreeMibTable(MibTable);
+loop:
+        if (UnicastIpAddressTable != NULL)
+            __FreeMibTable(UnicastIpAddressTable);
+
+        if (IfTable != NULL)
+            __FreeMibTable(IfTable);
     }
 
     status = __CancelMibChangeNotify2(Handle);
@@ -824,6 +884,9 @@ loop:
 
     return STATUS_SUCCESS;
 
+fail6:
+    Error("fail6\n");
+
 fail5:
     Error("fail5\n");
 
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 9e3003e..140b618 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -681,56 +681,6 @@ PdoGetVifContext(
 }
 
 static FORCEINLINE NTSTATUS
-__PdoSetLuid(
-    IN  PXENVIF_PDO Pdo,
-    IN  HANDLE      Key
-    )
-{
-    ULONG           IfType;
-    ULONG           NetLuidIndex;
-    NTSTATUS        status;
-
-    status = RegistryQueryDwordValue(Key, "*IfType", &IfType);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
-    status = RegistryQueryDwordValue(Key, "NetLuidIndex", &NetLuidIndex);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
-    Pdo->Luid.Info.IfType = IfType;
-    Pdo->Luid.Info.NetLuidIndex = NetLuidIndex;
-
-    Info("%s: %016llX\n", __PdoGetName(Pdo), Pdo->Luid.Value);
-
-    return STATUS_SUCCESS;
-
-fail2:
-    Error("fail2\n");
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return status;
-}
-
-static FORCEINLINE PNET_LUID
-__PdoGetLuid(
-    IN  PXENVIF_PDO Pdo
-    )
-{
-    return &Pdo->Luid;
-}
-
-PNET_LUID
-PdoGetLuid(
-    IN  PXENVIF_PDO Pdo
-    )
-{
-    return __PdoGetLuid(Pdo);
-}
-
-static FORCEINLINE NTSTATUS
 __PdoParseAddress(
     IN  PCHAR               Buffer,
     OUT PETHERNET_ADDRESS   Address
@@ -813,12 +763,20 @@ fail1:
     return status;
 }
 
+static FORCEINLINE PETHERNET_ADDRESS
+__PdoGetPermanentAddress(
+    IN  PXENVIF_PDO Pdo
+    )
+{
+    return &Pdo->PermanentAddress;
+}
+
 PETHERNET_ADDRESS
 PdoGetPermanentAddress(
     IN  PXENVIF_PDO Pdo
     )
 {
-    return &Pdo->PermanentAddress;
+    return __PdoGetPermanentAddress(Pdo);
 }
 
 static FORCEINLINE NTSTATUS
@@ -1141,25 +1099,21 @@ PdoStartDevice(
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    status = __PdoSetLuid(Pdo, Key);
-    if (!NT_SUCCESS(status))
-        goto fail4;
-
     status = LinkGetRoutineAddress("netio.sys",
                                    "GetIfTable2",
                                    (PVOID *)&__GetIfTable2);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail4;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "FreeMibTable",
                                    (PVOID *)&__FreeMibTable);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail5;
 
     status = __GetIfTable2(&Table);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail6;
 
     for (Index = 0; Index < Table->NumEntries; Index++) {
         PMIB_IF_ROW2    Row = &Table->Table[Index];
@@ -1175,17 +1129,17 @@ PdoStartDevice(
             continue;
 
         status = STATUS_UNSUCCESSFUL;
-        if (memcmp(Row->PhysicalAddress,
-                   &Pdo->PermanentAddress,
+        if (memcmp(Row->PermanentPhysicalAddress,
+                   __PdoGetPermanentAddress(Pdo),
                    sizeof (ETHERNET_ADDRESS)) == 0)
-            goto fail8;
+            goto fail7;
     }
 
     StackLocation = IoGetCurrentIrpStackLocation(Irp);
 
     status = PdoD3ToD0(Pdo);
     if (!NT_SUCCESS(status))
-        goto fail9;
+        goto fail8;
 
     __PdoSetDevicePnpState(Pdo, Started);
 
@@ -1198,29 +1152,24 @@ PdoStartDevice(
 
     return STATUS_SUCCESS;
 
-fail9:
-    Error("fail9\n");
-
-    __FreeMibTable(Table);
-    goto fail6;
-
 fail8:
     Error("fail8\n");
 
-    DriverRequestReboot();
     __FreeMibTable(Table);
+    goto fail6;
 
 fail7:
     Error("fail7\n");
 
+    DriverRequestReboot();
+    __FreeMibTable(Table);
+
 fail6:
     Error("fail6\n");
 
 fail5:
     Error("fail5\n");
 
-    RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID));
-
 fail4:
     Error("fail4\n");
 
diff --git a/src/xenvif/pdo.h b/src/xenvif/pdo.h
index be05125..7066aaf 100644
--- a/src/xenvif/pdo.h
+++ b/src/xenvif/pdo.h
@@ -127,11 +127,6 @@ PdoGetBusData(
     IN  ULONG           Length
     );
 
-extern PNET_LUID
-PdoGetLuid(
-    IN  PXENVIF_PDO Pdo
-    );
-
 extern PETHERNET_ADDRESS
 PdoGetPermanentAddress(
     IN  PXENVIF_PDO Pdo
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:42 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUs-0004r3-8T; Wed, 08 Jul 2015 12:30:42 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUq-0004pO-He
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:40 +0000
Received: from [85.158.137.68] by server-12.bemta-3.messagelabs.com id
	15/86-02952-FE71D955; Wed, 08 Jul 2015 12:30:39 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-11.tower-31.messagelabs.com!1436358638!23856214!1
X-Originating-IP: [74.125.82.44]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13399 invoked from network); 8 Jul 2015 12:30:38 -0000
Received: from mail-wg0-f44.google.com (HELO mail-wg0-f44.google.com)
	(74.125.82.44)
	by server-11.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:38 -0000
Received: by wgov12 with SMTP id v12so9794178wgo.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:38 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=fYql2pGzyG81yLBTklPBtjcwEgw7RCda4z2B0FU5xTM=;
	b=FMQpXMfmI/baMPg3wVsE66Cbg4Mo26rUcns/171CCUM4jFS8xtrEvVXjGSZ3L6x1go
	0CP1+iCHkYZZ2zRVXluHDnzSBph3A+PJcs3BFFuU7utZsKKWY0u4WrI/B/356NB33PVJ
	YLOVm5OuXP7HgvOE8GrAImGF+YGfDfdTjj3znLR572zT529vt+ZVrA7MYwJvtccxoHg8
	S5SbrqzxayuQWNJ2WyRw9vZJAVjI5i1kZSH46hr+XxfES7H9F1PkjeA+/XBswTD0dlmG
	MfoBR7v5r4GnOTZgYq56igCAsnMHeykyZ6cZ92VGFbAwwxMUwfDdVOCjZyeVUpwhQSi+
	Eg0g==
X-Received: by 10.180.80.9 with SMTP id n9mr111436032wix.87.1436358638364;
	Wed, 08 Jul 2015 05:30:38 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.37
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:37 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:17 +0100
Message-Id: <1436358618-11260-8-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
References: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 7/8] Stop synthesizing the NET_LUID
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

>From Windows 10 the lifetime of the registry keys used to synthesize the
PDO's NET_LUID has changed. Instead of using a synthesized NET_LUID, look it
up in the MIB interface table (keyed by the permanent physical address)

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/frontend.c | 101 ++++++++++++++++++++++++++++++++++++++++----------
 src/xenvif/pdo.c      |  91 ++++++++++-----------------------------------
 src/xenvif/pdo.h      |   5 ---
 3 files changed, 102 insertions(+), 95 deletions(-)

diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index 9f032c3..aea907d 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -455,6 +455,37 @@ fail1:
 }
 
 static NTSTATUS
+FrontendGetLuid(
+    IN  PXENVIF_FRONTEND    Frontend,
+    IN  PMIB_IF_TABLE2      Table,
+    OUT PNET_LUID           Luid
+    )
+{
+    ETHERNET_ADDRESS        PermanentPhysicalAddress;
+    ULONG                   Index;
+    PMIB_IF_ROW2            Row;
+
+    MacQueryPermanentAddress(__FrontendGetMac(Frontend),
+                             &PermanentPhysicalAddress);
+
+    for (Index = 0; Index < Table->NumEntries; Index++) {
+        Row = &Table->Table[Index];
+
+        if (memcmp(Row->PermanentPhysicalAddress,
+                   &PermanentPhysicalAddress,
+                   sizeof (ETHERNET_ADDRESS)) == 0)
+            goto found;
+    }
+
+    return STATUS_UNSUCCESSFUL;
+
+found:
+    *Luid = Row->InterfaceLuid;
+
+    return STATUS_SUCCESS;
+}
+
+static NTSTATUS
 FrontendInsertAddress(
     IN OUT  PSOCKADDR_INET      *AddressTable,
     IN      const SOCKADDR_INET *Address,
@@ -511,22 +542,22 @@ fail1:
 static NTSTATUS
 FrontendProcessAddressTable(
     IN  PXENVIF_FRONTEND            Frontend,
-    IN  PMIB_UNICASTIPADDRESS_TABLE MibTable,
+    IN  PMIB_UNICASTIPADDRESS_TABLE Table,
+    IN  PNET_LUID                   Luid,
     OUT PSOCKADDR_INET              *AddressTable,
     OUT PULONG                      AddressCount
     )
 {
-    PNET_LUID                       Luid;
     ULONG                           Index;
     NTSTATUS                        status;
 
+    UNREFERENCED_PARAMETER(Frontend);
+
     *AddressTable = NULL;
     *AddressCount = 0;
 
-    Luid = PdoGetLuid(__FrontendGetPdo(Frontend));
-
-    for (Index = 0; Index < MibTable->NumEntries; Index++) {
-        PMIB_UNICASTIPADDRESS_ROW   Row = &MibTable->Table[Index];
+    for (Index = 0; Index < Table->NumEntries; Index++) {
+        PMIB_UNICASTIPADDRESS_ROW   Row = &Table->Table[Index];
 
         if (Row->InterfaceLuid.Info.IfType != Luid->Info.IfType)
             continue;
@@ -717,6 +748,7 @@ FrontendMib(
 {
     PXENVIF_FRONTEND    Frontend = Context;
     PKEVENT             Event;
+    NTSTATUS            (*__GetIfTable2)(PMIB_IF_TABLE2 *);
     NTSTATUS            (*__NotifyUnicastIpAddressChange)(ADDRESS_FAMILY,
                                                           PUNICAST_IPADDRESS_CHANGE_CALLBACK,
                                                           PVOID,    
@@ -733,28 +765,34 @@ FrontendMib(
     Trace("====>\n");
 
     status = LinkGetRoutineAddress("netio.sys",
+                                   "GetIfTable2",
+                                   (PVOID *)&__GetIfTable2);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = LinkGetRoutineAddress("netio.sys",
                                    "NotifyUnicastIpAddressChange",
                                    (PVOID *)&__NotifyUnicastIpAddressChange);
     if (!NT_SUCCESS(status))
-        goto fail1;
+        goto fail2;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "GetUnicastIpAddressTable",
                                    (PVOID *)&__GetUnicastIpAddressTable);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail3;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "FreeMibTable",
                                    (PVOID *)&__FreeMibTable);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail4;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "CancelMibChangeNotify2",
                                    (PVOID *)&__CancelMibChangeNotify2);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail5;
 
     status = __NotifyUnicastIpAddressChange(AF_UNSPEC,
                                             FrontendIpAddressChange,
@@ -762,12 +800,14 @@ FrontendMib(
                                             TRUE,
                                             &Handle);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail6;
 
     Event = ThreadGetEvent(Self);
 
     for (;;) { 
-        PMIB_UNICASTIPADDRESS_TABLE MibTable;
+        PMIB_IF_TABLE2              IfTable;
+        NET_LUID                    Luid;
+        PMIB_UNICASTIPADDRESS_TABLE UnicastIpAddressTable;
         KIRQL                       Irql;
         PSOCKADDR_INET              AddressTable;
         ULONG                       AddressCount;
@@ -782,23 +822,38 @@ FrontendMib(
         if (ThreadIsAlerted(Self))
             break;
 
-        status = __GetUnicastIpAddressTable(AF_UNSPEC, &MibTable);
+        IfTable = NULL;
+        UnicastIpAddressTable = NULL;
+
+        status = __GetIfTable2(&IfTable);
         if (!NT_SUCCESS(status))
-            continue;
+            goto loop;
+
+        status = FrontendGetLuid(Frontend,
+                                 IfTable,
+                                 &Luid);
+        if (!NT_SUCCESS(status))
+            goto loop;
+
+        status = __GetUnicastIpAddressTable(AF_UNSPEC,
+                                            &UnicastIpAddressTable);
+        if (!NT_SUCCESS(status))
+            goto loop;
 
         KeAcquireSpinLock(&Frontend->Lock, &Irql);
 
         // It is not safe to use interfaces before this point
         if (Frontend->State != FRONTEND_CONNECTED &&
             Frontend->State != FRONTEND_ENABLED)
-            goto loop;
+            goto unlock;
 
         status = FrontendProcessAddressTable(Frontend,
-                                             MibTable,
+                                             UnicastIpAddressTable,
+                                             &Luid,
                                              &AddressTable,
                                              &AddressCount);
         if (!NT_SUCCESS(status))
-            goto loop;
+            goto unlock;
 
         TransmitterUpdateAddressTable(__FrontendGetTransmitter(Frontend),
                                       AddressTable,
@@ -811,10 +866,15 @@ FrontendMib(
         if (AddressCount != 0)
             __FrontendFree(AddressTable);
 
-loop:
+unlock:
         KeReleaseSpinLock(&Frontend->Lock, Irql);
 
-        __FreeMibTable(MibTable);
+loop:
+        if (UnicastIpAddressTable != NULL)
+            __FreeMibTable(UnicastIpAddressTable);
+
+        if (IfTable != NULL)
+            __FreeMibTable(IfTable);
     }
 
     status = __CancelMibChangeNotify2(Handle);
@@ -824,6 +884,9 @@ loop:
 
     return STATUS_SUCCESS;
 
+fail6:
+    Error("fail6\n");
+
 fail5:
     Error("fail5\n");
 
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 9e3003e..140b618 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -681,56 +681,6 @@ PdoGetVifContext(
 }
 
 static FORCEINLINE NTSTATUS
-__PdoSetLuid(
-    IN  PXENVIF_PDO Pdo,
-    IN  HANDLE      Key
-    )
-{
-    ULONG           IfType;
-    ULONG           NetLuidIndex;
-    NTSTATUS        status;
-
-    status = RegistryQueryDwordValue(Key, "*IfType", &IfType);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
-    status = RegistryQueryDwordValue(Key, "NetLuidIndex", &NetLuidIndex);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
-    Pdo->Luid.Info.IfType = IfType;
-    Pdo->Luid.Info.NetLuidIndex = NetLuidIndex;
-
-    Info("%s: %016llX\n", __PdoGetName(Pdo), Pdo->Luid.Value);
-
-    return STATUS_SUCCESS;
-
-fail2:
-    Error("fail2\n");
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return status;
-}
-
-static FORCEINLINE PNET_LUID
-__PdoGetLuid(
-    IN  PXENVIF_PDO Pdo
-    )
-{
-    return &Pdo->Luid;
-}
-
-PNET_LUID
-PdoGetLuid(
-    IN  PXENVIF_PDO Pdo
-    )
-{
-    return __PdoGetLuid(Pdo);
-}
-
-static FORCEINLINE NTSTATUS
 __PdoParseAddress(
     IN  PCHAR               Buffer,
     OUT PETHERNET_ADDRESS   Address
@@ -813,12 +763,20 @@ fail1:
     return status;
 }
 
+static FORCEINLINE PETHERNET_ADDRESS
+__PdoGetPermanentAddress(
+    IN  PXENVIF_PDO Pdo
+    )
+{
+    return &Pdo->PermanentAddress;
+}
+
 PETHERNET_ADDRESS
 PdoGetPermanentAddress(
     IN  PXENVIF_PDO Pdo
     )
 {
-    return &Pdo->PermanentAddress;
+    return __PdoGetPermanentAddress(Pdo);
 }
 
 static FORCEINLINE NTSTATUS
@@ -1141,25 +1099,21 @@ PdoStartDevice(
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    status = __PdoSetLuid(Pdo, Key);
-    if (!NT_SUCCESS(status))
-        goto fail4;
-
     status = LinkGetRoutineAddress("netio.sys",
                                    "GetIfTable2",
                                    (PVOID *)&__GetIfTable2);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail4;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "FreeMibTable",
                                    (PVOID *)&__FreeMibTable);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail5;
 
     status = __GetIfTable2(&Table);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail6;
 
     for (Index = 0; Index < Table->NumEntries; Index++) {
         PMIB_IF_ROW2    Row = &Table->Table[Index];
@@ -1175,17 +1129,17 @@ PdoStartDevice(
             continue;
 
         status = STATUS_UNSUCCESSFUL;
-        if (memcmp(Row->PhysicalAddress,
-                   &Pdo->PermanentAddress,
+        if (memcmp(Row->PermanentPhysicalAddress,
+                   __PdoGetPermanentAddress(Pdo),
                    sizeof (ETHERNET_ADDRESS)) == 0)
-            goto fail8;
+            goto fail7;
     }
 
     StackLocation = IoGetCurrentIrpStackLocation(Irp);
 
     status = PdoD3ToD0(Pdo);
     if (!NT_SUCCESS(status))
-        goto fail9;
+        goto fail8;
 
     __PdoSetDevicePnpState(Pdo, Started);
 
@@ -1198,29 +1152,24 @@ PdoStartDevice(
 
     return STATUS_SUCCESS;
 
-fail9:
-    Error("fail9\n");
-
-    __FreeMibTable(Table);
-    goto fail6;
-
 fail8:
     Error("fail8\n");
 
-    DriverRequestReboot();
     __FreeMibTable(Table);
+    goto fail6;
 
 fail7:
     Error("fail7\n");
 
+    DriverRequestReboot();
+    __FreeMibTable(Table);
+
 fail6:
     Error("fail6\n");
 
 fail5:
     Error("fail5\n");
 
-    RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID));
-
 fail4:
     Error("fail4\n");
 
diff --git a/src/xenvif/pdo.h b/src/xenvif/pdo.h
index be05125..7066aaf 100644
--- a/src/xenvif/pdo.h
+++ b/src/xenvif/pdo.h
@@ -127,11 +127,6 @@ PdoGetBusData(
     IN  ULONG           Length
     );
 
-extern PNET_LUID
-PdoGetLuid(
-    IN  PXENVIF_PDO Pdo
-    );
-
 extern PETHERNET_ADDRESS
 PdoGetPermanentAddress(
     IN  PXENVIF_PDO Pdo
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:42 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUs-0004rC-9q; Wed, 08 Jul 2015 12:30:42 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUq-0004oS-L6
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:40 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	DD/D0-21325-FE71D955; Wed, 08 Jul 2015 12:30:39 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-4.tower-206.messagelabs.com!1436358637!19772072!1
X-Originating-IP: [209.85.212.170]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19973 invoked from network); 8 Jul 2015 12:30:38 -0000
Received: from mail-wi0-f170.google.com (HELO mail-wi0-f170.google.com)
	(209.85.212.170)
	by server-4.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:38 -0000
Received: by wiwl6 with SMTP id l6so343203830wiw.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:37 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=c4QlTztV78S9dpdiunwHMgWavdw/8XtIWYdt5FQw1gQ=;
	b=kRdtdAgjKuSlC5M43ZPI3/Q5LY/5IOhCMynDAQoCj669sCAR8NMPEMVFmMB8jP8Ghf
	BhvXmov1fOVCOm23IikDbFfiKSxe09ouVTtvDK0k+RHW73HmiB00nEtOCTkkX2sMGNYm
	wJ3pBJwh7xdmsrdiP753c88uPaAFporoE8DJ5Djz3RG5YnaRYvxtyH0gyoyiJxkQbxHS
	AYNRh2iA5jP4KRAqkBs4WTaLUofiXDJM7TEGEZACo+xnIMDIHQUDc8Ijr16z05GETywG
	7QYPiyWQcCsGOY/oyBV5SZJS/tokvFeKfllZzkPLx5XUHrM2E+EZ5LoSOoJWD3eSeJvk
	Jokw==
X-Received: by 10.180.101.233 with SMTP id fj9mr110560373wib.45.1436358637515; 
	Wed, 08 Jul 2015 05:30:37 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.36
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:37 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:16 +0100
Message-Id: <1436358618-11260-7-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
References: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 6/8] Move reboot request code into driver.c
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It doesn't really belong in pdo.c

Also this patch adds a check in PdoStartDevice() to fail if a reboot has
already been requested. This is because Windows 10 apparently has a couple
of goes at starting the PDO even after it failed to start the first time
(because we requested a reboot).

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/driver.c | 22 +++++++++++++++++---
 src/xenvif/driver.h |  9 ++++++--
 src/xenvif/pdo.c    | 59 +++++++++++++++++++++--------------------------------
 3 files changed, 49 insertions(+), 41 deletions(-)

diff --git a/src/xenvif/driver.c b/src/xenvif/driver.c
index 46fe7f1..95a56e3 100644
--- a/src/xenvif/driver.c
+++ b/src/xenvif/driver.c
@@ -48,6 +48,7 @@ typedef struct _XENVIF_DRIVER {
     PDRIVER_OBJECT      DriverObject;
     HANDLE              ParametersKey;
     HANDLE              StatusKey;
+    BOOLEAN             NeedReboot;
 } XENVIF_DRIVER, *PXENVIF_DRIVER;
 
 static XENVIF_DRIVER    Driver;
@@ -116,12 +117,27 @@ __DriverGetStatusKey(
     return Driver.StatusKey;
 }
 
-HANDLE
-DriverGetStatusKey(
+VOID
+DriverRequestReboot(
+    VOID
+    )
+{
+    Info("<===>\n");
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    (VOID) RegistryUpdateDwordValue(__DriverGetStatusKey(),
+                                    "NeedReboot",
+                                    1);
+    Driver.NeedReboot = TRUE;
+}
+
+BOOLEAN
+DriverIsRebootRequested(
     VOID
     )
 {
-    return __DriverGetStatusKey();
+    return Driver.NeedReboot;
 }
 
 DRIVER_UNLOAD       DriverUnload;
diff --git a/src/xenvif/driver.h b/src/xenvif/driver.h
index cecefd0..53b85af 100644
--- a/src/xenvif/driver.h
+++ b/src/xenvif/driver.h
@@ -42,8 +42,13 @@ DriverGetParametersKey(
     VOID
     );
 
-extern HANDLE
-DriverGetStatusKey(
+extern VOID
+DriverRequestReboot(
+    VOID
+    );
+
+BOOLEAN
+DriverIsRebootRequested(
     VOID
     );
 
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 0cf83b9..9e3003e 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -1113,26 +1113,6 @@ PdoS3ToS4(
     Trace("(%s) <====\n", __PdoGetName(Pdo));
 }
 
-static VOID
-PdoRequestReboot(
-    IN  PXENVIF_PDO     Pdo
-    )
-{
-    HANDLE              StatusKey;
-
-    UNREFERENCED_PARAMETER(Pdo);
-
-    Info("<===>\n");
-
-    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
-
-    StatusKey = DriverGetStatusKey();
-
-    (VOID) RegistryUpdateDwordValue(StatusKey,
-                                    "NeedReboot",
-                                    1);
-}
-
 static DECLSPEC_NOINLINE NTSTATUS
 PdoStartDevice(
     IN  PXENVIF_PDO     Pdo,
@@ -1147,35 +1127,39 @@ PdoStartDevice(
     HANDLE              Key;
     NTSTATUS            status;
 
+    status = STATUS_UNSUCCESSFUL;
+    if (DriverIsRebootRequested())
+        goto fail1;
+
     status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo),
                                      KEY_ALL_ACCESS,
                                      &Key);
     if (!NT_SUCCESS(status))
-        goto fail1;
+        goto fail2;
 
     status = __PdoSetCurrentAddress(Pdo, Key);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail3;
 
     status = __PdoSetLuid(Pdo, Key);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail4;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "GetIfTable2",
                                    (PVOID *)&__GetIfTable2);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail5;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "FreeMibTable",
                                    (PVOID *)&__FreeMibTable);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail6;
 
     status = __GetIfTable2(&Table);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail7;
 
     for (Index = 0; Index < Table->NumEntries; Index++) {
         PMIB_IF_ROW2    Row = &Table->Table[Index];
@@ -1194,14 +1178,14 @@ PdoStartDevice(
         if (memcmp(Row->PhysicalAddress,
                    &Pdo->PermanentAddress,
                    sizeof (ETHERNET_ADDRESS)) == 0)
-            goto fail7;
+            goto fail8;
     }
 
     StackLocation = IoGetCurrentIrpStackLocation(Irp);
 
     status = PdoD3ToD0(Pdo);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail9;
 
     __PdoSetDevicePnpState(Pdo, Started);
 
@@ -1214,39 +1198,42 @@ PdoStartDevice(
 
     return STATUS_SUCCESS;
 
+fail9:
+    Error("fail9\n");
+
+    __FreeMibTable(Table);
+    goto fail6;
+
 fail8:
     Error("fail8\n");
 
+    DriverRequestReboot();
     __FreeMibTable(Table);
-    goto fail6;
 
 fail7:
     Error("fail7\n");
 
-    PdoRequestReboot(Pdo);
-    __FreeMibTable(Table);
-
 fail6:
     Error("fail6\n");
 
 fail5:
     Error("fail5\n");
 
+    RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID));
+
 fail4:
     Error("fail4\n");
 
-    RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID));
+    RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
 
 fail3:
     Error("fail3\n");
 
-    RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
+    RegistryCloseKey(Key);
 
 fail2:
     Error("fail2\n");
 
-    RegistryCloseKey(Key);
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:42 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUs-0004rC-9q; Wed, 08 Jul 2015 12:30:42 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUq-0004oS-L6
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:40 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	DD/D0-21325-FE71D955; Wed, 08 Jul 2015 12:30:39 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-4.tower-206.messagelabs.com!1436358637!19772072!1
X-Originating-IP: [209.85.212.170]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19973 invoked from network); 8 Jul 2015 12:30:38 -0000
Received: from mail-wi0-f170.google.com (HELO mail-wi0-f170.google.com)
	(209.85.212.170)
	by server-4.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:38 -0000
Received: by wiwl6 with SMTP id l6so343203830wiw.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:37 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=c4QlTztV78S9dpdiunwHMgWavdw/8XtIWYdt5FQw1gQ=;
	b=kRdtdAgjKuSlC5M43ZPI3/Q5LY/5IOhCMynDAQoCj669sCAR8NMPEMVFmMB8jP8Ghf
	BhvXmov1fOVCOm23IikDbFfiKSxe09ouVTtvDK0k+RHW73HmiB00nEtOCTkkX2sMGNYm
	wJ3pBJwh7xdmsrdiP753c88uPaAFporoE8DJ5Djz3RG5YnaRYvxtyH0gyoyiJxkQbxHS
	AYNRh2iA5jP4KRAqkBs4WTaLUofiXDJM7TEGEZACo+xnIMDIHQUDc8Ijr16z05GETywG
	7QYPiyWQcCsGOY/oyBV5SZJS/tokvFeKfllZzkPLx5XUHrM2E+EZ5LoSOoJWD3eSeJvk
	Jokw==
X-Received: by 10.180.101.233 with SMTP id fj9mr110560373wib.45.1436358637515; 
	Wed, 08 Jul 2015 05:30:37 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.36
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:37 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:16 +0100
Message-Id: <1436358618-11260-7-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
References: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 6/8] Move reboot request code into driver.c
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It doesn't really belong in pdo.c

Also this patch adds a check in PdoStartDevice() to fail if a reboot has
already been requested. This is because Windows 10 apparently has a couple
of goes at starting the PDO even after it failed to start the first time
(because we requested a reboot).

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/driver.c | 22 +++++++++++++++++---
 src/xenvif/driver.h |  9 ++++++--
 src/xenvif/pdo.c    | 59 +++++++++++++++++++++--------------------------------
 3 files changed, 49 insertions(+), 41 deletions(-)

diff --git a/src/xenvif/driver.c b/src/xenvif/driver.c
index 46fe7f1..95a56e3 100644
--- a/src/xenvif/driver.c
+++ b/src/xenvif/driver.c
@@ -48,6 +48,7 @@ typedef struct _XENVIF_DRIVER {
     PDRIVER_OBJECT      DriverObject;
     HANDLE              ParametersKey;
     HANDLE              StatusKey;
+    BOOLEAN             NeedReboot;
 } XENVIF_DRIVER, *PXENVIF_DRIVER;
 
 static XENVIF_DRIVER    Driver;
@@ -116,12 +117,27 @@ __DriverGetStatusKey(
     return Driver.StatusKey;
 }
 
-HANDLE
-DriverGetStatusKey(
+VOID
+DriverRequestReboot(
+    VOID
+    )
+{
+    Info("<===>\n");
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    (VOID) RegistryUpdateDwordValue(__DriverGetStatusKey(),
+                                    "NeedReboot",
+                                    1);
+    Driver.NeedReboot = TRUE;
+}
+
+BOOLEAN
+DriverIsRebootRequested(
     VOID
     )
 {
-    return __DriverGetStatusKey();
+    return Driver.NeedReboot;
 }
 
 DRIVER_UNLOAD       DriverUnload;
diff --git a/src/xenvif/driver.h b/src/xenvif/driver.h
index cecefd0..53b85af 100644
--- a/src/xenvif/driver.h
+++ b/src/xenvif/driver.h
@@ -42,8 +42,13 @@ DriverGetParametersKey(
     VOID
     );
 
-extern HANDLE
-DriverGetStatusKey(
+extern VOID
+DriverRequestReboot(
+    VOID
+    );
+
+BOOLEAN
+DriverIsRebootRequested(
     VOID
     );
 
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 0cf83b9..9e3003e 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -1113,26 +1113,6 @@ PdoS3ToS4(
     Trace("(%s) <====\n", __PdoGetName(Pdo));
 }
 
-static VOID
-PdoRequestReboot(
-    IN  PXENVIF_PDO     Pdo
-    )
-{
-    HANDLE              StatusKey;
-
-    UNREFERENCED_PARAMETER(Pdo);
-
-    Info("<===>\n");
-
-    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
-
-    StatusKey = DriverGetStatusKey();
-
-    (VOID) RegistryUpdateDwordValue(StatusKey,
-                                    "NeedReboot",
-                                    1);
-}
-
 static DECLSPEC_NOINLINE NTSTATUS
 PdoStartDevice(
     IN  PXENVIF_PDO     Pdo,
@@ -1147,35 +1127,39 @@ PdoStartDevice(
     HANDLE              Key;
     NTSTATUS            status;
 
+    status = STATUS_UNSUCCESSFUL;
+    if (DriverIsRebootRequested())
+        goto fail1;
+
     status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo),
                                      KEY_ALL_ACCESS,
                                      &Key);
     if (!NT_SUCCESS(status))
-        goto fail1;
+        goto fail2;
 
     status = __PdoSetCurrentAddress(Pdo, Key);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail3;
 
     status = __PdoSetLuid(Pdo, Key);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail4;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "GetIfTable2",
                                    (PVOID *)&__GetIfTable2);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail5;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "FreeMibTable",
                                    (PVOID *)&__FreeMibTable);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail6;
 
     status = __GetIfTable2(&Table);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail7;
 
     for (Index = 0; Index < Table->NumEntries; Index++) {
         PMIB_IF_ROW2    Row = &Table->Table[Index];
@@ -1194,14 +1178,14 @@ PdoStartDevice(
         if (memcmp(Row->PhysicalAddress,
                    &Pdo->PermanentAddress,
                    sizeof (ETHERNET_ADDRESS)) == 0)
-            goto fail7;
+            goto fail8;
     }
 
     StackLocation = IoGetCurrentIrpStackLocation(Irp);
 
     status = PdoD3ToD0(Pdo);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail9;
 
     __PdoSetDevicePnpState(Pdo, Started);
 
@@ -1214,39 +1198,42 @@ PdoStartDevice(
 
     return STATUS_SUCCESS;
 
+fail9:
+    Error("fail9\n");
+
+    __FreeMibTable(Table);
+    goto fail6;
+
 fail8:
     Error("fail8\n");
 
+    DriverRequestReboot();
     __FreeMibTable(Table);
-    goto fail6;
 
 fail7:
     Error("fail7\n");
 
-    PdoRequestReboot(Pdo);
-    __FreeMibTable(Table);
-
 fail6:
     Error("fail6\n");
 
 fail5:
     Error("fail5\n");
 
+    RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID));
+
 fail4:
     Error("fail4\n");
 
-    RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID));
+    RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
 
 fail3:
     Error("fail3\n");
 
-    RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
+    RegistryCloseKey(Key);
 
 fail2:
     Error("fail2\n");
 
-    RegistryCloseKey(Key);
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:44 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:44 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUu-0004sQ-CR; Wed, 08 Jul 2015 12:30:44 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUs-0004qw-Dn
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:42 +0000
Received: from [193.109.254.147] by server-3.bemta-14.messagelabs.com id
	B3/03-18676-1F71D955; Wed, 08 Jul 2015 12:30:41 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1436358639!30309854!1
X-Originating-IP: [74.125.82.42]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17229 invoked from network); 8 Jul 2015 12:30:39 -0000
Received: from mail-wg0-f42.google.com (HELO mail-wg0-f42.google.com)
	(74.125.82.42)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:39 -0000
Received: by wgxm20 with SMTP id m20so11123759wgx.3
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:39 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=kp3ZpFoPpckGuBXbDaB0dmsLUTwZG6ENu/UBmpXj++s=;
	b=Un8Z3JR8i8aP8Ui8HM9CtAQWky/wl33KoF4CbFhGfQ0e8KITLVYSKdktaTSwid9rRb
	GLylPdnV2YpgRmuYEca9Q9Xb2xv68YYWR864hIXqzkmFlUuFdHx77XRBYg3OpeMZawkO
	t9ICWCMH7T3P3iPpXTuWIXT5TG+jSn3YAqqbKvh2Wji3gmTSW4wNJDs6TlEDsCNIV4CL
	tDv++DNwJO1Hz+GMUkkGlOnyH7EHXkGYglVUQNNRyHPwD4K323HFD1nwFZN/NzmRGSdx
	4By2B33h7sO153k/OUA5XYZlFRYy9Mbwl6NCpgCSHSAgDReGv5G5KQTB4L2yWQS2wiWK
	Ma4w==
X-Received: by 10.180.11.200 with SMTP id s8mr109956350wib.17.1436358639160;
	Wed, 08 Jul 2015 05:30:39 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.38
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:38 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:18 +0100
Message-Id: <1436358618-11260-9-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
References: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 8/8] Add functions to backup and restore
	network settings
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

In PdoStartDevice(), if an aliasing emulated device is found in the MIB
interface table, back up its network settings to a private area under the
the PDO software key before requesting reboot.

In a later boot, if the emulated device has been unplugged, restore the
network settings from the private area to the PDO such that it will start
with the same configuration as the emulated device it has replaced.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/pdo.c             |  91 +++++++-
 src/xenvif/settings.c        | 495 +++++++++++++++++++++++++++++++++++++++++++
 src/xenvif/settings.h        |  53 +++++
 vs2012/xenvif/xenvif.vcxproj |   1 +
 vs2013/xenvif/xenvif.vcxproj |   1 +
 5 files changed, 637 insertions(+), 4 deletions(-)
 create mode 100644 src/xenvif/settings.c
 create mode 100644 src/xenvif/settings.h

diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 140b618..8b6fbd4 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -53,6 +53,7 @@
 #include "registry.h"
 #include "thread.h"
 #include "link.h"
+#include "settings.h"
 #include "dbg_print.h"
 #include "assert.h"
 #include "util.h"
@@ -1071,6 +1072,51 @@ PdoS3ToS4(
     Trace("(%s) <====\n", __PdoGetName(Pdo));
 }
 
+static NTSTATUS
+PdoGetInterfaceGuid(
+    IN  PXENVIF_PDO Pdo,
+    IN  HANDLE      Key,
+    OUT LPGUID      Guid
+    )
+{
+    PANSI_STRING    Ansi;
+    UNICODE_STRING  Unicode;
+    NTSTATUS        status;
+
+    UNREFERENCED_PARAMETER(Pdo);
+
+    status = RegistryQuerySzValue(Key,
+                                  "NetCfgInstanceId",
+                                  &Ansi);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi[0], TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = RtlGUIDFromString(&Unicode, Guid);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    return STATUS_SUCCESS;
+
+fail3:
+    Error("fail3\n");
+
+    RtlFreeUnicodeString(&Unicode);
+
+fail2:
+    Error("fail2\n");
+
+    RegistryFreeSzValue(Ansi);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
 static DECLSPEC_NOINLINE NTSTATUS
 PdoStartDevice(
     IN  PXENVIF_PDO     Pdo,
@@ -1081,8 +1127,10 @@ PdoStartDevice(
     VOID                (*__FreeMibTable)(PVOID);
     PMIB_IF_TABLE2      Table;
     ULONG               Index;
+    PMIB_IF_ROW2        Row;
     PIO_STACK_LOCATION  StackLocation;
     HANDLE              Key;
+    GUID                Guid;
     NTSTATUS            status;
 
     status = STATUS_UNSUCCESSFUL;
@@ -1115,8 +1163,13 @@ PdoStartDevice(
     if (!NT_SUCCESS(status))
         goto fail6;
 
+    //
+    // Look for a network interface with the same permanent address
+    // that is already up. If there is one then it must be an
+    // aliasing emulated device, so save its settings.
+    //
     for (Index = 0; Index < Table->NumEntries; Index++) {
-        PMIB_IF_ROW2    Row = &Table->Table[Index];
+        Row = &Table->Table[Index];
 
         if (!(Row->InterfaceAndOperStatusFlags.HardwareInterface) ||
             !(Row->InterfaceAndOperStatusFlags.ConnectorPresent))
@@ -1128,11 +1181,34 @@ PdoStartDevice(
         if (Row->PhysicalAddressLength != sizeof (ETHERNET_ADDRESS))
             continue;
 
-        status = STATUS_UNSUCCESSFUL;
         if (memcmp(Row->PermanentPhysicalAddress,
                    __PdoGetPermanentAddress(Pdo),
-                   sizeof (ETHERNET_ADDRESS)) == 0)
-            goto fail7;
+                   sizeof (ETHERNET_ADDRESS)) != 0)
+            continue;
+
+        status = STATUS_UNSUCCESSFUL;
+        goto fail7;
+    }
+
+    //
+    // If there is a stack bound then restore any settings that
+    // may have been saved from an aliasing emulated device.
+    //
+    status = PdoGetInterfaceGuid(Pdo, Key, &Guid);
+    if (NT_SUCCESS(status)) {
+        for (Index = 0; Index < Table->NumEntries; Index++) {
+            Row = &Table->Table[Index];
+
+            if (!IsEqualGUID(&Row->InterfaceGuid, &Guid))
+                continue;
+
+            (VOID) SettingsRestore(Key,
+                                   Row->Alias,
+                                   Row->Description,
+                                   &Row->InterfaceGuid,
+                                   &Row->InterfaceLuid);
+            break;
+        }
     }
 
     StackLocation = IoGetCurrentIrpStackLocation(Irp);
@@ -1156,11 +1232,18 @@ fail8:
     Error("fail8\n");
 
     __FreeMibTable(Table);
+
     goto fail6;
 
 fail7:
     Error("fail7\n");
 
+    (VOID) SettingsSave(Key,
+                        Row->Alias,
+                        Row->Description,
+                        &Row->InterfaceGuid,
+                        &Row->InterfaceLuid);
+
     DriverRequestReboot();
     __FreeMibTable(Table);
 
diff --git a/src/xenvif/settings.c b/src/xenvif/settings.c
new file mode 100644
index 0000000..145e83d
--- /dev/null
+++ b/src/xenvif/settings.c
@@ -0,0 +1,495 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <ntddk.h>
+#include <ntstrsafe.h>
+
+#include "registry.h"
+#include "driver.h"
+#include "dbg_print.h"
+#include "assert.h"
+#include "util.h"
+
+#define SETTINGS_TAG 'TTES'
+
+static FORCEINLINE PVOID
+__SettingsAllocate(
+    IN  ULONG   Length
+    )
+{
+    return __AllocateNonPagedPoolWithTag(Length, SETTINGS_TAG);
+}
+
+static FORCEINLINE VOID
+__SettingsFree(
+    IN  PVOID   Buffer
+    )
+{
+    __FreePoolWithTag(Buffer, SETTINGS_TAG);
+}
+
+static NTSTATUS
+SettingsCopyValue(
+    IN  PVOID           Context,
+    IN  HANDLE          SourceKey,
+    IN  PANSI_STRING    Name,
+    IN  ULONG           Type
+    )
+{
+    HANDLE              DestinationKey = (HANDLE)Context;
+    NTSTATUS            status;
+
+    Trace("%Z\n", Name);
+
+    switch (Type) {
+    case REG_DWORD: {
+        ULONG   Value;
+
+        status = RegistryQueryDwordValue(SourceKey,
+                                         Name->Buffer,
+                                         &Value);
+        if (NT_SUCCESS(status))
+            (VOID) RegistryUpdateDwordValue(DestinationKey,
+                                            Name->Buffer,
+                                            Value);
+
+        break;
+    }
+    case REG_SZ:
+    case REG_MULTI_SZ: {
+        PANSI_STRING    Value;
+
+        status = RegistryQuerySzValue(SourceKey,
+                                      Name->Buffer,
+                                      &Value);
+        if (NT_SUCCESS(status)) {
+            (VOID) RegistryUpdateSzValue(DestinationKey,
+                                         Name->Buffer,
+                                         Value);
+            RegistryFreeSzValue(Value);
+        }
+
+        break;
+    }
+    case REG_BINARY: {
+        PVOID   Value;
+        ULONG   Length;
+
+        status = RegistryQueryBinaryValue(SourceKey,
+                                          Name->Buffer,
+                                          &Value,
+                                          &Length);
+        if (NT_SUCCESS(status)) {
+            (VOID) RegistryUpdateBinaryValue(DestinationKey,
+                                             Name->Buffer,
+                                             Value,
+                                             Length);
+            RegistryFreeBinaryValue(Value);
+        }
+
+        break;
+    }
+    default:
+        ASSERT(FALSE);
+    }
+
+    return STATUS_SUCCESS;
+}
+
+static NTSTATUS
+SettingsCopyInterface(
+    IN  HANDLE  SettingsKey,
+    IN  PCHAR   SaveKeyName,
+    IN  PCHAR   InterfacesPath,
+    IN  PCHAR   InterfacePrefix,
+    IN  PCHAR   InterfaceName,
+    IN  BOOLEAN Save
+    )
+{
+    ULONG       Length;
+    HANDLE      InterfacesKey;
+    PCHAR       KeyName;
+    HANDLE      Key;
+    HANDLE      SaveKey;
+    NTSTATUS    status;
+
+    Trace("====>\n");
+
+    status = RegistryOpenSubKey(NULL,
+                                InterfacesPath,
+                                KEY_ALL_ACCESS,
+                                &InterfacesKey);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Length = (ULONG)((strlen(InterfacePrefix) +
+                      strlen(InterfaceName) +
+                      1) * sizeof (CHAR));
+
+    KeyName = __SettingsAllocate(Length);
+
+    status = STATUS_NO_MEMORY;
+    if (KeyName == NULL)
+        goto fail2;
+
+    status = RtlStringCbPrintfA(KeyName,
+                                Length,
+                                "%s%s",
+                                InterfacePrefix,
+                                InterfaceName);
+    ASSERT(NT_SUCCESS(status));
+
+    Trace("%s %s\\%s\n",
+          (Save) ? "FROM" : "TO",
+          InterfacesPath,
+          KeyName);
+
+    status = (!Save) ?
+        RegistryCreateSubKey(InterfacesKey,
+                             KeyName,
+                             REG_OPTION_NON_VOLATILE,
+                             &Key) :
+        RegistryOpenSubKey(InterfacesKey,
+                           KeyName,
+                           KEY_READ,
+                           &Key);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = (Save) ?
+        RegistryCreateSubKey(SettingsKey,
+                             SaveKeyName,
+                             REG_OPTION_NON_VOLATILE,
+                             &SaveKey) :
+        RegistryOpenSubKey(SettingsKey,
+                           SaveKeyName,
+                           KEY_READ,
+                           &SaveKey);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    status = (Save) ?
+        RegistryEnumerateValues(Key,
+                                SettingsCopyValue,
+                                (PVOID)SaveKey) :
+        // Restore
+        RegistryEnumerateValues(SaveKey,
+                                SettingsCopyValue,
+                                (PVOID)Key);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    RegistryCloseKey(SaveKey);
+
+    if (!Save)
+        (VOID) RegistryDeleteSubKey(SettingsKey, SaveKeyName);
+
+    RegistryCloseKey(Key);
+
+    __SettingsFree(KeyName);
+
+    RegistryCloseKey(InterfacesKey);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail5:
+    Error("fail5\n");
+
+    RegistryCloseKey(SaveKey);
+
+fail4:
+    Error("fail4\n");
+
+    RegistryCloseKey(Key);
+
+fail3:
+    Error("fail3\n");
+
+    __SettingsFree(KeyName);
+
+fail2:
+    Error("fail2\n");
+
+    RegistryCloseKey(InterfacesKey);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+#define IPV6_PATH "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\Nsi\\{eb004a11-9b1a-11d4-9123-0050047759bc}\\10"
+
+static VOID
+SettingsCopyIpVersion6Addresses(
+    IN  HANDLE  SettingsKey,
+    IN  PCHAR   ValueName,
+    IN  BOOLEAN Save
+    )
+{
+    HANDLE      ValueKey;
+    PVOID       Value;
+    ULONG       Length;
+    NTSTATUS    status;
+
+    Trace("====>\n");
+
+    status = RegistryOpenSubKey(NULL,
+                                IPV6_PATH,
+                                (Save) ? KEY_READ : KEY_ALL_ACCESS,
+                                &ValueKey);
+    if (!NT_SUCCESS(status))
+        goto done;
+
+    Trace("%s %s\\%s\n",
+          (Save) ? "FROM" : "TO",
+          IPV6_PATH,
+          ValueName);
+
+    if (Save) {
+        status = RegistryQueryBinaryValue(ValueKey,
+                                          ValueName,
+                                          &Value,
+                                          &Length);
+        if (NT_SUCCESS(status))
+            (VOID) RegistryUpdateBinaryValue(SettingsKey,
+                                             "IpVersion6Addresses",
+                                             Value,
+                                             Length);
+    } else { // Restore
+        status = RegistryQueryBinaryValue(SettingsKey,
+                                          "IpVersion6Addresses",
+                                          &Value,
+                                          &Length);
+        if (NT_SUCCESS(status))
+            (VOID) RegistryUpdateBinaryValue(ValueKey,
+                                             ValueName,
+                                             Value,
+                                             Length);
+    }
+
+    RegistryCloseKey(ValueKey);
+
+done:
+    Trace("<====\n");
+}
+
+#define INTERFACES_PATH(_Name) "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services\\" ## #_Name ## "\\Parameters\\Interfaces\\"
+
+static NTSTATUS
+SettingsCopy(
+     IN HANDLE      SettingsKey,
+     IN LPGUID      InterfaceGuid,
+     IN PNET_LUID   InterfaceLuid,
+     IN BOOLEAN     Save
+     )
+{
+    UNICODE_STRING  Unicode;
+    ULONG           Length;
+    PCHAR           GuidName;
+    PCHAR           LuidName;
+    NTSTATUS        status;
+
+    Trace("====>\n");
+
+    status = RtlStringFromGUID(InterfaceGuid, &Unicode);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Length = (ULONG)(((Unicode.Length / sizeof (WCHAR)) +
+                      1) * sizeof (CHAR));
+
+    GuidName = __SettingsAllocate(Length);
+
+    status = STATUS_NO_MEMORY;
+    if (GuidName == NULL)
+        goto fail2;
+
+    status = RtlStringCbPrintfA(GuidName,
+                                Length,
+                                "%wZ",
+                                &Unicode);
+    ASSERT(NT_SUCCESS(status));
+
+    (VOID) SettingsCopyInterface(SettingsKey,
+                                 "NetBT",
+                                 INTERFACES_PATH(NetBT),
+                                 "Tcpip_",
+                                 GuidName,
+                                 Save);
+
+    (VOID) SettingsCopyInterface(SettingsKey,
+                                 "Tcpip",
+                                 INTERFACES_PATH(Tcpip),
+                                 "",
+                                 GuidName,
+                                 Save);
+
+    (VOID) SettingsCopyInterface(SettingsKey,
+                                 "Tcpip6",
+                                 INTERFACES_PATH(Tcpip6),
+                                 "",
+                                 GuidName,
+                                 Save);
+
+    Length = (ULONG)(((sizeof (NET_LUID) * 2) +
+                      1) * sizeof (CHAR));
+
+    LuidName = __SettingsAllocate(Length);
+
+    status = STATUS_NO_MEMORY;
+    if (LuidName == NULL)
+        goto fail3;
+
+    status = RtlStringCbPrintfA(LuidName,
+                                Length,
+                                "%016llX",
+                                InterfaceLuid->Value);
+    ASSERT(NT_SUCCESS(status));
+
+    SettingsCopyIpVersion6Addresses(SettingsKey,
+                                    LuidName,
+                                    Save);
+
+    __SettingsFree(LuidName);
+
+    __SettingsFree(GuidName);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail3:
+    Error("fail3\n");
+
+    __SettingsFree(GuidName);
+
+fail2:
+    Error("fail2\n");
+
+    RtlFreeUnicodeString(&Unicode);
+
+fail1:
+    Error("fail1\n", status);
+
+    return status;
+}
+
+NTSTATUS
+SettingsSave(
+     IN HANDLE      SoftwareKey,
+     IN PWCHAR      Alias,
+     IN PWCHAR      Description,
+     IN LPGUID      InterfaceGuid,
+     IN PNET_LUID   InterfaceLuid
+     )
+{
+    HANDLE          SettingsKey;
+    NTSTATUS        status;
+
+    Info("FROM %ws (%ws)\n", Alias, Description);
+
+    status = RegistryCreateSubKey(SoftwareKey,
+                                  "Settings",
+                                  REG_OPTION_NON_VOLATILE,
+                                  &SettingsKey);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = SettingsCopy(SettingsKey, InterfaceGuid, InterfaceLuid, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    RegistryCloseKey(SettingsKey);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    Error("fail2\n");
+
+    RegistryCloseKey(SettingsKey);
+
+fail1:
+    Error("fail1\n", status);
+
+    return status;
+}
+
+NTSTATUS
+SettingsRestore(
+     IN HANDLE      SoftwareKey,
+     IN PWCHAR      Alias,
+     IN PWCHAR      Description,
+     IN LPGUID      InterfaceGuid,
+     IN PNET_LUID   InterfaceLuid
+     )
+{
+    HANDLE          SettingsKey;
+    NTSTATUS        status;
+
+    status = RegistryOpenSubKey(SoftwareKey,
+                                "Settings",
+                                KEY_ALL_ACCESS,
+                                &SettingsKey);
+    if (!NT_SUCCESS(status)) {
+        if (status == STATUS_OBJECT_NAME_NOT_FOUND)
+            goto done;
+
+        goto fail1;
+    }
+
+    Info("TO %ws (%ws)\n", Alias, Description);
+
+    status = SettingsCopy(SettingsKey, InterfaceGuid, InterfaceLuid, FALSE);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    RegistryCloseKey(SettingsKey);
+
+    (VOID) RegistryDeleteSubKey(SoftwareKey, "Settings");
+
+done:
+    return STATUS_SUCCESS;
+
+fail2:
+    Error("fail2\n");
+
+    RegistryCloseKey(SettingsKey);
+
+fail1:
+    Error("fail1\n", status);
+
+    return status;
+}
diff --git a/src/xenvif/settings.h b/src/xenvif/settings.h
new file mode 100644
index 0000000..7bd1824
--- /dev/null
+++ b/src/xenvif/settings.h
@@ -0,0 +1,53 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XENVIF_SETTINGS_H
+#define _XENVIF_SETTINGS_H
+
+extern NTSTATUS
+SettingsSave(
+     IN HANDLE      SoftwareKey,
+     IN PWCHAR      Alias,
+     IN PWCHAR      Description,
+     IN LPGUID      InterfaceGuid,
+     IN PNET_LUID   InterfaceLuid
+     );
+
+extern NTSTATUS
+SettingsRestore(
+     IN HANDLE      SoftwareKey,
+     IN PWCHAR      Alias,
+     IN PWCHAR      Description,
+     IN LPGUID      InterfaceGuid,
+     IN PNET_LUID   InterfaceLuid
+     );
+
+#endif  // _XENVIF_SETTINGS_H
diff --git a/vs2012/xenvif/xenvif.vcxproj b/vs2012/xenvif/xenvif.vcxproj
index c2c37d1..13be8a2 100644
--- a/vs2012/xenvif/xenvif.vcxproj
+++ b/vs2012/xenvif/xenvif.vcxproj
@@ -87,6 +87,7 @@
     <ClCompile Include="../../src/xenvif/pdo.c" />
     <ClCompile Include="../../src/xenvif/receiver.c" />
     <ClCompile Include="../../src/xenvif/registry.c" />
+    <ClCompile Include="../../src/xenvif/settings.c" />
     <ClCompile Include="../../src/xenvif/thread.c" />
     <ClCompile Include="../../src/xenvif/transmitter.c" />
     <ClCompile Include="../../src/xenvif/vif.c" />
diff --git a/vs2013/xenvif/xenvif.vcxproj b/vs2013/xenvif/xenvif.vcxproj
index 879fe1d..19ac1ed 100644
--- a/vs2013/xenvif/xenvif.vcxproj
+++ b/vs2013/xenvif/xenvif.vcxproj
@@ -90,6 +90,7 @@
     <ClCompile Include="../../src/xenvif/pdo.c" />
     <ClCompile Include="../../src/xenvif/receiver.c" />
     <ClCompile Include="../../src/xenvif/registry.c" />
+    <ClCompile Include="../../src/xenvif/settings.c" />
     <ClCompile Include="../../src/xenvif/thread.c" />
     <ClCompile Include="../../src/xenvif/transmitter.c" />
     <ClCompile Include="../../src/xenvif/vif.c" />
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:30:44 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:30:44 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoUu-0004sQ-CR; Wed, 08 Jul 2015 12:30:44 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoUs-0004qw-Dn
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:30:42 +0000
Received: from [193.109.254.147] by server-3.bemta-14.messagelabs.com id
	B3/03-18676-1F71D955; Wed, 08 Jul 2015 12:30:41 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1436358639!30309854!1
X-Originating-IP: [74.125.82.42]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17229 invoked from network); 8 Jul 2015 12:30:39 -0000
Received: from mail-wg0-f42.google.com (HELO mail-wg0-f42.google.com)
	(74.125.82.42)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:30:39 -0000
Received: by wgxm20 with SMTP id m20so11123759wgx.3
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:30:39 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=kp3ZpFoPpckGuBXbDaB0dmsLUTwZG6ENu/UBmpXj++s=;
	b=Un8Z3JR8i8aP8Ui8HM9CtAQWky/wl33KoF4CbFhGfQ0e8KITLVYSKdktaTSwid9rRb
	GLylPdnV2YpgRmuYEca9Q9Xb2xv68YYWR864hIXqzkmFlUuFdHx77XRBYg3OpeMZawkO
	t9ICWCMH7T3P3iPpXTuWIXT5TG+jSn3YAqqbKvh2Wji3gmTSW4wNJDs6TlEDsCNIV4CL
	tDv++DNwJO1Hz+GMUkkGlOnyH7EHXkGYglVUQNNRyHPwD4K323HFD1nwFZN/NzmRGSdx
	4By2B33h7sO153k/OUA5XYZlFRYy9Mbwl6NCpgCSHSAgDReGv5G5KQTB4L2yWQS2wiWK
	Ma4w==
X-Received: by 10.180.11.200 with SMTP id s8mr109956350wib.17.1436358639160;
	Wed, 08 Jul 2015 05:30:39 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ee1sm2723936wic.8.2015.07.08.05.30.38
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:30:38 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:30:18 +0100
Message-Id: <1436358618-11260-9-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
References: <1436358618-11260-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 8/8] Add functions to backup and restore
	network settings
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

In PdoStartDevice(), if an aliasing emulated device is found in the MIB
interface table, back up its network settings to a private area under the
the PDO software key before requesting reboot.

In a later boot, if the emulated device has been unplugged, restore the
network settings from the private area to the PDO such that it will start
with the same configuration as the emulated device it has replaced.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/pdo.c             |  91 +++++++-
 src/xenvif/settings.c        | 495 +++++++++++++++++++++++++++++++++++++++++++
 src/xenvif/settings.h        |  53 +++++
 vs2012/xenvif/xenvif.vcxproj |   1 +
 vs2013/xenvif/xenvif.vcxproj |   1 +
 5 files changed, 637 insertions(+), 4 deletions(-)
 create mode 100644 src/xenvif/settings.c
 create mode 100644 src/xenvif/settings.h

diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 140b618..8b6fbd4 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -53,6 +53,7 @@
 #include "registry.h"
 #include "thread.h"
 #include "link.h"
+#include "settings.h"
 #include "dbg_print.h"
 #include "assert.h"
 #include "util.h"
@@ -1071,6 +1072,51 @@ PdoS3ToS4(
     Trace("(%s) <====\n", __PdoGetName(Pdo));
 }
 
+static NTSTATUS
+PdoGetInterfaceGuid(
+    IN  PXENVIF_PDO Pdo,
+    IN  HANDLE      Key,
+    OUT LPGUID      Guid
+    )
+{
+    PANSI_STRING    Ansi;
+    UNICODE_STRING  Unicode;
+    NTSTATUS        status;
+
+    UNREFERENCED_PARAMETER(Pdo);
+
+    status = RegistryQuerySzValue(Key,
+                                  "NetCfgInstanceId",
+                                  &Ansi);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi[0], TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = RtlGUIDFromString(&Unicode, Guid);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    return STATUS_SUCCESS;
+
+fail3:
+    Error("fail3\n");
+
+    RtlFreeUnicodeString(&Unicode);
+
+fail2:
+    Error("fail2\n");
+
+    RegistryFreeSzValue(Ansi);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
 static DECLSPEC_NOINLINE NTSTATUS
 PdoStartDevice(
     IN  PXENVIF_PDO     Pdo,
@@ -1081,8 +1127,10 @@ PdoStartDevice(
     VOID                (*__FreeMibTable)(PVOID);
     PMIB_IF_TABLE2      Table;
     ULONG               Index;
+    PMIB_IF_ROW2        Row;
     PIO_STACK_LOCATION  StackLocation;
     HANDLE              Key;
+    GUID                Guid;
     NTSTATUS            status;
 
     status = STATUS_UNSUCCESSFUL;
@@ -1115,8 +1163,13 @@ PdoStartDevice(
     if (!NT_SUCCESS(status))
         goto fail6;
 
+    //
+    // Look for a network interface with the same permanent address
+    // that is already up. If there is one then it must be an
+    // aliasing emulated device, so save its settings.
+    //
     for (Index = 0; Index < Table->NumEntries; Index++) {
-        PMIB_IF_ROW2    Row = &Table->Table[Index];
+        Row = &Table->Table[Index];
 
         if (!(Row->InterfaceAndOperStatusFlags.HardwareInterface) ||
             !(Row->InterfaceAndOperStatusFlags.ConnectorPresent))
@@ -1128,11 +1181,34 @@ PdoStartDevice(
         if (Row->PhysicalAddressLength != sizeof (ETHERNET_ADDRESS))
             continue;
 
-        status = STATUS_UNSUCCESSFUL;
         if (memcmp(Row->PermanentPhysicalAddress,
                    __PdoGetPermanentAddress(Pdo),
-                   sizeof (ETHERNET_ADDRESS)) == 0)
-            goto fail7;
+                   sizeof (ETHERNET_ADDRESS)) != 0)
+            continue;
+
+        status = STATUS_UNSUCCESSFUL;
+        goto fail7;
+    }
+
+    //
+    // If there is a stack bound then restore any settings that
+    // may have been saved from an aliasing emulated device.
+    //
+    status = PdoGetInterfaceGuid(Pdo, Key, &Guid);
+    if (NT_SUCCESS(status)) {
+        for (Index = 0; Index < Table->NumEntries; Index++) {
+            Row = &Table->Table[Index];
+
+            if (!IsEqualGUID(&Row->InterfaceGuid, &Guid))
+                continue;
+
+            (VOID) SettingsRestore(Key,
+                                   Row->Alias,
+                                   Row->Description,
+                                   &Row->InterfaceGuid,
+                                   &Row->InterfaceLuid);
+            break;
+        }
     }
 
     StackLocation = IoGetCurrentIrpStackLocation(Irp);
@@ -1156,11 +1232,18 @@ fail8:
     Error("fail8\n");
 
     __FreeMibTable(Table);
+
     goto fail6;
 
 fail7:
     Error("fail7\n");
 
+    (VOID) SettingsSave(Key,
+                        Row->Alias,
+                        Row->Description,
+                        &Row->InterfaceGuid,
+                        &Row->InterfaceLuid);
+
     DriverRequestReboot();
     __FreeMibTable(Table);
 
diff --git a/src/xenvif/settings.c b/src/xenvif/settings.c
new file mode 100644
index 0000000..145e83d
--- /dev/null
+++ b/src/xenvif/settings.c
@@ -0,0 +1,495 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <ntddk.h>
+#include <ntstrsafe.h>
+
+#include "registry.h"
+#include "driver.h"
+#include "dbg_print.h"
+#include "assert.h"
+#include "util.h"
+
+#define SETTINGS_TAG 'TTES'
+
+static FORCEINLINE PVOID
+__SettingsAllocate(
+    IN  ULONG   Length
+    )
+{
+    return __AllocateNonPagedPoolWithTag(Length, SETTINGS_TAG);
+}
+
+static FORCEINLINE VOID
+__SettingsFree(
+    IN  PVOID   Buffer
+    )
+{
+    __FreePoolWithTag(Buffer, SETTINGS_TAG);
+}
+
+static NTSTATUS
+SettingsCopyValue(
+    IN  PVOID           Context,
+    IN  HANDLE          SourceKey,
+    IN  PANSI_STRING    Name,
+    IN  ULONG           Type
+    )
+{
+    HANDLE              DestinationKey = (HANDLE)Context;
+    NTSTATUS            status;
+
+    Trace("%Z\n", Name);
+
+    switch (Type) {
+    case REG_DWORD: {
+        ULONG   Value;
+
+        status = RegistryQueryDwordValue(SourceKey,
+                                         Name->Buffer,
+                                         &Value);
+        if (NT_SUCCESS(status))
+            (VOID) RegistryUpdateDwordValue(DestinationKey,
+                                            Name->Buffer,
+                                            Value);
+
+        break;
+    }
+    case REG_SZ:
+    case REG_MULTI_SZ: {
+        PANSI_STRING    Value;
+
+        status = RegistryQuerySzValue(SourceKey,
+                                      Name->Buffer,
+                                      &Value);
+        if (NT_SUCCESS(status)) {
+            (VOID) RegistryUpdateSzValue(DestinationKey,
+                                         Name->Buffer,
+                                         Value);
+            RegistryFreeSzValue(Value);
+        }
+
+        break;
+    }
+    case REG_BINARY: {
+        PVOID   Value;
+        ULONG   Length;
+
+        status = RegistryQueryBinaryValue(SourceKey,
+                                          Name->Buffer,
+                                          &Value,
+                                          &Length);
+        if (NT_SUCCESS(status)) {
+            (VOID) RegistryUpdateBinaryValue(DestinationKey,
+                                             Name->Buffer,
+                                             Value,
+                                             Length);
+            RegistryFreeBinaryValue(Value);
+        }
+
+        break;
+    }
+    default:
+        ASSERT(FALSE);
+    }
+
+    return STATUS_SUCCESS;
+}
+
+static NTSTATUS
+SettingsCopyInterface(
+    IN  HANDLE  SettingsKey,
+    IN  PCHAR   SaveKeyName,
+    IN  PCHAR   InterfacesPath,
+    IN  PCHAR   InterfacePrefix,
+    IN  PCHAR   InterfaceName,
+    IN  BOOLEAN Save
+    )
+{
+    ULONG       Length;
+    HANDLE      InterfacesKey;
+    PCHAR       KeyName;
+    HANDLE      Key;
+    HANDLE      SaveKey;
+    NTSTATUS    status;
+
+    Trace("====>\n");
+
+    status = RegistryOpenSubKey(NULL,
+                                InterfacesPath,
+                                KEY_ALL_ACCESS,
+                                &InterfacesKey);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Length = (ULONG)((strlen(InterfacePrefix) +
+                      strlen(InterfaceName) +
+                      1) * sizeof (CHAR));
+
+    KeyName = __SettingsAllocate(Length);
+
+    status = STATUS_NO_MEMORY;
+    if (KeyName == NULL)
+        goto fail2;
+
+    status = RtlStringCbPrintfA(KeyName,
+                                Length,
+                                "%s%s",
+                                InterfacePrefix,
+                                InterfaceName);
+    ASSERT(NT_SUCCESS(status));
+
+    Trace("%s %s\\%s\n",
+          (Save) ? "FROM" : "TO",
+          InterfacesPath,
+          KeyName);
+
+    status = (!Save) ?
+        RegistryCreateSubKey(InterfacesKey,
+                             KeyName,
+                             REG_OPTION_NON_VOLATILE,
+                             &Key) :
+        RegistryOpenSubKey(InterfacesKey,
+                           KeyName,
+                           KEY_READ,
+                           &Key);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = (Save) ?
+        RegistryCreateSubKey(SettingsKey,
+                             SaveKeyName,
+                             REG_OPTION_NON_VOLATILE,
+                             &SaveKey) :
+        RegistryOpenSubKey(SettingsKey,
+                           SaveKeyName,
+                           KEY_READ,
+                           &SaveKey);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    status = (Save) ?
+        RegistryEnumerateValues(Key,
+                                SettingsCopyValue,
+                                (PVOID)SaveKey) :
+        // Restore
+        RegistryEnumerateValues(SaveKey,
+                                SettingsCopyValue,
+                                (PVOID)Key);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    RegistryCloseKey(SaveKey);
+
+    if (!Save)
+        (VOID) RegistryDeleteSubKey(SettingsKey, SaveKeyName);
+
+    RegistryCloseKey(Key);
+
+    __SettingsFree(KeyName);
+
+    RegistryCloseKey(InterfacesKey);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail5:
+    Error("fail5\n");
+
+    RegistryCloseKey(SaveKey);
+
+fail4:
+    Error("fail4\n");
+
+    RegistryCloseKey(Key);
+
+fail3:
+    Error("fail3\n");
+
+    __SettingsFree(KeyName);
+
+fail2:
+    Error("fail2\n");
+
+    RegistryCloseKey(InterfacesKey);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+#define IPV6_PATH "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\Nsi\\{eb004a11-9b1a-11d4-9123-0050047759bc}\\10"
+
+static VOID
+SettingsCopyIpVersion6Addresses(
+    IN  HANDLE  SettingsKey,
+    IN  PCHAR   ValueName,
+    IN  BOOLEAN Save
+    )
+{
+    HANDLE      ValueKey;
+    PVOID       Value;
+    ULONG       Length;
+    NTSTATUS    status;
+
+    Trace("====>\n");
+
+    status = RegistryOpenSubKey(NULL,
+                                IPV6_PATH,
+                                (Save) ? KEY_READ : KEY_ALL_ACCESS,
+                                &ValueKey);
+    if (!NT_SUCCESS(status))
+        goto done;
+
+    Trace("%s %s\\%s\n",
+          (Save) ? "FROM" : "TO",
+          IPV6_PATH,
+          ValueName);
+
+    if (Save) {
+        status = RegistryQueryBinaryValue(ValueKey,
+                                          ValueName,
+                                          &Value,
+                                          &Length);
+        if (NT_SUCCESS(status))
+            (VOID) RegistryUpdateBinaryValue(SettingsKey,
+                                             "IpVersion6Addresses",
+                                             Value,
+                                             Length);
+    } else { // Restore
+        status = RegistryQueryBinaryValue(SettingsKey,
+                                          "IpVersion6Addresses",
+                                          &Value,
+                                          &Length);
+        if (NT_SUCCESS(status))
+            (VOID) RegistryUpdateBinaryValue(ValueKey,
+                                             ValueName,
+                                             Value,
+                                             Length);
+    }
+
+    RegistryCloseKey(ValueKey);
+
+done:
+    Trace("<====\n");
+}
+
+#define INTERFACES_PATH(_Name) "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services\\" ## #_Name ## "\\Parameters\\Interfaces\\"
+
+static NTSTATUS
+SettingsCopy(
+     IN HANDLE      SettingsKey,
+     IN LPGUID      InterfaceGuid,
+     IN PNET_LUID   InterfaceLuid,
+     IN BOOLEAN     Save
+     )
+{
+    UNICODE_STRING  Unicode;
+    ULONG           Length;
+    PCHAR           GuidName;
+    PCHAR           LuidName;
+    NTSTATUS        status;
+
+    Trace("====>\n");
+
+    status = RtlStringFromGUID(InterfaceGuid, &Unicode);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Length = (ULONG)(((Unicode.Length / sizeof (WCHAR)) +
+                      1) * sizeof (CHAR));
+
+    GuidName = __SettingsAllocate(Length);
+
+    status = STATUS_NO_MEMORY;
+    if (GuidName == NULL)
+        goto fail2;
+
+    status = RtlStringCbPrintfA(GuidName,
+                                Length,
+                                "%wZ",
+                                &Unicode);
+    ASSERT(NT_SUCCESS(status));
+
+    (VOID) SettingsCopyInterface(SettingsKey,
+                                 "NetBT",
+                                 INTERFACES_PATH(NetBT),
+                                 "Tcpip_",
+                                 GuidName,
+                                 Save);
+
+    (VOID) SettingsCopyInterface(SettingsKey,
+                                 "Tcpip",
+                                 INTERFACES_PATH(Tcpip),
+                                 "",
+                                 GuidName,
+                                 Save);
+
+    (VOID) SettingsCopyInterface(SettingsKey,
+                                 "Tcpip6",
+                                 INTERFACES_PATH(Tcpip6),
+                                 "",
+                                 GuidName,
+                                 Save);
+
+    Length = (ULONG)(((sizeof (NET_LUID) * 2) +
+                      1) * sizeof (CHAR));
+
+    LuidName = __SettingsAllocate(Length);
+
+    status = STATUS_NO_MEMORY;
+    if (LuidName == NULL)
+        goto fail3;
+
+    status = RtlStringCbPrintfA(LuidName,
+                                Length,
+                                "%016llX",
+                                InterfaceLuid->Value);
+    ASSERT(NT_SUCCESS(status));
+
+    SettingsCopyIpVersion6Addresses(SettingsKey,
+                                    LuidName,
+                                    Save);
+
+    __SettingsFree(LuidName);
+
+    __SettingsFree(GuidName);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail3:
+    Error("fail3\n");
+
+    __SettingsFree(GuidName);
+
+fail2:
+    Error("fail2\n");
+
+    RtlFreeUnicodeString(&Unicode);
+
+fail1:
+    Error("fail1\n", status);
+
+    return status;
+}
+
+NTSTATUS
+SettingsSave(
+     IN HANDLE      SoftwareKey,
+     IN PWCHAR      Alias,
+     IN PWCHAR      Description,
+     IN LPGUID      InterfaceGuid,
+     IN PNET_LUID   InterfaceLuid
+     )
+{
+    HANDLE          SettingsKey;
+    NTSTATUS        status;
+
+    Info("FROM %ws (%ws)\n", Alias, Description);
+
+    status = RegistryCreateSubKey(SoftwareKey,
+                                  "Settings",
+                                  REG_OPTION_NON_VOLATILE,
+                                  &SettingsKey);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = SettingsCopy(SettingsKey, InterfaceGuid, InterfaceLuid, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    RegistryCloseKey(SettingsKey);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    Error("fail2\n");
+
+    RegistryCloseKey(SettingsKey);
+
+fail1:
+    Error("fail1\n", status);
+
+    return status;
+}
+
+NTSTATUS
+SettingsRestore(
+     IN HANDLE      SoftwareKey,
+     IN PWCHAR      Alias,
+     IN PWCHAR      Description,
+     IN LPGUID      InterfaceGuid,
+     IN PNET_LUID   InterfaceLuid
+     )
+{
+    HANDLE          SettingsKey;
+    NTSTATUS        status;
+
+    status = RegistryOpenSubKey(SoftwareKey,
+                                "Settings",
+                                KEY_ALL_ACCESS,
+                                &SettingsKey);
+    if (!NT_SUCCESS(status)) {
+        if (status == STATUS_OBJECT_NAME_NOT_FOUND)
+            goto done;
+
+        goto fail1;
+    }
+
+    Info("TO %ws (%ws)\n", Alias, Description);
+
+    status = SettingsCopy(SettingsKey, InterfaceGuid, InterfaceLuid, FALSE);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    RegistryCloseKey(SettingsKey);
+
+    (VOID) RegistryDeleteSubKey(SoftwareKey, "Settings");
+
+done:
+    return STATUS_SUCCESS;
+
+fail2:
+    Error("fail2\n");
+
+    RegistryCloseKey(SettingsKey);
+
+fail1:
+    Error("fail1\n", status);
+
+    return status;
+}
diff --git a/src/xenvif/settings.h b/src/xenvif/settings.h
new file mode 100644
index 0000000..7bd1824
--- /dev/null
+++ b/src/xenvif/settings.h
@@ -0,0 +1,53 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XENVIF_SETTINGS_H
+#define _XENVIF_SETTINGS_H
+
+extern NTSTATUS
+SettingsSave(
+     IN HANDLE      SoftwareKey,
+     IN PWCHAR      Alias,
+     IN PWCHAR      Description,
+     IN LPGUID      InterfaceGuid,
+     IN PNET_LUID   InterfaceLuid
+     );
+
+extern NTSTATUS
+SettingsRestore(
+     IN HANDLE      SoftwareKey,
+     IN PWCHAR      Alias,
+     IN PWCHAR      Description,
+     IN LPGUID      InterfaceGuid,
+     IN PNET_LUID   InterfaceLuid
+     );
+
+#endif  // _XENVIF_SETTINGS_H
diff --git a/vs2012/xenvif/xenvif.vcxproj b/vs2012/xenvif/xenvif.vcxproj
index c2c37d1..13be8a2 100644
--- a/vs2012/xenvif/xenvif.vcxproj
+++ b/vs2012/xenvif/xenvif.vcxproj
@@ -87,6 +87,7 @@
     <ClCompile Include="../../src/xenvif/pdo.c" />
     <ClCompile Include="../../src/xenvif/receiver.c" />
     <ClCompile Include="../../src/xenvif/registry.c" />
+    <ClCompile Include="../../src/xenvif/settings.c" />
     <ClCompile Include="../../src/xenvif/thread.c" />
     <ClCompile Include="../../src/xenvif/transmitter.c" />
     <ClCompile Include="../../src/xenvif/vif.c" />
diff --git a/vs2013/xenvif/xenvif.vcxproj b/vs2013/xenvif/xenvif.vcxproj
index 879fe1d..19ac1ed 100644
--- a/vs2013/xenvif/xenvif.vcxproj
+++ b/vs2013/xenvif/xenvif.vcxproj
@@ -90,6 +90,7 @@
     <ClCompile Include="../../src/xenvif/pdo.c" />
     <ClCompile Include="../../src/xenvif/receiver.c" />
     <ClCompile Include="../../src/xenvif/registry.c" />
+    <ClCompile Include="../../src/xenvif/settings.c" />
     <ClCompile Include="../../src/xenvif/thread.c" />
     <ClCompile Include="../../src/xenvif/transmitter.c" />
     <ClCompile Include="../../src/xenvif/vif.c" />
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:35:13 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:35:13 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoZF-0006uX-Hw; Wed, 08 Jul 2015 12:35:13 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoZE-0006ty-3Y
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:35:12 +0000
Received: from [85.158.137.68] by server-10.bemta-3.messagelabs.com id
	D6/B8-03895-FF81D955; Wed, 08 Jul 2015 12:35:11 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-31.messagelabs.com!1436358906!21405215!1
X-Originating-IP: [209.85.212.173]
X-SpamReason: No, hits=1.2 required=7.0 tests=HOT_NASTY,UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26769 invoked from network); 8 Jul 2015 12:35:06 -0000
Received: from mail-wi0-f173.google.com (HELO mail-wi0-f173.google.com)
	(209.85.212.173)
	by server-14.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:35:06 -0000
Received: by wifm2 with SMTP id m2so88117546wif.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:35:06 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=3fFNqGqZ3VKU3txTS6ppIaIw1aBUFnG6I+xp24HxJe0=;
	b=IGNrus528pYoZUIOrGIMAb0laXh9T8WQHjkCkiy+65A9OBW1oxxNnC63iyXXBmDGnk
	fbhZXRXdDYFkTV9eFxtrgqLsCr7rh2SgMwcDNFOlfvhApQmhFlY+AdCLF9Q5Y9SpsRdh
	RrnKaXzkBTZaZKvB/qHQMZdb1rAVpFoRzSPvLJz1t3PL0+EMcuTqWMEN2p8f2C2uNymL
	UWaXjwAMsVSrlzE50SAXWRQte4WuxoEv7CgJPZ3mY29DRpK7N17RwNMaaqcEP3KooToM
	gR0WRF7WDcvoM+r2MuCpeF171gF7Z+S0dlLdj8puDjPif2FKuqCNjEeOn8C0m33MbqSW
	gDUw==
X-Received: by 10.194.95.71 with SMTP id di7mr19560010wjb.125.1436358906111;
	Wed, 08 Jul 2015 05:35:06 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id um5sm3296737wjc.1.2015.07.08.05.35.05
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:35:05 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:34:54 +0100
Message-Id: <1436358894-11380-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove code that copies network settings
	from the co-installer
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This functionality is now implemented by XENVIF.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 1640 +++------------------------------------------------
 1 file changed, 70 insertions(+), 1570 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 0905205..fce8abd 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -210,1452 +210,57 @@ __FunctionName(
 #undef  _NAME
 }
 
-static HKEY
-OpenSoftwareKey(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData
-    )
-{
-    HKEY                    Key;
-    HRESULT                 Error;
-
-    Key = SetupDiOpenDevRegKey(DeviceInfoSet,
-                               DeviceInfoData,
-                               DICS_FLAG_GLOBAL,
-                               0,
-                               DIREG_DRV,
-                               KEY_ALL_ACCESS);
-    if (Key == INVALID_HANDLE_VALUE) {
-        SetLastError(ERROR_PATH_NOT_FOUND);
-        goto fail1;
-    }
-
-    return Key;
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static PTCHAR
-GetProperty(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData,
-    IN  DWORD               Index
-    )
-{
-    DWORD                   Type;
-    DWORD                   PropertyLength;
-    PTCHAR                  Property;
-    HRESULT                 Error;
-
-    if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          Index,
-                                          &Type,
-                                          NULL,
-                                          0,
-                                          &PropertyLength)) {
-        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
-            goto fail1;
-    }
-
-    if (Type != REG_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail2;
-    }
-
-    PropertyLength += sizeof (TCHAR);
-
-    Property = calloc(1, PropertyLength);
-    if (Property == NULL)
-        goto fail3;
-
-    if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          Index,
-                                          NULL,
-                                          (PBYTE)Property,
-                                          PropertyLength,
-                                          NULL))
-        goto fail4;
-
-    return Property;
-
-fail4:
-    free(Property);
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static BOOLEAN
-SetFriendlyName(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData
-    )
-{
-    PTCHAR                  Description;
-    PTCHAR                  Location;
-    TCHAR                   FriendlyName[MAX_PATH];
-    DWORD                   FriendlyNameLength;
-    HRESULT                 Result;
-    HRESULT                 Error;
-
-    Description = GetProperty(DeviceInfoSet,
-                              DeviceInfoData,
-                              SPDRP_DEVICEDESC);
-    if (Description == NULL)
-        goto fail1;
-
-    Location = GetProperty(DeviceInfoSet,
-                           DeviceInfoData,
-                           SPDRP_LOCATION_INFORMATION);
-    if (Location == NULL)
-        goto fail2;
-
-    Result = StringCbPrintf(FriendlyName,
-                            MAX_PATH,
-                            "%s #%s",
-                            Description,
-                            Location);
-    if (!SUCCEEDED(Result))
-        goto fail3;
-
-    FriendlyNameLength = (DWORD)(strlen(FriendlyName) + sizeof (TCHAR));
-
-    if (!SetupDiSetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          SPDRP_FRIENDLYNAME,
-                                          (PBYTE)FriendlyName,
-                                          FriendlyNameLength))
-        goto fail4;
-
-    Log("%s", FriendlyName);
-
-    free(Location);
-
-    free(Description);
-
-    return TRUE;
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-    free(Location);
-
-fail2:
-    Log("fail2");
-
-    free(Description);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-ParseMacAddress(
-    IN  PCHAR               Buffer,
-    OUT PETHERNET_ADDRESS   Address
-    )
-{
-    ULONG                   Length;
-    HRESULT                 Error;
-
-    Length = 0;
-    for (;;) {
-        CHAR    Character;
-        UCHAR   Byte;
-
-        Character = *Buffer++;
-        if (Character == '\0')
-            break;
-
-        if (Character >= '0' && Character <= '9')
-            Byte = Character - '0';
-        else if (Character >= 'A' && Character <= 'F')
-            Byte = 0x0A + Character - 'A';
-        else if (Character >= 'a' && Character <= 'f')
-            Byte = 0x0A + Character - 'a';
-        else
-            break;
-
-        Byte <<= 4;
-
-        Character = *Buffer++;
-        if (Character == '\0')
-            break;
-
-        if (Character >= '0' && Character <= '9')
-            Byte += Character - '0';
-        else if (Character >= 'A' && Character <= 'F')
-            Byte += 0x0A + Character - 'A';
-        else if (Character >= 'a' && Character <= 'f')
-            Byte += 0x0A + Character - 'a';
-        else
-            break;
-
-        Address->Byte[Length++] = Byte;
-
-        // Skip over any separator
-        if (*Buffer == ':' || *Buffer == '-')
-            Buffer++;
-    }
-
-    if (Length != ETHERNET_ADDRESS_LENGTH) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail1;
-    }
-
-    return TRUE;
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-
-static BOOLEAN
-GetPermanentAddress(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData,
-    OUT PETHERNET_ADDRESS   Address
-    )
-{
-    PTCHAR                  Location;
-    HRESULT                 Error;
-    HKEY                    AddressesKey;
-    DWORD                   MaxValueLength;
-    DWORD                   BufferLength;
-    PTCHAR                  Buffer;
-    DWORD                   Type;
-    BOOLEAN                 Success;
-
-    Location = GetProperty(DeviceInfoSet,
-                           DeviceInfoData,
-                           SPDRP_LOCATION_INFORMATION);
-    if (Location == NULL)
-        goto fail1;
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         ADDRESSES_KEY,
-                         0,
-                         KEY_READ,
-                         &AddressesKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    Error = RegQueryInfoKey(AddressesKey,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            &MaxValueLength,
-                            NULL,
-                            NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    BufferLength = MaxValueLength + sizeof (TCHAR);
-
-    Buffer = calloc(1, BufferLength);
-    if (Buffer == NULL)
-        goto fail4;
-
-    Error = RegQueryValueEx(AddressesKey,
-                            Location,
-                            NULL,
-                            &Type,
-                            (LPBYTE)Buffer,
-                            &BufferLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail5;
-    }
-
-    if (Type != REG_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail6;
-    }
-
-    Success = ParseMacAddress(Buffer, Address);
-    if (!Success)
-        goto fail7;
-
-    free(Buffer);
-
-    RegCloseKey(AddressesKey);
-
-    free(Location);
-
-    Log("%02X:%02X:%02X:%02X:%02X:%02X",
-        Address->Byte[0],
-        Address->Byte[1],
-        Address->Byte[2],
-        Address->Byte[3],
-        Address->Byte[4],
-        Address->Byte[5]);
-
-    return TRUE;
-
-fail7:
-    Log("fail7");
-
-fail6:
-    Log("fail6");
-
-fail5:
-    Log("fail5");
-
-    free(Buffer);
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-    RegCloseKey(AddressesKey);
-
-fail2:
-    Log("fail2");
-
-    free(Location);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-GetNetLuid(
-    IN  PETHERNET_ADDRESS   Address,
-    OUT PNET_LUID           *NetLuid
-    )
-{
-    PMIB_IF_TABLE2          Table;
-    DWORD                   Index;
-    PMIB_IF_ROW2            Row;
-    HRESULT                 Error;
-
-    Error = GetIfTable2(&Table);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    for (Index = 0; Index < Table->NumEntries; Index++) {
-        Row = &Table->Table[Index];
-
-        if (!(Row->InterfaceAndOperStatusFlags.HardwareInterface) ||
-            !(Row->InterfaceAndOperStatusFlags.ConnectorPresent))
-            continue;
-
-        if (Row->OperStatus != IfOperStatusUp)
-            continue;
-
-        if (Row->PhysicalAddressLength != sizeof (ETHERNET_ADDRESS))
-            continue;
-
-        if (memcmp(Row->PhysicalAddress,
-                   Address,
-                   sizeof (ETHERNET_ADDRESS)) == 0)
-            goto found;
-    }
-
-    *NetLuid = NULL;
-    goto done;
-
-found:
-    *NetLuid = calloc(1, sizeof (NET_LUID));
-    if (*NetLuid == NULL)
-        goto fail2;
-
-    (*NetLuid)->Value = Row->InterfaceLuid.Value;
-
-done:
-    FreeMibTable(Table);
-
-    return TRUE;
-
-fail2:
-    Log("fail2");
-
-    FreeMibTable(Table);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-OpenClassKey(
-    IN  const GUID  *Guid,
-    OUT PHKEY       Key
-    )
-{   
-    TCHAR           KeyName[MAX_PATH];
-    HRESULT         Result;
-    HRESULT         Error;
-
-    Result = StringCbPrintf(KeyName,
-                            MAX_PATH,
-                            "%s\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
-                            CLASS_KEY,
-                            Guid->Data1,
-                            Guid->Data2,
-                            Guid->Data3,
-                            Guid->Data4[0],
-                            Guid->Data4[1],
-                            Guid->Data4[2],
-                            Guid->Data4[3],
-                            Guid->Data4[4],
-                            Guid->Data4[5],
-                            Guid->Data4[6],
-                            Guid->Data4[7]);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail1;
-    }
-
-    Log("%s", KeyName);
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         KeyName,
-                         0,
-                         KEY_READ,
-                         Key);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    return TRUE;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-FindAliasSoftwareKeyName(
-    IN  PETHERNET_ADDRESS   Address,
-    OUT PTCHAR              *Name
-    )
-{
-    const GUID              *Guid = &GUID_DEVCLASS_NET;
-    BOOLEAN                 Success;
-    PNET_LUID               NetLuid;
-    HKEY                    NetKey;
-    HRESULT                 Error;
-    DWORD                   SubKeys;
-    DWORD                   MaxSubKeyLength;
-    DWORD                   SubKeyLength;
-    PTCHAR                  SubKeyName;
-    DWORD                   Index;
-    HKEY                    SubKey;
-    DWORD                   NameLength;
-    HRESULT                 Result;
-
-    Log("====>");
-
-    Success = GetNetLuid(Address, &NetLuid);
-    if (!Success)
-        goto fail1;
-
-    *Name = NULL;
-
-    if (NetLuid == NULL)
-        goto done;
-
-    Log("%08x.%08x",
-        NetLuid->Info.IfType,
-        NetLuid->Info.NetLuidIndex);
-
-    Success = OpenClassKey(Guid, &NetKey);
-    if (!Success)
-        goto fail2;
-
-    Error = RegQueryInfoKey(NetKey,
-                            NULL,
-                            NULL,
-                            NULL,
-                            &SubKeys,
-                            &MaxSubKeyLength,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
-
-    SubKeyName = malloc(SubKeyLength);
-    if (SubKeyName == NULL)
-        goto fail4;
-
-    for (Index = 0; Index < SubKeys; Index++) {
-        DWORD   Length;
-        DWORD   Type;
-        DWORD   IfType;
-        DWORD   NetLuidIndex;
-
-        SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
-        memset(SubKeyName, 0, SubKeyLength);
-
-        Error = RegEnumKeyEx(NetKey,
-                             Index,
-                             (LPTSTR)SubKeyName,
-                             &SubKeyLength,
-                             NULL,
-                             NULL,
-                             NULL,
-                             NULL);
-        if (Error != ERROR_SUCCESS) {
-            SetLastError(Error);
-            goto fail5;
-        }
-
-        Error = RegOpenKeyEx(NetKey,
-                             SubKeyName,
-                             0,
-                             KEY_READ,
-                             &SubKey);
-        if (Error != ERROR_SUCCESS)
-            continue;
-
-        Length = sizeof (DWORD);
-        Error = RegQueryValueEx(SubKey,
-                                "*IfType",
-                                NULL,
-                                &Type,
-                                (LPBYTE)&IfType,
-                                &Length);
-        if (Error != ERROR_SUCCESS ||
-            Type != REG_DWORD)
-            goto loop;
-
-        Length = sizeof (DWORD);
-        Error = RegQueryValueEx(SubKey,
-                                "NetLuidIndex",
-                                NULL,
-                                &Type,
-                                (LPBYTE)&NetLuidIndex,
-                                &Length);
-        if (Error != ERROR_SUCCESS ||
-            Type != REG_DWORD)
-            goto loop;
-
-        if (NetLuid->Info.IfType == IfType &&
-            NetLuid->Info.NetLuidIndex == NetLuidIndex)
-            goto found;
-
-loop:
-        RegCloseKey(SubKey);
-    }
-
-    SetLastError(ERROR_FILE_NOT_FOUND);
-    goto fail6;
-
-found:
-    RegCloseKey(SubKey);
-
-    RegCloseKey(NetKey);
-
-    free(NetLuid);
-
-    NameLength = (DWORD)(sizeof ("{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\\") +
-                         ((strlen(SubKeyName) + 1) * sizeof (TCHAR)));
-
-    *Name = calloc(1, NameLength);
-    if (*Name == NULL)
-        goto fail7;
-
-    Result = StringCbPrintf(*Name,
-                            NameLength,
-                            "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\%s",
-                            Guid->Data1,
-                            Guid->Data2,
-                            Guid->Data3,
-                            Guid->Data4[0],
-                            Guid->Data4[1],
-                            Guid->Data4[2],
-                            Guid->Data4[3],
-                            Guid->Data4[4],
-                            Guid->Data4[5],
-                            Guid->Data4[6],
-                            Guid->Data4[7],
-                            SubKeyName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail8;
-    }
-
-done:
-    Log("%s", (*Name == NULL) ? "[NONE]" : *Name);
-
-    Log("<====");
-
-    return TRUE;
-
-fail8:
-    Log("fail8");
-
-    free(*Name);
-
-fail7:
-    Log("fail7");
-
-fail6:
-    Log("fail6");
-
-fail5:
-    Log("fail5");
-
-    free(SubKeyName);
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-    RegCloseKey(NetKey);
-
-fail2:
-    Log("fail2");
-
-    free(NetLuid);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static HKEY
-OpenAliasSoftwareKey(
-    IN  PTCHAR  Name
-    )
-{
-    HRESULT     Result;
-    TCHAR       KeyName[MAX_PATH];
-    HKEY        Key;
-    HRESULT     Error;
-
-    Result = StringCbPrintf(KeyName,
-                            MAX_PATH,
-                            "%s\\%s",
-                            CLASS_KEY,
-                            Name);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail1;
-    }
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         KeyName,
-                         0,
-                         KEY_READ,
-                         &Key);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    return Key;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static PTCHAR
-GetInterfaceName(
-    IN  HKEY    SoftwareKey
-    )
-{
-    HRESULT     Error;
-    HKEY        LinkageKey;
-    DWORD       MaxValueLength;
-    DWORD       RootDeviceLength;
-    PTCHAR      RootDevice;
-    DWORD       Type;
-
-    Error = RegOpenKeyEx(SoftwareKey,
-                         "Linkage",
-                         0,
-                         KEY_READ,
-                         &LinkageKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Error = RegQueryInfoKey(LinkageKey,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            &MaxValueLength,
-                            NULL,
-                            NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    RootDeviceLength = MaxValueLength + sizeof (TCHAR);
-
-    RootDevice = calloc(1, RootDeviceLength);
-    if (RootDevice == NULL)
-        goto fail2;
-
-    Error = RegQueryValueEx(LinkageKey,
-                            "RootDevice",
-                            NULL,
-                            &Type,
-                            (LPBYTE)RootDevice,
-                            &RootDeviceLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    Error = RegQueryValueEx(LinkageKey,
-                            "RootDevice",
-                            NULL,
-                            &Type,
-                            (LPBYTE)RootDevice,
-                            &RootDeviceLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    if (Type != REG_MULTI_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail4;
-    }
-
-    Log("%s", RootDevice);
-
-    RegCloseKey(LinkageKey);
-
-    return RootDevice;
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-    free(RootDevice);
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(LinkageKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static BOOLEAN
-CopyKeyValues(
-    IN  HKEY    DestinationKey,
-    IN  HKEY    SourceKey
-    )
-{
-    HRESULT     Error;
-    DWORD       Values;
-    DWORD       MaxNameLength;
-    PTCHAR      Name;
-    DWORD       MaxValueLength;
-    LPBYTE      Value;
-    DWORD       Index;
-
-    Log("====>");
-
-    Error = RegQueryInfoKey(SourceKey,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            &Values,
-                            &MaxNameLength,
-                            &MaxValueLength,
-                            NULL,
-                            NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Log("%d VALUES", Values);
-
-    if (Values == 0)
-        goto done;
-
-    MaxNameLength += sizeof (TCHAR);
-
-    Name = malloc(MaxNameLength);
-    if (Name == NULL)
-        goto fail2;
-
-    Value = malloc(MaxValueLength);
-    if (Value == NULL)
-        goto fail3;
-
-    for (Index = 0; Index < Values; Index++) {
-        DWORD   NameLength;
-        DWORD   ValueLength;
-        DWORD   Type;
-
-        NameLength = MaxNameLength;
-        memset(Name, 0, NameLength);
-
-        ValueLength = MaxValueLength;
-        memset(Value, 0, ValueLength);
-
-        Error = RegEnumValue(SourceKey,
-                             Index,
-                             (LPTSTR)Name,
-                             &NameLength,
-                             NULL,
-                             &Type,
-                             Value,
-                             &ValueLength);
-        if (Error != ERROR_SUCCESS) {
-            SetLastError(Error);
-            goto fail4;
-        }
-
-        Error = RegSetValueEx(DestinationKey,
-                              Name,
-                              0,
-                              Type,
-                              Value,
-                              ValueLength);
-        if (Error != ERROR_SUCCESS) {
-            SetLastError(Error);
-            goto fail5;
-        }
-
-        Log("COPIED %s", Name);
-    }
-
-    free(Value);
-    free(Name);
-
-done:
-    Log("<====");
-
-    return TRUE;
-
-fail5:
-    Log("fail5");
-
-fail4:
-    Log("fail4");
-
-    free(Value);
-
-fail3:
-    Log("fail3");
-
-    free(Name);
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Log("fail1");
-
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-
-}
-
-static BOOLEAN
-CopyValues(
-    IN  PTCHAR  DestinationKeyName,
-    IN  PTCHAR  SourceKeyName
-    )
-{
-    HRESULT     Error;
-    HKEY        DestinationKey;
-    HKEY        SourceKey;
-
-    Log("====>");
-
-    Log("DESTINATION: %s", DestinationKeyName);
-    Log("SOURCE: %s", SourceKeyName);
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         SourceKeyName,
-                         0,
-                         KEY_ALL_ACCESS,
-                         &SourceKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-    
-    Error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
-                           DestinationKeyName,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &DestinationKey,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    CopyKeyValues(DestinationKey, SourceKey);
-
-    RegCloseKey(DestinationKey);
-    RegCloseKey(SourceKey);
-
-    Log("<====");
-
-    return TRUE;
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(SourceKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-CopyParameters(
-    IN  PTCHAR  Prefix,
-    IN  PTCHAR  DestinationName,
-    IN  PTCHAR  SourceName
-    )
-{
-    DWORD       Length;
-    PTCHAR      SourceKeyName;
-    PTCHAR      DestinationKeyName;
-    HRESULT     Result;
-    HRESULT     Error;
-    BOOLEAN     Success;
-
-    Log("====>");
-
-    Length = (DWORD)((strlen(Prefix) +
-                      strlen(DestinationName) +
-                      1) * sizeof (TCHAR));
-
-    DestinationKeyName = calloc(1, Length);
-    if (DestinationKeyName == NULL)
-        goto fail1;
-
-    Result = StringCbPrintf(DestinationKeyName,
-                            Length,
-                            "%s%s",
-                            Prefix,
-                            DestinationName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail2;
-    }
-
-    Length = (DWORD)((strlen(Prefix) +
-                      strlen(SourceName) +
-                      1) * sizeof (TCHAR));
-
-    SourceKeyName = calloc(1, Length);
-    if (SourceKeyName == NULL)
-        goto fail3;
-
-    Result = StringCbPrintf(SourceKeyName,
-                            Length,
-                            "%s%s",
-                            Prefix,
-                            SourceName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail4;
-    }
-
-    Success = CopyValues(DestinationKeyName, SourceKeyName);
-
-    free(SourceKeyName);
-    free(DestinationKeyName);
-
-    Log("<====");
-
-    return Success;
-
-fail4:
-    Log("fail4");
-
-    free(SourceKeyName);
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    free(DestinationKeyName);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-CopyIpVersion6Addresses(
-    IN  PTCHAR  DestinationKeyName,
-    IN  PTCHAR  SourceKeyName,
-    IN  PTCHAR  DestinationValueName,
-    IN  PTCHAR  SourceValueName
-    )
-{
-    HKEY        DestinationKey;
-    HKEY        SourceKey;
-    HRESULT     Error;
-    DWORD       Values;
-    DWORD       MaxNameLength;
-    PTCHAR      Name;
-    DWORD       MaxValueLength;
-    LPBYTE      Value;
-    DWORD       Index;
-
-    Log("DESTINATION: %s\\%s", DestinationKeyName, DestinationValueName);
-    Log("SOURCE: %s\\%s", SourceKeyName, SourceValueName);
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         SourceKeyName,
-                         0,
-                         KEY_ALL_ACCESS,
-                         &SourceKey);
-    if (Error != ERROR_SUCCESS) {
-        if (Error == ERROR_FILE_NOT_FOUND)
-            goto done;
-
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
-                           DestinationKeyName,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &DestinationKey,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    Error = RegQueryInfoKey(SourceKey,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            &Values,
-                            &MaxNameLength,
-                            &MaxValueLength,
-                            NULL,
-                            NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    if (Values == 0)
-        goto done;
-
-    MaxNameLength += sizeof (TCHAR);
-
-    Name = malloc(MaxNameLength);
-    if (Name == NULL)
-        goto fail4;
-
-    Value = malloc(MaxValueLength);
-    if (Value == NULL)
-        goto fail5;
-
-    for (Index = 0; Index < Values; Index++) {
-        DWORD   NameLength;
-        DWORD   ValueLength;
-        DWORD   Type;
-
-        NameLength = MaxNameLength;
-        memset(Name, 0, NameLength);
-
-        ValueLength = MaxValueLength;
-        memset(Value, 0, ValueLength);
-
-        Error = RegEnumValue(SourceKey,
-                             Index,
-                             (LPTSTR)Name,
-                             &NameLength,
-                             NULL,
-                             &Type,
-                             Value,
-                             &ValueLength);
-        if (Error != ERROR_SUCCESS) {
-            SetLastError(Error);
-            goto fail6;
-        }
-
-        if (strncmp(Name, SourceValueName, sizeof (ULONG64) * 2) != 0){
-            Log("Ignoring %s ( %s )", Name, SourceValueName);
-            continue;
-        }
-
-        Log("READ: %s", Name);
-
-        memcpy(Name, DestinationValueName, sizeof (ULONG64) * 2);
-
-        Log("WRITE: %s", Name);
-
-        Error = RegSetValueEx(DestinationKey,
-                              Name,
-                              0,
-                              Type,
-                              Value,
-                              ValueLength);
-        if (Error != ERROR_SUCCESS) {
-            SetLastError(Error);
-            goto fail7;
-        }
-    }
-
-    free(Value);
-    free(Name);
-
-    RegCloseKey(DestinationKey);
-    RegCloseKey(SourceKey);
-
-done:
-
-    return TRUE;
-
-fail7:
-    Log("fail7");
-
-fail6:
-    Log("fail6");
-
-    free(Value);
-
-fail5:
-    Log("fail5");
-
-    free(Name);
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-    RegCloseKey(DestinationKey);
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(SourceKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
 static PTCHAR
-GetIpVersion6AddressValueName(
-    IN  HKEY    Key
+GetProperty(
+    IN  HDEVINFO            DeviceInfoSet,
+    IN  PSP_DEVINFO_DATA    DeviceInfoData,
+    IN  DWORD               Index
     )
 {
-    HRESULT     Error;
-    DWORD       MaxValueLength;
-    DWORD       ValueLength;
-    LPDWORD     Value;
-    DWORD       Type;
-    NET_LUID    NetLuid;
-    DWORD       BufferLength;
-    PTCHAR      Buffer;
-    HRESULT     Result;
-
-    memset(&NetLuid, 0, sizeof (NetLuid));
-
-    Error = RegQueryInfoKey(Key,
-                            NULL,
-                            NULL,
-                            NULL,    
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            &MaxValueLength,
-                            NULL,
-                            NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    ValueLength = MaxValueLength;
-
-    Value = calloc(1, ValueLength);
-    if (Value == NULL)
-        goto fail2;
-
-    Error = RegQueryValueEx(Key,
-                            "NetLuidIndex",
-                            NULL,
-                            &Type,
-                            (LPBYTE)Value,
-                            &ValueLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    if (Type != REG_DWORD) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail4;
-    }
-
-    NetLuid.Info.NetLuidIndex = *Value;
+    DWORD                   Type;
+    DWORD                   PropertyLength;
+    PTCHAR                  Property;
+    HRESULT                 Error;
 
-    Error = RegQueryValueEx(Key,
-                            "*IfType",
-                            NULL,
-                            &Type,
-                            (LPBYTE)Value,
-                            &ValueLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail5;
+    if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
+                                          DeviceInfoData,
+                                          Index,
+                                          &Type,
+                                          NULL,
+                                          0,
+                                          &PropertyLength)) {
+        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+            goto fail1;
     }
 
-    if (Type != REG_DWORD) {
+    if (Type != REG_SZ) {
         SetLastError(ERROR_BAD_FORMAT);
-        goto fail6;
-    }
-
-    NetLuid.Info.IfType = *Value;
-
-    BufferLength = ((sizeof (ULONG64) * 2) + 1) * sizeof (TCHAR);
-
-    Buffer = calloc(1, BufferLength);
-    if (Buffer == NULL)
-        goto fail7;
-
-    Result = StringCbPrintf(Buffer,
-                            BufferLength,
-                            "%016llx",
-                            _byteswap_uint64(NetLuid.Value));
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail8;
+        goto fail2;
     }
 
-    free(Value);
-
-    return Buffer;
-
-fail8:
-    Log("fail8");
-
-    free(Buffer);
+    PropertyLength += sizeof (TCHAR);
 
-fail7:
-    Log("fail7");
+    Property = calloc(1, PropertyLength);
+    if (Property == NULL)
+        goto fail3;
 
-fail6:
-    Log("fail6");
+    if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
+                                          DeviceInfoData,
+                                          Index,
+                                          NULL,
+                                          (PBYTE)Property,
+                                          PropertyLength,
+                                          NULL))
+        goto fail4;
 
-fail5:
-    Log("fail5");
+    return Property;
 
 fail4:
-    Log("fail4");
+    free(Property);
 
 fail3:
     Log("fail3");
 
-    free(Value);
-
 fail2:
     Log("fail2");
 
@@ -1674,140 +279,67 @@ fail1:
 }
 
 static BOOLEAN
-CopySettings(
-    IN  HKEY    DestinationKey,
-    IN  HKEY    SourceKey
+SetFriendlyName(
+    IN  HDEVINFO            DeviceInfoSet,
+    IN  PSP_DEVINFO_DATA    DeviceInfoData
     )
 {
-    PTCHAR      DestinationName;
-    PTCHAR      SourceName;
-    BOOLEAN     Success;
-    HRESULT     Error;
-
-    Log("====>");
-
-    Success = TRUE;
-
-    SourceName = GetInterfaceName(SourceKey);
+    PTCHAR                  Description;
+    PTCHAR                  Location;
+    TCHAR                   FriendlyName[MAX_PATH];
+    DWORD                   FriendlyNameLength;
+    HRESULT                 Result;
+    HRESULT                 Error;
 
-    if (SourceName == NULL)
+    Description = GetProperty(DeviceInfoSet,
+                              DeviceInfoData,
+                              SPDRP_DEVICEDESC);
+    if (Description == NULL)
         goto fail1;
 
-    DestinationName = GetInterfaceName(DestinationKey);
-
-    if (DestinationName == NULL)
+    Location = GetProperty(DeviceInfoSet,
+                           DeviceInfoData,
+                           SPDRP_LOCATION_INFORMATION);
+    if (Location == NULL)
         goto fail2;
 
-    if (_stricmp(SourceName, DestinationName) == 0)
-        goto done;
-
-    Success &= CopyParameters(PARAMETERS_KEY(NetBT) "\\Interfaces\\Tcpip_",
-                              DestinationName,
-                              SourceName);
-    Success &= CopyParameters(PARAMETERS_KEY(Tcpip) "\\Interfaces\\",
-                              DestinationName,
-                              SourceName);
-    Success &= CopyParameters(PARAMETERS_KEY(Tcpip6) "\\Interfaces\\",
-                              DestinationName,
-                              SourceName);
-
-    free(DestinationName);
-    free(SourceName);
-
-    SourceName = GetIpVersion6AddressValueName(SourceKey);
-
-    if (SourceName == NULL)
+    Result = StringCbPrintf(FriendlyName,
+                            MAX_PATH,
+                            "%s #%s",
+                            Description,
+                            Location);
+    if (!SUCCEEDED(Result))
         goto fail3;
 
-    DestinationName = GetIpVersion6AddressValueName(DestinationKey);
+    FriendlyNameLength = (DWORD)(strlen(FriendlyName) + sizeof (TCHAR));
 
-    if (DestinationName == NULL)
+    if (!SetupDiSetDeviceRegistryProperty(DeviceInfoSet,
+                                          DeviceInfoData,
+                                          SPDRP_FRIENDLYNAME,
+                                          (PBYTE)FriendlyName,
+                                          FriendlyNameLength))
         goto fail4;
 
-    Success &= CopyIpVersion6Addresses(NSI_KEY "\\{eb004a01-9b1a-11d4-9123-0050047759bc}\\10\\",
-                                       NSI_KEY "\\{eb004a01-9b1a-11d4-9123-0050047759bc}\\10\\",
-                                       DestinationName,
-                                       SourceName);
+    Log("%s", FriendlyName);
 
-done:
-    free(DestinationName);
-    free(SourceName);
+    free(Location);
 
-    Log("<====");
+    free(Description);
 
-    return Success;
+    return TRUE;
 
 fail4:
     Log("fail4");
 
-    free(SourceName);
-    goto fail1;
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    free(SourceName);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-CopySettingsFromAlias(
-    IN  HDEVINFO                    DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA            DeviceInfoData,
-    IN  PTCHAR                      Name
-    )
-{
-    HKEY                            Source;
-    HKEY                            Destination;
-    BOOLEAN                         Success;
-    HRESULT                         Error;
-
-    Log("====> (%s)", Name);
-
-    Source = OpenAliasSoftwareKey(Name);
-    if (Source == NULL)
-        goto fail1;
-
-    Destination = OpenSoftwareKey(DeviceInfoSet, DeviceInfoData);
-    if (Destination == NULL)
-        goto fail2;
-
-    Success = CopySettings(Destination, Source);
-    if (!Success)
-        goto fail3;
-
-    RegCloseKey(Destination);
-
-    RegCloseKey(Source);
-
-    Log("<====");
-
-    return TRUE;
-
 fail3:
     Log("fail3");
 
-    RegCloseKey(Destination);
+    free(Location);
 
 fail2:
     Log("fail2");
 
-    RegCloseKey(Source);
+    free(Description);
 
 fail1:
     Error = GetLastError();
@@ -2447,8 +979,6 @@ __DifInstallPostProcess(
     )
 {
     BOOLEAN                         Success;
-    ETHERNET_ADDRESS                Address;
-    PTCHAR                          SoftwareKeyName;
     BOOLEAN                         NeedReboot;
     HRESULT                         Error;
 
@@ -2456,32 +986,14 @@ __DifInstallPostProcess(
 
     Log("====>");
 
-    Success = GetPermanentAddress(DeviceInfoSet,
-                                  DeviceInfoData,
-                                  &Address);
-    if (!Success)
-        goto fail1;
-
-    Success = FindAliasSoftwareKeyName(&Address, &SoftwareKeyName);
-    if (!Success)
-        goto fail2;
-
-    if (SoftwareKeyName != NULL) {
-        Success = CopySettingsFromAlias(DeviceInfoSet,
-                                        DeviceInfoData,
-                                        SoftwareKeyName);
-        if (!Success)
-            goto fail3;
-    }
-
     Success = SetFriendlyName(DeviceInfoSet,
                               DeviceInfoData);
     if (!Success)
-        goto fail4;
+        goto fail1;
 
     Success = InstallUnplugService("NICS", "XENNET");
     if (!Success)
-        goto fail5;
+        goto fail2;
 
     RegisterInterface("XENVIF", "VIF", XENVIF_VIF_INTERFACE_VERSION_MAX);
     RegisterInterface("XENBUS", "CACHE", XENBUS_CACHE_INTERFACE_VERSION_MAX);
@@ -2496,18 +1008,6 @@ __DifInstallPostProcess(
 
     return NO_ERROR;
 
-fail5:
-    Log("fail5");
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-    if (SoftwareKeyName != NULL)
-        free(SoftwareKeyName);
-
 fail2:
     Log("fail2");
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:35:13 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:35:13 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoZF-0006uX-Hw; Wed, 08 Jul 2015 12:35:13 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCoZE-0006ty-3Y
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:35:12 +0000
Received: from [85.158.137.68] by server-10.bemta-3.messagelabs.com id
	D6/B8-03895-FF81D955; Wed, 08 Jul 2015 12:35:11 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-31.messagelabs.com!1436358906!21405215!1
X-Originating-IP: [209.85.212.173]
X-SpamReason: No, hits=1.2 required=7.0 tests=HOT_NASTY,UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26769 invoked from network); 8 Jul 2015 12:35:06 -0000
Received: from mail-wi0-f173.google.com (HELO mail-wi0-f173.google.com)
	(209.85.212.173)
	by server-14.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:35:06 -0000
Received: by wifm2 with SMTP id m2so88117546wif.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:35:06 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=3fFNqGqZ3VKU3txTS6ppIaIw1aBUFnG6I+xp24HxJe0=;
	b=IGNrus528pYoZUIOrGIMAb0laXh9T8WQHjkCkiy+65A9OBW1oxxNnC63iyXXBmDGnk
	fbhZXRXdDYFkTV9eFxtrgqLsCr7rh2SgMwcDNFOlfvhApQmhFlY+AdCLF9Q5Y9SpsRdh
	RrnKaXzkBTZaZKvB/qHQMZdb1rAVpFoRzSPvLJz1t3PL0+EMcuTqWMEN2p8f2C2uNymL
	UWaXjwAMsVSrlzE50SAXWRQte4WuxoEv7CgJPZ3mY29DRpK7N17RwNMaaqcEP3KooToM
	gR0WRF7WDcvoM+r2MuCpeF171gF7Z+S0dlLdj8puDjPif2FKuqCNjEeOn8C0m33MbqSW
	gDUw==
X-Received: by 10.194.95.71 with SMTP id di7mr19560010wjb.125.1436358906111;
	Wed, 08 Jul 2015 05:35:06 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id um5sm3296737wjc.1.2015.07.08.05.35.05
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:35:05 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:34:54 +0100
Message-Id: <1436358894-11380-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove code that copies network settings
	from the co-installer
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This functionality is now implemented by XENVIF.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 1640 +++------------------------------------------------
 1 file changed, 70 insertions(+), 1570 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 0905205..fce8abd 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -210,1452 +210,57 @@ __FunctionName(
 #undef  _NAME
 }
 
-static HKEY
-OpenSoftwareKey(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData
-    )
-{
-    HKEY                    Key;
-    HRESULT                 Error;
-
-    Key = SetupDiOpenDevRegKey(DeviceInfoSet,
-                               DeviceInfoData,
-                               DICS_FLAG_GLOBAL,
-                               0,
-                               DIREG_DRV,
-                               KEY_ALL_ACCESS);
-    if (Key == INVALID_HANDLE_VALUE) {
-        SetLastError(ERROR_PATH_NOT_FOUND);
-        goto fail1;
-    }
-
-    return Key;
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static PTCHAR
-GetProperty(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData,
-    IN  DWORD               Index
-    )
-{
-    DWORD                   Type;
-    DWORD                   PropertyLength;
-    PTCHAR                  Property;
-    HRESULT                 Error;
-
-    if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          Index,
-                                          &Type,
-                                          NULL,
-                                          0,
-                                          &PropertyLength)) {
-        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
-            goto fail1;
-    }
-
-    if (Type != REG_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail2;
-    }
-
-    PropertyLength += sizeof (TCHAR);
-
-    Property = calloc(1, PropertyLength);
-    if (Property == NULL)
-        goto fail3;
-
-    if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          Index,
-                                          NULL,
-                                          (PBYTE)Property,
-                                          PropertyLength,
-                                          NULL))
-        goto fail4;
-
-    return Property;
-
-fail4:
-    free(Property);
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static BOOLEAN
-SetFriendlyName(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData
-    )
-{
-    PTCHAR                  Description;
-    PTCHAR                  Location;
-    TCHAR                   FriendlyName[MAX_PATH];
-    DWORD                   FriendlyNameLength;
-    HRESULT                 Result;
-    HRESULT                 Error;
-
-    Description = GetProperty(DeviceInfoSet,
-                              DeviceInfoData,
-                              SPDRP_DEVICEDESC);
-    if (Description == NULL)
-        goto fail1;
-
-    Location = GetProperty(DeviceInfoSet,
-                           DeviceInfoData,
-                           SPDRP_LOCATION_INFORMATION);
-    if (Location == NULL)
-        goto fail2;
-
-    Result = StringCbPrintf(FriendlyName,
-                            MAX_PATH,
-                            "%s #%s",
-                            Description,
-                            Location);
-    if (!SUCCEEDED(Result))
-        goto fail3;
-
-    FriendlyNameLength = (DWORD)(strlen(FriendlyName) + sizeof (TCHAR));
-
-    if (!SetupDiSetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          SPDRP_FRIENDLYNAME,
-                                          (PBYTE)FriendlyName,
-                                          FriendlyNameLength))
-        goto fail4;
-
-    Log("%s", FriendlyName);
-
-    free(Location);
-
-    free(Description);
-
-    return TRUE;
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-    free(Location);
-
-fail2:
-    Log("fail2");
-
-    free(Description);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-ParseMacAddress(
-    IN  PCHAR               Buffer,
-    OUT PETHERNET_ADDRESS   Address
-    )
-{
-    ULONG                   Length;
-    HRESULT                 Error;
-
-    Length = 0;
-    for (;;) {
-        CHAR    Character;
-        UCHAR   Byte;
-
-        Character = *Buffer++;
-        if (Character == '\0')
-            break;
-
-        if (Character >= '0' && Character <= '9')
-            Byte = Character - '0';
-        else if (Character >= 'A' && Character <= 'F')
-            Byte = 0x0A + Character - 'A';
-        else if (Character >= 'a' && Character <= 'f')
-            Byte = 0x0A + Character - 'a';
-        else
-            break;
-
-        Byte <<= 4;
-
-        Character = *Buffer++;
-        if (Character == '\0')
-            break;
-
-        if (Character >= '0' && Character <= '9')
-            Byte += Character - '0';
-        else if (Character >= 'A' && Character <= 'F')
-            Byte += 0x0A + Character - 'A';
-        else if (Character >= 'a' && Character <= 'f')
-            Byte += 0x0A + Character - 'a';
-        else
-            break;
-
-        Address->Byte[Length++] = Byte;
-
-        // Skip over any separator
-        if (*Buffer == ':' || *Buffer == '-')
-            Buffer++;
-    }
-
-    if (Length != ETHERNET_ADDRESS_LENGTH) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail1;
-    }
-
-    return TRUE;
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-
-static BOOLEAN
-GetPermanentAddress(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData,
-    OUT PETHERNET_ADDRESS   Address
-    )
-{
-    PTCHAR                  Location;
-    HRESULT                 Error;
-    HKEY                    AddressesKey;
-    DWORD                   MaxValueLength;
-    DWORD                   BufferLength;
-    PTCHAR                  Buffer;
-    DWORD                   Type;
-    BOOLEAN                 Success;
-
-    Location = GetProperty(DeviceInfoSet,
-                           DeviceInfoData,
-                           SPDRP_LOCATION_INFORMATION);
-    if (Location == NULL)
-        goto fail1;
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         ADDRESSES_KEY,
-                         0,
-                         KEY_READ,
-                         &AddressesKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    Error = RegQueryInfoKey(AddressesKey,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            &MaxValueLength,
-                            NULL,
-                            NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    BufferLength = MaxValueLength + sizeof (TCHAR);
-
-    Buffer = calloc(1, BufferLength);
-    if (Buffer == NULL)
-        goto fail4;
-
-    Error = RegQueryValueEx(AddressesKey,
-                            Location,
-                            NULL,
-                            &Type,
-                            (LPBYTE)Buffer,
-                            &BufferLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail5;
-    }
-
-    if (Type != REG_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail6;
-    }
-
-    Success = ParseMacAddress(Buffer, Address);
-    if (!Success)
-        goto fail7;
-
-    free(Buffer);
-
-    RegCloseKey(AddressesKey);
-
-    free(Location);
-
-    Log("%02X:%02X:%02X:%02X:%02X:%02X",
-        Address->Byte[0],
-        Address->Byte[1],
-        Address->Byte[2],
-        Address->Byte[3],
-        Address->Byte[4],
-        Address->Byte[5]);
-
-    return TRUE;
-
-fail7:
-    Log("fail7");
-
-fail6:
-    Log("fail6");
-
-fail5:
-    Log("fail5");
-
-    free(Buffer);
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-    RegCloseKey(AddressesKey);
-
-fail2:
-    Log("fail2");
-
-    free(Location);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-GetNetLuid(
-    IN  PETHERNET_ADDRESS   Address,
-    OUT PNET_LUID           *NetLuid
-    )
-{
-    PMIB_IF_TABLE2          Table;
-    DWORD                   Index;
-    PMIB_IF_ROW2            Row;
-    HRESULT                 Error;
-
-    Error = GetIfTable2(&Table);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    for (Index = 0; Index < Table->NumEntries; Index++) {
-        Row = &Table->Table[Index];
-
-        if (!(Row->InterfaceAndOperStatusFlags.HardwareInterface) ||
-            !(Row->InterfaceAndOperStatusFlags.ConnectorPresent))
-            continue;
-
-        if (Row->OperStatus != IfOperStatusUp)
-            continue;
-
-        if (Row->PhysicalAddressLength != sizeof (ETHERNET_ADDRESS))
-            continue;
-
-        if (memcmp(Row->PhysicalAddress,
-                   Address,
-                   sizeof (ETHERNET_ADDRESS)) == 0)
-            goto found;
-    }
-
-    *NetLuid = NULL;
-    goto done;
-
-found:
-    *NetLuid = calloc(1, sizeof (NET_LUID));
-    if (*NetLuid == NULL)
-        goto fail2;
-
-    (*NetLuid)->Value = Row->InterfaceLuid.Value;
-
-done:
-    FreeMibTable(Table);
-
-    return TRUE;
-
-fail2:
-    Log("fail2");
-
-    FreeMibTable(Table);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-OpenClassKey(
-    IN  const GUID  *Guid,
-    OUT PHKEY       Key
-    )
-{   
-    TCHAR           KeyName[MAX_PATH];
-    HRESULT         Result;
-    HRESULT         Error;
-
-    Result = StringCbPrintf(KeyName,
-                            MAX_PATH,
-                            "%s\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
-                            CLASS_KEY,
-                            Guid->Data1,
-                            Guid->Data2,
-                            Guid->Data3,
-                            Guid->Data4[0],
-                            Guid->Data4[1],
-                            Guid->Data4[2],
-                            Guid->Data4[3],
-                            Guid->Data4[4],
-                            Guid->Data4[5],
-                            Guid->Data4[6],
-                            Guid->Data4[7]);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail1;
-    }
-
-    Log("%s", KeyName);
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         KeyName,
-                         0,
-                         KEY_READ,
-                         Key);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    return TRUE;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-FindAliasSoftwareKeyName(
-    IN  PETHERNET_ADDRESS   Address,
-    OUT PTCHAR              *Name
-    )
-{
-    const GUID              *Guid = &GUID_DEVCLASS_NET;
-    BOOLEAN                 Success;
-    PNET_LUID               NetLuid;
-    HKEY                    NetKey;
-    HRESULT                 Error;
-    DWORD                   SubKeys;
-    DWORD                   MaxSubKeyLength;
-    DWORD                   SubKeyLength;
-    PTCHAR                  SubKeyName;
-    DWORD                   Index;
-    HKEY                    SubKey;
-    DWORD                   NameLength;
-    HRESULT                 Result;
-
-    Log("====>");
-
-    Success = GetNetLuid(Address, &NetLuid);
-    if (!Success)
-        goto fail1;
-
-    *Name = NULL;
-
-    if (NetLuid == NULL)
-        goto done;
-
-    Log("%08x.%08x",
-        NetLuid->Info.IfType,
-        NetLuid->Info.NetLuidIndex);
-
-    Success = OpenClassKey(Guid, &NetKey);
-    if (!Success)
-        goto fail2;
-
-    Error = RegQueryInfoKey(NetKey,
-                            NULL,
-                            NULL,
-                            NULL,
-                            &SubKeys,
-                            &MaxSubKeyLength,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
-
-    SubKeyName = malloc(SubKeyLength);
-    if (SubKeyName == NULL)
-        goto fail4;
-
-    for (Index = 0; Index < SubKeys; Index++) {
-        DWORD   Length;
-        DWORD   Type;
-        DWORD   IfType;
-        DWORD   NetLuidIndex;
-
-        SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
-        memset(SubKeyName, 0, SubKeyLength);
-
-        Error = RegEnumKeyEx(NetKey,
-                             Index,
-                             (LPTSTR)SubKeyName,
-                             &SubKeyLength,
-                             NULL,
-                             NULL,
-                             NULL,
-                             NULL);
-        if (Error != ERROR_SUCCESS) {
-            SetLastError(Error);
-            goto fail5;
-        }
-
-        Error = RegOpenKeyEx(NetKey,
-                             SubKeyName,
-                             0,
-                             KEY_READ,
-                             &SubKey);
-        if (Error != ERROR_SUCCESS)
-            continue;
-
-        Length = sizeof (DWORD);
-        Error = RegQueryValueEx(SubKey,
-                                "*IfType",
-                                NULL,
-                                &Type,
-                                (LPBYTE)&IfType,
-                                &Length);
-        if (Error != ERROR_SUCCESS ||
-            Type != REG_DWORD)
-            goto loop;
-
-        Length = sizeof (DWORD);
-        Error = RegQueryValueEx(SubKey,
-                                "NetLuidIndex",
-                                NULL,
-                                &Type,
-                                (LPBYTE)&NetLuidIndex,
-                                &Length);
-        if (Error != ERROR_SUCCESS ||
-            Type != REG_DWORD)
-            goto loop;
-
-        if (NetLuid->Info.IfType == IfType &&
-            NetLuid->Info.NetLuidIndex == NetLuidIndex)
-            goto found;
-
-loop:
-        RegCloseKey(SubKey);
-    }
-
-    SetLastError(ERROR_FILE_NOT_FOUND);
-    goto fail6;
-
-found:
-    RegCloseKey(SubKey);
-
-    RegCloseKey(NetKey);
-
-    free(NetLuid);
-
-    NameLength = (DWORD)(sizeof ("{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\\") +
-                         ((strlen(SubKeyName) + 1) * sizeof (TCHAR)));
-
-    *Name = calloc(1, NameLength);
-    if (*Name == NULL)
-        goto fail7;
-
-    Result = StringCbPrintf(*Name,
-                            NameLength,
-                            "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\%s",
-                            Guid->Data1,
-                            Guid->Data2,
-                            Guid->Data3,
-                            Guid->Data4[0],
-                            Guid->Data4[1],
-                            Guid->Data4[2],
-                            Guid->Data4[3],
-                            Guid->Data4[4],
-                            Guid->Data4[5],
-                            Guid->Data4[6],
-                            Guid->Data4[7],
-                            SubKeyName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail8;
-    }
-
-done:
-    Log("%s", (*Name == NULL) ? "[NONE]" : *Name);
-
-    Log("<====");
-
-    return TRUE;
-
-fail8:
-    Log("fail8");
-
-    free(*Name);
-
-fail7:
-    Log("fail7");
-
-fail6:
-    Log("fail6");
-
-fail5:
-    Log("fail5");
-
-    free(SubKeyName);
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-    RegCloseKey(NetKey);
-
-fail2:
-    Log("fail2");
-
-    free(NetLuid);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static HKEY
-OpenAliasSoftwareKey(
-    IN  PTCHAR  Name
-    )
-{
-    HRESULT     Result;
-    TCHAR       KeyName[MAX_PATH];
-    HKEY        Key;
-    HRESULT     Error;
-
-    Result = StringCbPrintf(KeyName,
-                            MAX_PATH,
-                            "%s\\%s",
-                            CLASS_KEY,
-                            Name);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail1;
-    }
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         KeyName,
-                         0,
-                         KEY_READ,
-                         &Key);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    return Key;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static PTCHAR
-GetInterfaceName(
-    IN  HKEY    SoftwareKey
-    )
-{
-    HRESULT     Error;
-    HKEY        LinkageKey;
-    DWORD       MaxValueLength;
-    DWORD       RootDeviceLength;
-    PTCHAR      RootDevice;
-    DWORD       Type;
-
-    Error = RegOpenKeyEx(SoftwareKey,
-                         "Linkage",
-                         0,
-                         KEY_READ,
-                         &LinkageKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Error = RegQueryInfoKey(LinkageKey,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            &MaxValueLength,
-                            NULL,
-                            NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    RootDeviceLength = MaxValueLength + sizeof (TCHAR);
-
-    RootDevice = calloc(1, RootDeviceLength);
-    if (RootDevice == NULL)
-        goto fail2;
-
-    Error = RegQueryValueEx(LinkageKey,
-                            "RootDevice",
-                            NULL,
-                            &Type,
-                            (LPBYTE)RootDevice,
-                            &RootDeviceLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    Error = RegQueryValueEx(LinkageKey,
-                            "RootDevice",
-                            NULL,
-                            &Type,
-                            (LPBYTE)RootDevice,
-                            &RootDeviceLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    if (Type != REG_MULTI_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail4;
-    }
-
-    Log("%s", RootDevice);
-
-    RegCloseKey(LinkageKey);
-
-    return RootDevice;
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-    free(RootDevice);
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(LinkageKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static BOOLEAN
-CopyKeyValues(
-    IN  HKEY    DestinationKey,
-    IN  HKEY    SourceKey
-    )
-{
-    HRESULT     Error;
-    DWORD       Values;
-    DWORD       MaxNameLength;
-    PTCHAR      Name;
-    DWORD       MaxValueLength;
-    LPBYTE      Value;
-    DWORD       Index;
-
-    Log("====>");
-
-    Error = RegQueryInfoKey(SourceKey,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            &Values,
-                            &MaxNameLength,
-                            &MaxValueLength,
-                            NULL,
-                            NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Log("%d VALUES", Values);
-
-    if (Values == 0)
-        goto done;
-
-    MaxNameLength += sizeof (TCHAR);
-
-    Name = malloc(MaxNameLength);
-    if (Name == NULL)
-        goto fail2;
-
-    Value = malloc(MaxValueLength);
-    if (Value == NULL)
-        goto fail3;
-
-    for (Index = 0; Index < Values; Index++) {
-        DWORD   NameLength;
-        DWORD   ValueLength;
-        DWORD   Type;
-
-        NameLength = MaxNameLength;
-        memset(Name, 0, NameLength);
-
-        ValueLength = MaxValueLength;
-        memset(Value, 0, ValueLength);
-
-        Error = RegEnumValue(SourceKey,
-                             Index,
-                             (LPTSTR)Name,
-                             &NameLength,
-                             NULL,
-                             &Type,
-                             Value,
-                             &ValueLength);
-        if (Error != ERROR_SUCCESS) {
-            SetLastError(Error);
-            goto fail4;
-        }
-
-        Error = RegSetValueEx(DestinationKey,
-                              Name,
-                              0,
-                              Type,
-                              Value,
-                              ValueLength);
-        if (Error != ERROR_SUCCESS) {
-            SetLastError(Error);
-            goto fail5;
-        }
-
-        Log("COPIED %s", Name);
-    }
-
-    free(Value);
-    free(Name);
-
-done:
-    Log("<====");
-
-    return TRUE;
-
-fail5:
-    Log("fail5");
-
-fail4:
-    Log("fail4");
-
-    free(Value);
-
-fail3:
-    Log("fail3");
-
-    free(Name);
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Log("fail1");
-
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-
-}
-
-static BOOLEAN
-CopyValues(
-    IN  PTCHAR  DestinationKeyName,
-    IN  PTCHAR  SourceKeyName
-    )
-{
-    HRESULT     Error;
-    HKEY        DestinationKey;
-    HKEY        SourceKey;
-
-    Log("====>");
-
-    Log("DESTINATION: %s", DestinationKeyName);
-    Log("SOURCE: %s", SourceKeyName);
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         SourceKeyName,
-                         0,
-                         KEY_ALL_ACCESS,
-                         &SourceKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-    
-    Error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
-                           DestinationKeyName,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &DestinationKey,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    CopyKeyValues(DestinationKey, SourceKey);
-
-    RegCloseKey(DestinationKey);
-    RegCloseKey(SourceKey);
-
-    Log("<====");
-
-    return TRUE;
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(SourceKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-CopyParameters(
-    IN  PTCHAR  Prefix,
-    IN  PTCHAR  DestinationName,
-    IN  PTCHAR  SourceName
-    )
-{
-    DWORD       Length;
-    PTCHAR      SourceKeyName;
-    PTCHAR      DestinationKeyName;
-    HRESULT     Result;
-    HRESULT     Error;
-    BOOLEAN     Success;
-
-    Log("====>");
-
-    Length = (DWORD)((strlen(Prefix) +
-                      strlen(DestinationName) +
-                      1) * sizeof (TCHAR));
-
-    DestinationKeyName = calloc(1, Length);
-    if (DestinationKeyName == NULL)
-        goto fail1;
-
-    Result = StringCbPrintf(DestinationKeyName,
-                            Length,
-                            "%s%s",
-                            Prefix,
-                            DestinationName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail2;
-    }
-
-    Length = (DWORD)((strlen(Prefix) +
-                      strlen(SourceName) +
-                      1) * sizeof (TCHAR));
-
-    SourceKeyName = calloc(1, Length);
-    if (SourceKeyName == NULL)
-        goto fail3;
-
-    Result = StringCbPrintf(SourceKeyName,
-                            Length,
-                            "%s%s",
-                            Prefix,
-                            SourceName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail4;
-    }
-
-    Success = CopyValues(DestinationKeyName, SourceKeyName);
-
-    free(SourceKeyName);
-    free(DestinationKeyName);
-
-    Log("<====");
-
-    return Success;
-
-fail4:
-    Log("fail4");
-
-    free(SourceKeyName);
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    free(DestinationKeyName);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-CopyIpVersion6Addresses(
-    IN  PTCHAR  DestinationKeyName,
-    IN  PTCHAR  SourceKeyName,
-    IN  PTCHAR  DestinationValueName,
-    IN  PTCHAR  SourceValueName
-    )
-{
-    HKEY        DestinationKey;
-    HKEY        SourceKey;
-    HRESULT     Error;
-    DWORD       Values;
-    DWORD       MaxNameLength;
-    PTCHAR      Name;
-    DWORD       MaxValueLength;
-    LPBYTE      Value;
-    DWORD       Index;
-
-    Log("DESTINATION: %s\\%s", DestinationKeyName, DestinationValueName);
-    Log("SOURCE: %s\\%s", SourceKeyName, SourceValueName);
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         SourceKeyName,
-                         0,
-                         KEY_ALL_ACCESS,
-                         &SourceKey);
-    if (Error != ERROR_SUCCESS) {
-        if (Error == ERROR_FILE_NOT_FOUND)
-            goto done;
-
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
-                           DestinationKeyName,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &DestinationKey,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    Error = RegQueryInfoKey(SourceKey,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            &Values,
-                            &MaxNameLength,
-                            &MaxValueLength,
-                            NULL,
-                            NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    if (Values == 0)
-        goto done;
-
-    MaxNameLength += sizeof (TCHAR);
-
-    Name = malloc(MaxNameLength);
-    if (Name == NULL)
-        goto fail4;
-
-    Value = malloc(MaxValueLength);
-    if (Value == NULL)
-        goto fail5;
-
-    for (Index = 0; Index < Values; Index++) {
-        DWORD   NameLength;
-        DWORD   ValueLength;
-        DWORD   Type;
-
-        NameLength = MaxNameLength;
-        memset(Name, 0, NameLength);
-
-        ValueLength = MaxValueLength;
-        memset(Value, 0, ValueLength);
-
-        Error = RegEnumValue(SourceKey,
-                             Index,
-                             (LPTSTR)Name,
-                             &NameLength,
-                             NULL,
-                             &Type,
-                             Value,
-                             &ValueLength);
-        if (Error != ERROR_SUCCESS) {
-            SetLastError(Error);
-            goto fail6;
-        }
-
-        if (strncmp(Name, SourceValueName, sizeof (ULONG64) * 2) != 0){
-            Log("Ignoring %s ( %s )", Name, SourceValueName);
-            continue;
-        }
-
-        Log("READ: %s", Name);
-
-        memcpy(Name, DestinationValueName, sizeof (ULONG64) * 2);
-
-        Log("WRITE: %s", Name);
-
-        Error = RegSetValueEx(DestinationKey,
-                              Name,
-                              0,
-                              Type,
-                              Value,
-                              ValueLength);
-        if (Error != ERROR_SUCCESS) {
-            SetLastError(Error);
-            goto fail7;
-        }
-    }
-
-    free(Value);
-    free(Name);
-
-    RegCloseKey(DestinationKey);
-    RegCloseKey(SourceKey);
-
-done:
-
-    return TRUE;
-
-fail7:
-    Log("fail7");
-
-fail6:
-    Log("fail6");
-
-    free(Value);
-
-fail5:
-    Log("fail5");
-
-    free(Name);
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-    RegCloseKey(DestinationKey);
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(SourceKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
 static PTCHAR
-GetIpVersion6AddressValueName(
-    IN  HKEY    Key
+GetProperty(
+    IN  HDEVINFO            DeviceInfoSet,
+    IN  PSP_DEVINFO_DATA    DeviceInfoData,
+    IN  DWORD               Index
     )
 {
-    HRESULT     Error;
-    DWORD       MaxValueLength;
-    DWORD       ValueLength;
-    LPDWORD     Value;
-    DWORD       Type;
-    NET_LUID    NetLuid;
-    DWORD       BufferLength;
-    PTCHAR      Buffer;
-    HRESULT     Result;
-
-    memset(&NetLuid, 0, sizeof (NetLuid));
-
-    Error = RegQueryInfoKey(Key,
-                            NULL,
-                            NULL,
-                            NULL,    
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            &MaxValueLength,
-                            NULL,
-                            NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    ValueLength = MaxValueLength;
-
-    Value = calloc(1, ValueLength);
-    if (Value == NULL)
-        goto fail2;
-
-    Error = RegQueryValueEx(Key,
-                            "NetLuidIndex",
-                            NULL,
-                            &Type,
-                            (LPBYTE)Value,
-                            &ValueLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    if (Type != REG_DWORD) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail4;
-    }
-
-    NetLuid.Info.NetLuidIndex = *Value;
+    DWORD                   Type;
+    DWORD                   PropertyLength;
+    PTCHAR                  Property;
+    HRESULT                 Error;
 
-    Error = RegQueryValueEx(Key,
-                            "*IfType",
-                            NULL,
-                            &Type,
-                            (LPBYTE)Value,
-                            &ValueLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail5;
+    if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
+                                          DeviceInfoData,
+                                          Index,
+                                          &Type,
+                                          NULL,
+                                          0,
+                                          &PropertyLength)) {
+        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+            goto fail1;
     }
 
-    if (Type != REG_DWORD) {
+    if (Type != REG_SZ) {
         SetLastError(ERROR_BAD_FORMAT);
-        goto fail6;
-    }
-
-    NetLuid.Info.IfType = *Value;
-
-    BufferLength = ((sizeof (ULONG64) * 2) + 1) * sizeof (TCHAR);
-
-    Buffer = calloc(1, BufferLength);
-    if (Buffer == NULL)
-        goto fail7;
-
-    Result = StringCbPrintf(Buffer,
-                            BufferLength,
-                            "%016llx",
-                            _byteswap_uint64(NetLuid.Value));
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail8;
+        goto fail2;
     }
 
-    free(Value);
-
-    return Buffer;
-
-fail8:
-    Log("fail8");
-
-    free(Buffer);
+    PropertyLength += sizeof (TCHAR);
 
-fail7:
-    Log("fail7");
+    Property = calloc(1, PropertyLength);
+    if (Property == NULL)
+        goto fail3;
 
-fail6:
-    Log("fail6");
+    if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
+                                          DeviceInfoData,
+                                          Index,
+                                          NULL,
+                                          (PBYTE)Property,
+                                          PropertyLength,
+                                          NULL))
+        goto fail4;
 
-fail5:
-    Log("fail5");
+    return Property;
 
 fail4:
-    Log("fail4");
+    free(Property);
 
 fail3:
     Log("fail3");
 
-    free(Value);
-
 fail2:
     Log("fail2");
 
@@ -1674,140 +279,67 @@ fail1:
 }
 
 static BOOLEAN
-CopySettings(
-    IN  HKEY    DestinationKey,
-    IN  HKEY    SourceKey
+SetFriendlyName(
+    IN  HDEVINFO            DeviceInfoSet,
+    IN  PSP_DEVINFO_DATA    DeviceInfoData
     )
 {
-    PTCHAR      DestinationName;
-    PTCHAR      SourceName;
-    BOOLEAN     Success;
-    HRESULT     Error;
-
-    Log("====>");
-
-    Success = TRUE;
-
-    SourceName = GetInterfaceName(SourceKey);
+    PTCHAR                  Description;
+    PTCHAR                  Location;
+    TCHAR                   FriendlyName[MAX_PATH];
+    DWORD                   FriendlyNameLength;
+    HRESULT                 Result;
+    HRESULT                 Error;
 
-    if (SourceName == NULL)
+    Description = GetProperty(DeviceInfoSet,
+                              DeviceInfoData,
+                              SPDRP_DEVICEDESC);
+    if (Description == NULL)
         goto fail1;
 
-    DestinationName = GetInterfaceName(DestinationKey);
-
-    if (DestinationName == NULL)
+    Location = GetProperty(DeviceInfoSet,
+                           DeviceInfoData,
+                           SPDRP_LOCATION_INFORMATION);
+    if (Location == NULL)
         goto fail2;
 
-    if (_stricmp(SourceName, DestinationName) == 0)
-        goto done;
-
-    Success &= CopyParameters(PARAMETERS_KEY(NetBT) "\\Interfaces\\Tcpip_",
-                              DestinationName,
-                              SourceName);
-    Success &= CopyParameters(PARAMETERS_KEY(Tcpip) "\\Interfaces\\",
-                              DestinationName,
-                              SourceName);
-    Success &= CopyParameters(PARAMETERS_KEY(Tcpip6) "\\Interfaces\\",
-                              DestinationName,
-                              SourceName);
-
-    free(DestinationName);
-    free(SourceName);
-
-    SourceName = GetIpVersion6AddressValueName(SourceKey);
-
-    if (SourceName == NULL)
+    Result = StringCbPrintf(FriendlyName,
+                            MAX_PATH,
+                            "%s #%s",
+                            Description,
+                            Location);
+    if (!SUCCEEDED(Result))
         goto fail3;
 
-    DestinationName = GetIpVersion6AddressValueName(DestinationKey);
+    FriendlyNameLength = (DWORD)(strlen(FriendlyName) + sizeof (TCHAR));
 
-    if (DestinationName == NULL)
+    if (!SetupDiSetDeviceRegistryProperty(DeviceInfoSet,
+                                          DeviceInfoData,
+                                          SPDRP_FRIENDLYNAME,
+                                          (PBYTE)FriendlyName,
+                                          FriendlyNameLength))
         goto fail4;
 
-    Success &= CopyIpVersion6Addresses(NSI_KEY "\\{eb004a01-9b1a-11d4-9123-0050047759bc}\\10\\",
-                                       NSI_KEY "\\{eb004a01-9b1a-11d4-9123-0050047759bc}\\10\\",
-                                       DestinationName,
-                                       SourceName);
+    Log("%s", FriendlyName);
 
-done:
-    free(DestinationName);
-    free(SourceName);
+    free(Location);
 
-    Log("<====");
+    free(Description);
 
-    return Success;
+    return TRUE;
 
 fail4:
     Log("fail4");
 
-    free(SourceName);
-    goto fail1;
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    free(SourceName);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-CopySettingsFromAlias(
-    IN  HDEVINFO                    DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA            DeviceInfoData,
-    IN  PTCHAR                      Name
-    )
-{
-    HKEY                            Source;
-    HKEY                            Destination;
-    BOOLEAN                         Success;
-    HRESULT                         Error;
-
-    Log("====> (%s)", Name);
-
-    Source = OpenAliasSoftwareKey(Name);
-    if (Source == NULL)
-        goto fail1;
-
-    Destination = OpenSoftwareKey(DeviceInfoSet, DeviceInfoData);
-    if (Destination == NULL)
-        goto fail2;
-
-    Success = CopySettings(Destination, Source);
-    if (!Success)
-        goto fail3;
-
-    RegCloseKey(Destination);
-
-    RegCloseKey(Source);
-
-    Log("<====");
-
-    return TRUE;
-
 fail3:
     Log("fail3");
 
-    RegCloseKey(Destination);
+    free(Location);
 
 fail2:
     Log("fail2");
 
-    RegCloseKey(Source);
+    free(Description);
 
 fail1:
     Error = GetLastError();
@@ -2447,8 +979,6 @@ __DifInstallPostProcess(
     )
 {
     BOOLEAN                         Success;
-    ETHERNET_ADDRESS                Address;
-    PTCHAR                          SoftwareKeyName;
     BOOLEAN                         NeedReboot;
     HRESULT                         Error;
 
@@ -2456,32 +986,14 @@ __DifInstallPostProcess(
 
     Log("====>");
 
-    Success = GetPermanentAddress(DeviceInfoSet,
-                                  DeviceInfoData,
-                                  &Address);
-    if (!Success)
-        goto fail1;
-
-    Success = FindAliasSoftwareKeyName(&Address, &SoftwareKeyName);
-    if (!Success)
-        goto fail2;
-
-    if (SoftwareKeyName != NULL) {
-        Success = CopySettingsFromAlias(DeviceInfoSet,
-                                        DeviceInfoData,
-                                        SoftwareKeyName);
-        if (!Success)
-            goto fail3;
-    }
-
     Success = SetFriendlyName(DeviceInfoSet,
                               DeviceInfoData);
     if (!Success)
-        goto fail4;
+        goto fail1;
 
     Success = InstallUnplugService("NICS", "XENNET");
     if (!Success)
-        goto fail5;
+        goto fail2;
 
     RegisterInterface("XENVIF", "VIF", XENVIF_VIF_INTERFACE_VERSION_MAX);
     RegisterInterface("XENBUS", "CACHE", XENBUS_CACHE_INTERFACE_VERSION_MAX);
@@ -2496,18 +1008,6 @@ __DifInstallPostProcess(
 
     return NO_ERROR;
 
-fail5:
-    Log("fail5");
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-    if (SoftwareKeyName != NULL)
-        free(SoftwareKeyName);
-
 fail2:
     Log("fail2");
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:56:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:56:38 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoty-0000w9-Hv; Wed, 08 Jul 2015 12:56:38 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCotw-0000vr-WD
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:56:37 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	BC/39-31258-40E1D955; Wed, 08 Jul 2015 12:56:36 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1436360195!30328971!1
X-Originating-IP: [209.85.212.178]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11628 invoked from network); 8 Jul 2015 12:56:35 -0000
Received: from mail-wi0-f178.google.com (HELO mail-wi0-f178.google.com)
	(209.85.212.178)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:56:35 -0000
Received: by wiga1 with SMTP id a1so284310606wig.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:56:35 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=lcTOfs6vBvRVkEToUX57Y2eOAjsak9ue26wBkdQ/0ns=;
	b=JXAdBNfosRZ1MM2cF2wlN6u3tIuhhS04POUYtBJXXNPnHPlBsyavUj8l7zBVqohmk8
	KrmlhM1lwARs/pYhgyiNuSEqeTERBrkeWgpG/oQnArZaDy+bKnOkZvYkgtxr0iWf4lD5
	rPTNpevZelGBqATU/bkDLDn0PUCCtSyaRRzBUmbeumZwIpG1gmcbM30SJYp3zcPtUQKH
	0JL39kfueCeUGZ+TFT/7ORiHw+tnij3sN+HKU2qDxrX/F5zX6hxSGTrVEfxq1WCY9ezy
	nEcHc6aAsPdV05AOsskW9qzz4t3sTOm+M2nsi+W9Lq9BaufgXk1fPhtN1o6vmj14Xx8e
	nbjw==
X-Received: by 10.194.93.3 with SMTP id cq3mr19056581wjb.20.1436360195272;
	Wed, 08 Jul 2015 05:56:35 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ft5sm1514683wib.4.2015.07.08.05.56.34
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:56:34 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:56:22 +0100
Message-Id: <1436360182-7324-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Avoid PDO namespace conflicts...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...by encoding the driver major version in the upper byte of the
revision.

This clearly implies that any future change in the driver major version
will start a new PDO namespace, but that it almost certainly the correct
thing to do in that case.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/pdo.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/xenbus/pdo.c b/src/xenbus/pdo.c
index 8b86f3b..58150d0 100644
--- a/src/xenbus/pdo.c
+++ b/src/xenbus/pdo.c
@@ -48,6 +48,7 @@
 #include "dbg_print.h"
 #include "assert.h"
 #include "util.h"
+#include "version.h"
 
 #define PDO_TAG 'ODP'
 
@@ -402,7 +403,7 @@ PdoSetRevisions(
     ULONG           Revision;
     NTSTATUS        status;
 
-    Revision = 0;
+    Revision = MAJOR_VERSION << 24;
 
     // Enumerate all possible combinations of exported interface versions since v1
     // and add a PDO revsion for each combination that's currently supported. Note that
@@ -460,7 +461,7 @@ PdoSetRevisions(
                                                      "RANGE_SET v%u "
                                                      "CACHE v%u "
                                                      "GNTTAB v%u "
-                                                     "EMULATED v%u\n",
+                                                     "EMULATED v%u "
                                                      "UNPLUG v%u\n",
                                                      Revision,
                                                      Suspend,
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 12:56:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 12:56:38 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCoty-0000w9-Hv; Wed, 08 Jul 2015 12:56:38 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCotw-0000vr-WD
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 12:56:37 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	BC/39-31258-40E1D955; Wed, 08 Jul 2015 12:56:36 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1436360195!30328971!1
X-Originating-IP: [209.85.212.178]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11628 invoked from network); 8 Jul 2015 12:56:35 -0000
Received: from mail-wi0-f178.google.com (HELO mail-wi0-f178.google.com)
	(209.85.212.178)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 12:56:35 -0000
Received: by wiga1 with SMTP id a1so284310606wig.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 05:56:35 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=lcTOfs6vBvRVkEToUX57Y2eOAjsak9ue26wBkdQ/0ns=;
	b=JXAdBNfosRZ1MM2cF2wlN6u3tIuhhS04POUYtBJXXNPnHPlBsyavUj8l7zBVqohmk8
	KrmlhM1lwARs/pYhgyiNuSEqeTERBrkeWgpG/oQnArZaDy+bKnOkZvYkgtxr0iWf4lD5
	rPTNpevZelGBqATU/bkDLDn0PUCCtSyaRRzBUmbeumZwIpG1gmcbM30SJYp3zcPtUQKH
	0JL39kfueCeUGZ+TFT/7ORiHw+tnij3sN+HKU2qDxrX/F5zX6hxSGTrVEfxq1WCY9ezy
	nEcHc6aAsPdV05AOsskW9qzz4t3sTOm+M2nsi+W9Lq9BaufgXk1fPhtN1o6vmj14Xx8e
	nbjw==
X-Received: by 10.194.93.3 with SMTP id cq3mr19056581wjb.20.1436360195272;
	Wed, 08 Jul 2015 05:56:35 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ft5sm1514683wib.4.2015.07.08.05.56.34
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 05:56:34 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 13:56:22 +0100
Message-Id: <1436360182-7324-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Avoid PDO namespace conflicts...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...by encoding the driver major version in the upper byte of the
revision.

This clearly implies that any future change in the driver major version
will start a new PDO namespace, but that it almost certainly the correct
thing to do in that case.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/pdo.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/xenbus/pdo.c b/src/xenbus/pdo.c
index 8b86f3b..58150d0 100644
--- a/src/xenbus/pdo.c
+++ b/src/xenbus/pdo.c
@@ -48,6 +48,7 @@
 #include "dbg_print.h"
 #include "assert.h"
 #include "util.h"
+#include "version.h"
 
 #define PDO_TAG 'ODP'
 
@@ -402,7 +403,7 @@ PdoSetRevisions(
     ULONG           Revision;
     NTSTATUS        status;
 
-    Revision = 0;
+    Revision = MAJOR_VERSION << 24;
 
     // Enumerate all possible combinations of exported interface versions since v1
     // and add a PDO revsion for each combination that's currently supported. Note that
@@ -460,7 +461,7 @@ PdoSetRevisions(
                                                      "RANGE_SET v%u "
                                                      "CACHE v%u "
                                                      "GNTTAB v%u "
-                                                     "EMULATED v%u\n",
+                                                     "EMULATED v%u "
                                                      "UNPLUG v%u\n",
                                                      Revision,
                                                      Suspend,
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 13:12:51 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 13:12:51 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCp9f-000270-98; Wed, 08 Jul 2015 13:12:51 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCp9e-00026v-I4
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 13:12:50 +0000
Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id
	35/E6-19215-1D12D955; Wed, 08 Jul 2015 13:12:49 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-3.tower-206.messagelabs.com!1436361169!12191125!1
X-Originating-IP: [74.125.82.45]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28166 invoked from network); 8 Jul 2015 13:12:49 -0000
Received: from mail-wg0-f45.google.com (HELO mail-wg0-f45.google.com)
	(74.125.82.45)
	by server-3.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 13:12:49 -0000
Received: by wgjx7 with SMTP id x7so195365612wgj.2
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 06:12:49 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=+3TmagCWywkmfy5JOMW7CMvRhG5tD/oKSTqGdokjLb8=;
	b=XWyk3ChpX/9neyUilqyVoDoR9UegC6CelqYhI9xmJJkxFR8f1MgklIAVgH9QqPbzhd
	V8kXK71xoCd7AmqW0EKvxLvoaLQ1T3kCOyMNdC7MbdG5wicP8BD034d2cEHcboHnsuc3
	1dnHCVePhSpVUnTVYgmHpO/uW63J4i26SW7GUznNwkAw8u59gGb6LtI6MKkIkvic5Qoo
	NEnHnEJ/hw7wwJjsfvOVExta94YfcSfbFW5EDIqo8NV/s5uh39j0x9G8u4L/96GN8I65
	KXlDra5MxC9sBqrg+/ID9Tr9umM5Laysc81nZhG7HuHRHcySKIB5QAHZjlry4L6cJGcV
	cojQ==
X-Received: by 10.180.100.197 with SMTP id fa5mr73866799wib.65.1436361168980; 
	Wed, 08 Jul 2015 06:12:48 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id d3sm3252481wic.1.2015.07.08.06.12.48
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 06:12:48 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 14:12:35 +0100
Message-Id: <1436361155-8124-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436361155-8124-1-git-send-email-paul.durrant@citrix.com>
References: <1436361155-8124-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Avoid PDO namespace conflicts...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...by encoding the driver major version in the upper byte of the
revision.

This clearly implies that any future change in the driver major version
will start a new PDO namespace, but that it almost certainly the correct
thing to do in that case.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/pdo.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 8b6fbd4..c0148aa 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -57,6 +57,7 @@
 #include "dbg_print.h"
 #include "assert.h"
 #include "util.h"
+#include "version.h"
 
 #define PDO_POOL 'ODP'
 
@@ -576,7 +577,7 @@ PdoSetRevisions(
     ULONG           Revision;
     NTSTATUS        status;
 
-    Revision = 0;
+    Revision = MAJOR_VERSION << 24;
 
     // Enumerate all possible combinations of exported interface versions since v1
     // and add a PDO revsion for each combination that's currently supported. Note that
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 13:12:51 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 13:12:51 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCp9f-000270-98; Wed, 08 Jul 2015 13:12:51 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCp9e-00026v-I4
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 13:12:50 +0000
Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id
	35/E6-19215-1D12D955; Wed, 08 Jul 2015 13:12:49 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-3.tower-206.messagelabs.com!1436361169!12191125!1
X-Originating-IP: [74.125.82.45]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28166 invoked from network); 8 Jul 2015 13:12:49 -0000
Received: from mail-wg0-f45.google.com (HELO mail-wg0-f45.google.com)
	(74.125.82.45)
	by server-3.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 13:12:49 -0000
Received: by wgjx7 with SMTP id x7so195365612wgj.2
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 06:12:49 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=+3TmagCWywkmfy5JOMW7CMvRhG5tD/oKSTqGdokjLb8=;
	b=XWyk3ChpX/9neyUilqyVoDoR9UegC6CelqYhI9xmJJkxFR8f1MgklIAVgH9QqPbzhd
	V8kXK71xoCd7AmqW0EKvxLvoaLQ1T3kCOyMNdC7MbdG5wicP8BD034d2cEHcboHnsuc3
	1dnHCVePhSpVUnTVYgmHpO/uW63J4i26SW7GUznNwkAw8u59gGb6LtI6MKkIkvic5Qoo
	NEnHnEJ/hw7wwJjsfvOVExta94YfcSfbFW5EDIqo8NV/s5uh39j0x9G8u4L/96GN8I65
	KXlDra5MxC9sBqrg+/ID9Tr9umM5Laysc81nZhG7HuHRHcySKIB5QAHZjlry4L6cJGcV
	cojQ==
X-Received: by 10.180.100.197 with SMTP id fa5mr73866799wib.65.1436361168980; 
	Wed, 08 Jul 2015 06:12:48 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id d3sm3252481wic.1.2015.07.08.06.12.48
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 06:12:48 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 14:12:35 +0100
Message-Id: <1436361155-8124-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436361155-8124-1-git-send-email-paul.durrant@citrix.com>
References: <1436361155-8124-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Avoid PDO namespace conflicts...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...by encoding the driver major version in the upper byte of the
revision.

This clearly implies that any future change in the driver major version
will start a new PDO namespace, but that it almost certainly the correct
thing to do in that case.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/pdo.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 8b6fbd4..c0148aa 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -57,6 +57,7 @@
 #include "dbg_print.h"
 #include "assert.h"
 #include "util.h"
+#include "version.h"
 
 #define PDO_POOL 'ODP'
 
@@ -576,7 +577,7 @@ PdoSetRevisions(
     ULONG           Revision;
     NTSTATUS        status;
 
-    Revision = 0;
+    Revision = MAJOR_VERSION << 24;
 
     // Enumerate all possible combinations of exported interface versions since v1
     // and add a PDO revsion for each combination that's currently supported. Note that
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 13:12:53 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 13:12:53 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCp9h-00027X-AD; Wed, 08 Jul 2015 13:12:53 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCp9f-000275-Tu
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 13:12:52 +0000
Received: from [193.109.254.147] by server-16.bemta-14.messagelabs.com id
	B8/25-31650-3D12D955; Wed, 08 Jul 2015 13:12:51 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1436361168!30280191!1
X-Originating-IP: [209.85.212.179]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24777 invoked from network); 8 Jul 2015 13:12:48 -0000
Received: from mail-wi0-f179.google.com (HELO mail-wi0-f179.google.com)
	(209.85.212.179)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 13:12:48 -0000
Received: by wiga1 with SMTP id a1so284739656wig.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 06:12:48 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=e+pOoritcwwlpSJtvvlzMeiWmrXjvlvMyZuz32asN+4=;
	b=ec/M+GvCT9A+xyxRvBgqkIEOdHYff0tqiRE9g0t4UYKsO+VqwWozLYOyY1ANPQ65ra
	uITTrMy3ETMnZFKpISPqdN7MgrVxkY/sCOdwuMN6IwWMEhJxI8Ay8vSroiFuIKdI1AyK
	9KqdXmRaah5IWEz9P0tt+dxvqANcpuUDEWb4qI580v7hZmpa6CKSeKhxnCdzU/4E6Kxv
	/OxCRPJqzv2MSb/DM0Duz/Nmt27j4tAdt46k+AtiS04oIYm6L36+WVDEljp0Qr4d//qV
	nSPY0wkcWk7llA3sSc4Xspj4vvpkMA1MMiVuEyw9AHwZnb8mHM+LCgkeUpFBtqlZQpEG
	pS1A==
X-Received: by 10.180.7.199 with SMTP id l7mr76652451wia.28.1436361168183;
	Wed, 08 Jul 2015 06:12:48 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id d3sm3252481wic.1.2015.07.08.06.12.47
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 06:12:47 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 14:12:34 +0100
Message-Id: <1436361155-8124-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/2] Update bindings
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Refresh the interface headers (just suspend_interface.h in this case) and
add the XENBUS major version into the top byte of the revision, since this
is now used to avoid namespace conflicts.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/suspend_interface.h | 2 +-
 src/xenvif.inf              | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/include/suspend_interface.h b/include/suspend_interface.h
index df1b4b0..cbe11ab 100644
--- a/include/suspend_interface.h
+++ b/include/suspend_interface.h
@@ -126,7 +126,7 @@ typedef VOID
 
     This method must always be invoked with IRQL == PASSIVE_LEVEL
 */
-typedef VOID
+typedef NTSTATUS
 (*XENBUS_SUSPEND_TRIGGER)(
     IN  PINTERFACE  Interface
     );
diff --git a/src/xenvif.inf b/src/xenvif.inf
index 74231ce..ab1fd36 100644
--- a/src/xenvif.inf
+++ b/src/xenvif.inf
@@ -58,9 +58,9 @@ xenvif_coinst_@MAJOR_VERSION@_@MINOR_VERSION@_@MICRO_VERSION@_@BUILD_NUMBER@.dll
 ; DisplayName		Section		DeviceID
 ; -----------		-------		--------
 
-%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XSC000&DEV_VIF&REV_00000004
-%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XS0001&DEV_VIF&REV_00000004
-%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XS0002&DEV_VIF&REV_00000004
+%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XSC000&DEV_VIF&REV_08000008
+%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XS0001&DEV_VIF&REV_08000008
+%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XS0002&DEV_VIF&REV_08000008
 
 [XenVif_Inst] 
 CopyFiles=XenVif_Copyfiles
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 13:12:53 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 13:12:53 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCp9h-00027X-AD; Wed, 08 Jul 2015 13:12:53 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCp9f-000275-Tu
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 13:12:52 +0000
Received: from [193.109.254.147] by server-16.bemta-14.messagelabs.com id
	B8/25-31650-3D12D955; Wed, 08 Jul 2015 13:12:51 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1436361168!30280191!1
X-Originating-IP: [209.85.212.179]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24777 invoked from network); 8 Jul 2015 13:12:48 -0000
Received: from mail-wi0-f179.google.com (HELO mail-wi0-f179.google.com)
	(209.85.212.179)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 13:12:48 -0000
Received: by wiga1 with SMTP id a1so284739656wig.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 06:12:48 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=e+pOoritcwwlpSJtvvlzMeiWmrXjvlvMyZuz32asN+4=;
	b=ec/M+GvCT9A+xyxRvBgqkIEOdHYff0tqiRE9g0t4UYKsO+VqwWozLYOyY1ANPQ65ra
	uITTrMy3ETMnZFKpISPqdN7MgrVxkY/sCOdwuMN6IwWMEhJxI8Ay8vSroiFuIKdI1AyK
	9KqdXmRaah5IWEz9P0tt+dxvqANcpuUDEWb4qI580v7hZmpa6CKSeKhxnCdzU/4E6Kxv
	/OxCRPJqzv2MSb/DM0Duz/Nmt27j4tAdt46k+AtiS04oIYm6L36+WVDEljp0Qr4d//qV
	nSPY0wkcWk7llA3sSc4Xspj4vvpkMA1MMiVuEyw9AHwZnb8mHM+LCgkeUpFBtqlZQpEG
	pS1A==
X-Received: by 10.180.7.199 with SMTP id l7mr76652451wia.28.1436361168183;
	Wed, 08 Jul 2015 06:12:48 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id d3sm3252481wic.1.2015.07.08.06.12.47
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 06:12:47 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 14:12:34 +0100
Message-Id: <1436361155-8124-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/2] Update bindings
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Refresh the interface headers (just suspend_interface.h in this case) and
add the XENBUS major version into the top byte of the revision, since this
is now used to avoid namespace conflicts.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/suspend_interface.h | 2 +-
 src/xenvif.inf              | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/include/suspend_interface.h b/include/suspend_interface.h
index df1b4b0..cbe11ab 100644
--- a/include/suspend_interface.h
+++ b/include/suspend_interface.h
@@ -126,7 +126,7 @@ typedef VOID
 
     This method must always be invoked with IRQL == PASSIVE_LEVEL
 */
-typedef VOID
+typedef NTSTATUS
 (*XENBUS_SUSPEND_TRIGGER)(
     IN  PINTERFACE  Interface
     );
diff --git a/src/xenvif.inf b/src/xenvif.inf
index 74231ce..ab1fd36 100644
--- a/src/xenvif.inf
+++ b/src/xenvif.inf
@@ -58,9 +58,9 @@ xenvif_coinst_@MAJOR_VERSION@_@MINOR_VERSION@_@MICRO_VERSION@_@BUILD_NUMBER@.dll
 ; DisplayName		Section		DeviceID
 ; -----------		-------		--------
 
-%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XSC000&DEV_VIF&REV_00000004
-%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XS0001&DEV_VIF&REV_00000004
-%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XS0002&DEV_VIF&REV_00000004
+%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XSC000&DEV_VIF&REV_08000008
+%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XS0001&DEV_VIF&REV_08000008
+%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XS0002&DEV_VIF&REV_08000008
 
 [XenVif_Inst] 
 CopyFiles=XenVif_Copyfiles
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 13:22:59 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 13:22:59 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCpJT-0002bu-Ez; Wed, 08 Jul 2015 13:22:59 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCpJS-0002bp-5O
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 13:22:58 +0000
Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id
	CF/2A-32406-1342D955; Wed, 08 Jul 2015 13:22:57 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-6.tower-31.messagelabs.com!1436361776!19440292!1
X-Originating-IP: [74.125.82.45]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30367 invoked from network); 8 Jul 2015 13:22:56 -0000
Received: from mail-wg0-f45.google.com (HELO mail-wg0-f45.google.com)
	(74.125.82.45)
	by server-6.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 13:22:56 -0000
Received: by wgxm20 with SMTP id m20so12463429wgx.3
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 06:22:56 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=Oytuuss5F5UoFmP0nZDtw4FrKvvZbyBLvSxfYgIjt9A=;
	b=iFz+4MxQZXPofkfdm67EPmyIsXIleYOcTuMMYk8LUlBcJX/RQlGE8FpJuhDogjlJUa
	oWTtRzIhPeB5bzfCNPAWgxfXLB1qMDiJ/x3DOBEivFWKYuDMiTXKHaqt9VR5O8TgjBlm
	xHodsawOH69vi4NwNNFDZq7yNcfbjppaR9Yh5uuOQunq7lVfNSoRGR/Tdy7idQeRUgYV
	5RSCyg3ALfZPa4ugLei02BG8V2SprqWCO7Alq6Xru6+rxw0c99Gn3l5NMlTcXePFUk6i
	JL8+mOXCsel1n5NxhD/b4fhKywUi7eaySw87L0uQXxGNLPzPTWI2JgoBTMMsPCp8bJRB
	ocpg==
X-Received: by 10.194.176.68 with SMTP id cg4mr19254617wjc.106.1436361776244; 
	Wed, 08 Jul 2015 06:22:56 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id k16sm3495646wjr.7.2015.07.08.06.22.55
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 06:22:55 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 14:22:44 +0100
Message-Id: <1436361764-1928-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Update bindings
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Add the XENVIF major version into the top byte of the revision, since this
is now used to avoid namespace conflicts.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xennet.inf | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/xennet.inf b/src/xennet.inf
index 1adf079..e94b07e 100644
--- a/src/xennet.inf
+++ b/src/xennet.inf
@@ -61,9 +61,9 @@ xennet_coinst_@MAJOR_VERSION@_@MINOR_VERSION@_@MICRO_VERSION@_@BUILD_NUMBER@.dll
 ; DisplayName		Section		DeviceID
 ; -----------		-------		--------
 
-%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_XSC000&DEV_NET&REV_00000002
-%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_XS0001&DEV_NET&REV_00000002
-%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_XS0002&DEV_NET&REV_00000002
+%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_XSC000&DEV_NET&REV_08000002
+%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_XS0001&DEV_NET&REV_08000002
+%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_XS0002&DEV_NET&REV_08000002
 
 [XenNet_Inst] 
 Characteristics=0x84
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 13:22:59 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 13:22:59 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCpJT-0002bu-Ez; Wed, 08 Jul 2015 13:22:59 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCpJS-0002bp-5O
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 13:22:58 +0000
Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id
	CF/2A-32406-1342D955; Wed, 08 Jul 2015 13:22:57 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-6.tower-31.messagelabs.com!1436361776!19440292!1
X-Originating-IP: [74.125.82.45]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30367 invoked from network); 8 Jul 2015 13:22:56 -0000
Received: from mail-wg0-f45.google.com (HELO mail-wg0-f45.google.com)
	(74.125.82.45)
	by server-6.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 13:22:56 -0000
Received: by wgxm20 with SMTP id m20so12463429wgx.3
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 06:22:56 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=Oytuuss5F5UoFmP0nZDtw4FrKvvZbyBLvSxfYgIjt9A=;
	b=iFz+4MxQZXPofkfdm67EPmyIsXIleYOcTuMMYk8LUlBcJX/RQlGE8FpJuhDogjlJUa
	oWTtRzIhPeB5bzfCNPAWgxfXLB1qMDiJ/x3DOBEivFWKYuDMiTXKHaqt9VR5O8TgjBlm
	xHodsawOH69vi4NwNNFDZq7yNcfbjppaR9Yh5uuOQunq7lVfNSoRGR/Tdy7idQeRUgYV
	5RSCyg3ALfZPa4ugLei02BG8V2SprqWCO7Alq6Xru6+rxw0c99Gn3l5NMlTcXePFUk6i
	JL8+mOXCsel1n5NxhD/b4fhKywUi7eaySw87L0uQXxGNLPzPTWI2JgoBTMMsPCp8bJRB
	ocpg==
X-Received: by 10.194.176.68 with SMTP id cg4mr19254617wjc.106.1436361776244; 
	Wed, 08 Jul 2015 06:22:56 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id k16sm3495646wjr.7.2015.07.08.06.22.55
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 06:22:55 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 14:22:44 +0100
Message-Id: <1436361764-1928-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Update bindings
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Add the XENVIF major version into the top byte of the revision, since this
is now used to avoid namespace conflicts.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xennet.inf | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/xennet.inf b/src/xennet.inf
index 1adf079..e94b07e 100644
--- a/src/xennet.inf
+++ b/src/xennet.inf
@@ -61,9 +61,9 @@ xennet_coinst_@MAJOR_VERSION@_@MINOR_VERSION@_@MICRO_VERSION@_@BUILD_NUMBER@.dll
 ; DisplayName		Section		DeviceID
 ; -----------		-------		--------
 
-%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_XSC000&DEV_NET&REV_00000002
-%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_XS0001&DEV_NET&REV_00000002
-%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_XS0002&DEV_NET&REV_00000002
+%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_XSC000&DEV_NET&REV_08000002
+%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_XS0001&DEV_NET&REV_08000002
+%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_XS0002&DEV_NET&REV_08000002
 
 [XenNet_Inst] 
 Characteristics=0x84
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 13:29:57 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 13:29:57 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCpQD-0002si-0k; Wed, 08 Jul 2015 13:29:57 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCpQB-0002sd-KO
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 13:29:55 +0000
Received: from [85.158.137.68] by server-7.bemta-3.messagelabs.com id
	FF/8E-06457-2D52D955; Wed, 08 Jul 2015 13:29:54 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1436362194!23918566!1
X-Originating-IP: [209.85.212.180]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14650 invoked from network); 8 Jul 2015 13:29:54 -0000
Received: from mail-wi0-f180.google.com (HELO mail-wi0-f180.google.com)
	(209.85.212.180)
	by server-3.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 13:29:54 -0000
Received: by widjy10 with SMTP id jy10so217253703wid.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 06:29:54 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=92X+SZ5d6Al+imBKc6iiKrwWSE08I6tDgJR8cCT8kxs=;
	b=lm6/tcY9ozNgidzDtoluT31NDrq2QasutVM/08MhdAOcrsyX7tGBDSiFri86DZSkOH
	AkfzCmN5MZUUTIf5/zyr/sKfEIG/gI4A/SfM6Eai4Zc9ctS+yieBgAg1HEHdChNd+jVv
	PezBP+cpaR2YJktn9ABaxX8GhPEkpfeOZTifuCUxIntL8kefK07guCqoRJ9ooFEtkHwM
	CFKpY/u2SrglwGgsm50dbmxi8cMajSVvNE0pccKav0YfJ++zr2occoJzWudyNNzUvjyU
	0a7Wf+6kVEV3S2Enx0mLu+iNvKkaiwiVP8zyv56QBJGGrxon3ElYcuC579cvyYlDQ8yX
	q2tw==
X-Received: by 10.180.91.166 with SMTP id cf6mr71862399wib.61.1436362193967;
	Wed, 08 Jul 2015 06:29:53 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id jy6sm3535380wjc.4.2015.07.08.06.29.53
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 06:29:53 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 14:29:42 +0100
Message-Id: <1436362182-8868-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Update bindings
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Refresh the interface headers and add the XENBUS major version into
the top byte of the revision, since this is now used to avoid namespace
conflicts.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/shared_info_interface.h | 47 ++++++++++++++++++++++++++++++++++++-----
 include/store_interface.h       |  1 +
 include/suspend_interface.h     |  3 ++-
 src/xeniface.inf                |  6 +++---
 4 files changed, 48 insertions(+), 9 deletions(-)

diff --git a/include/shared_info_interface.h b/include/shared_info_interface.h
index af0f243..287feab 100644
--- a/include/shared_info_interface.h
+++ b/include/shared_info_interface.h
@@ -40,9 +40,6 @@
 
 #ifndef _WINDLL
 
-#define XENBUS_SHARED_INFO_EVTCHN_PER_SELECTOR     (sizeof (ULONG_PTR) * 8)
-#define XENBUS_SHARED_INFO_EVTCHN_SELECTOR_COUNT   (RTL_FIELD_SIZE(shared_info_t, evtchn_pending) / sizeof (ULONG_PTR))
-
 /*! \typedef XENBUS_SHARED_INFO_ACQUIRE
     \brief Acquire a reference to the SHARED_INFO interface
 
@@ -63,11 +60,34 @@ typedef VOID
     IN  PINTERFACE  Interface
     );
 
+/*! \typedef XENBUS_SHARED_INFO_UPCALL_PENDING
+    \brief Private method for EVTCHN inerface
+*/
+typedef BOOLEAN
+(*XENBUS_SHARED_INFO_UPCALL_PENDING)(
+    IN  PINTERFACE  Interface,
+    IN  ULONG       Index
+    );
+
+typedef BOOLEAN
+(*XENBUS_SHARED_INFO_EVENT)(
+    IN  PVOID   Argument,
+    IN  ULONG   Port
+    );
+
 /*! \typedef XENBUS_SHARED_INFO_EVTCHN_POLL
     \brief Private method for EVTCHN inerface
 */  
 typedef BOOLEAN
 (*XENBUS_SHARED_INFO_EVTCHN_POLL)(
+    IN  PINTERFACE                  Interface,
+    IN  ULONG                       Index,
+    IN  XENBUS_SHARED_INFO_EVENT    Event,
+    IN  PVOID                       Argument
+    );
+
+typedef BOOLEAN
+(*XENBUS_SHARED_INFO_EVTCHN_POLL_V1)(
     IN  PINTERFACE  Interface,
     IN  BOOLEAN     (*Function)(PVOID, ULONG),
     IN  PVOID       Argument
@@ -117,11 +137,28 @@ DEFINE_GUID(GUID_XENBUS_SHARED_INFO_INTERFACE,
 
 /*! \struct _XENBUS_SHARED_INFO_INTERFACE_V1
     \brief SHARED_INFO interface version 1
+    \ingroup interfaces
 */
 struct _XENBUS_SHARED_INFO_INTERFACE_V1 {
     INTERFACE                           Interface;
     XENBUS_SHARED_INFO_ACQUIRE          SharedInfoAcquire;
     XENBUS_SHARED_INFO_RELEASE          SharedInfoRelease;
+    XENBUS_SHARED_INFO_EVTCHN_POLL_V1   SharedInfoEvtchnPollVersion1;
+    XENBUS_SHARED_INFO_EVTCHN_ACK       SharedInfoEvtchnAck;
+    XENBUS_SHARED_INFO_EVTCHN_MASK      SharedInfoEvtchnMask;
+    XENBUS_SHARED_INFO_EVTCHN_UNMASK    SharedInfoEvtchnUnmask;
+    XENBUS_SHARED_INFO_GET_TIME         SharedInfoGetTime;
+};
+
+/*! \struct _XENBUS_SHARED_INFO_INTERFACE_V2
+    \brief SHARED_INFO interface version 2
+    \ingroup interfaces
+*/
+struct _XENBUS_SHARED_INFO_INTERFACE_V2 {
+    INTERFACE                           Interface;
+    XENBUS_SHARED_INFO_ACQUIRE          SharedInfoAcquire;
+    XENBUS_SHARED_INFO_RELEASE          SharedInfoRelease;
+    XENBUS_SHARED_INFO_UPCALL_PENDING   SharedInfoUpcallPending;
     XENBUS_SHARED_INFO_EVTCHN_POLL      SharedInfoEvtchnPoll;
     XENBUS_SHARED_INFO_EVTCHN_ACK       SharedInfoEvtchnAck;
     XENBUS_SHARED_INFO_EVTCHN_MASK      SharedInfoEvtchnMask;
@@ -129,7 +166,7 @@ struct _XENBUS_SHARED_INFO_INTERFACE_V1 {
     XENBUS_SHARED_INFO_GET_TIME         SharedInfoGetTime;
 };
 
-typedef struct _XENBUS_SHARED_INFO_INTERFACE_V1 XENBUS_SHARED_INFO_INTERFACE, *PXENBUS_SHARED_INFO_INTERFACE;
+typedef struct _XENBUS_SHARED_INFO_INTERFACE_V2 XENBUS_SHARED_INFO_INTERFACE, *PXENBUS_SHARED_INFO_INTERFACE;
 
 /*! \def XENBUS_SHARED_INFO
     \brief Macro at assist in method invocation
@@ -140,6 +177,6 @@ typedef struct _XENBUS_SHARED_INFO_INTERFACE_V1 XENBUS_SHARED_INFO_INTERFACE, *P
 #endif  // _WINDLL
 
 #define XENBUS_SHARED_INFO_INTERFACE_VERSION_MIN    1
-#define XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX    1
+#define XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX    2
 
 #endif  // _XENBUS_SHARED_INFO_H
diff --git a/include/store_interface.h b/include/store_interface.h
index f052b8f..5bcbba3 100644
--- a/include/store_interface.h
+++ b/include/store_interface.h
@@ -269,6 +269,7 @@ struct _XENBUS_STORE_INTERFACE_V1 {
 
 /*! \struct _XENBUS_STORE_INTERFACE_V1
     \brief STORE interface version 1
+    \ingroup interfaces
 */
 typedef struct _XENBUS_STORE_INTERFACE_V1 XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
 
diff --git a/include/suspend_interface.h b/include/suspend_interface.h
index 1a39141..cbe11ab 100644
--- a/include/suspend_interface.h
+++ b/include/suspend_interface.h
@@ -126,7 +126,7 @@ typedef VOID
 
     This method must always be invoked with IRQL == PASSIVE_LEVEL
 */
-typedef VOID
+typedef NTSTATUS
 (*XENBUS_SUSPEND_TRIGGER)(
     IN  PINTERFACE  Interface
     );
@@ -148,6 +148,7 @@ DEFINE_GUID(GUID_XENBUS_SUSPEND_INTERFACE,
 
 /*! \struct _XENBUS_SUSPEND_INTERFACE_V1
     \brief SUSPEND interface version 1
+    \ingroup interfaces
 */
 struct _XENBUS_SUSPEND_INTERFACE_V1 {
     INTERFACE                   Interface;
diff --git a/src/xeniface.inf b/src/xeniface.inf
index 44a54fc..9bb154a 100644
--- a/src/xeniface.inf
+++ b/src/xeniface.inf
@@ -48,9 +48,9 @@ ServiceDestDir.NT.Copy = 11
 ; DisplayName		    Section	      DeviceID
 ; -----------		    -------	      --------
 
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XSC000&DEV_IFACE&REV_00000001
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XS0001&DEV_IFACE&REV_00000001
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XS0002&DEV_IFACE&REV_00000001
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XSC000&DEV_IFACE&REV_08000008
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XS0001&DEV_IFACE&REV_08000008
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XS0002&DEV_IFACE&REV_08000008
 
 [XenIface_Device.NT$ARCH$]
 CopyFiles=XenIface_Device.NT.Copy, ServiceDestDir.NT.Copy
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 13:29:57 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 13:29:57 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCpQD-0002si-0k; Wed, 08 Jul 2015 13:29:57 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCpQB-0002sd-KO
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 13:29:55 +0000
Received: from [85.158.137.68] by server-7.bemta-3.messagelabs.com id
	FF/8E-06457-2D52D955; Wed, 08 Jul 2015 13:29:54 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1436362194!23918566!1
X-Originating-IP: [209.85.212.180]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14650 invoked from network); 8 Jul 2015 13:29:54 -0000
Received: from mail-wi0-f180.google.com (HELO mail-wi0-f180.google.com)
	(209.85.212.180)
	by server-3.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 13:29:54 -0000
Received: by widjy10 with SMTP id jy10so217253703wid.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 06:29:54 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=92X+SZ5d6Al+imBKc6iiKrwWSE08I6tDgJR8cCT8kxs=;
	b=lm6/tcY9ozNgidzDtoluT31NDrq2QasutVM/08MhdAOcrsyX7tGBDSiFri86DZSkOH
	AkfzCmN5MZUUTIf5/zyr/sKfEIG/gI4A/SfM6Eai4Zc9ctS+yieBgAg1HEHdChNd+jVv
	PezBP+cpaR2YJktn9ABaxX8GhPEkpfeOZTifuCUxIntL8kefK07guCqoRJ9ooFEtkHwM
	CFKpY/u2SrglwGgsm50dbmxi8cMajSVvNE0pccKav0YfJ++zr2occoJzWudyNNzUvjyU
	0a7Wf+6kVEV3S2Enx0mLu+iNvKkaiwiVP8zyv56QBJGGrxon3ElYcuC579cvyYlDQ8yX
	q2tw==
X-Received: by 10.180.91.166 with SMTP id cf6mr71862399wib.61.1436362193967;
	Wed, 08 Jul 2015 06:29:53 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id jy6sm3535380wjc.4.2015.07.08.06.29.53
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 06:29:53 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 14:29:42 +0100
Message-Id: <1436362182-8868-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Update bindings
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Refresh the interface headers and add the XENBUS major version into
the top byte of the revision, since this is now used to avoid namespace
conflicts.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/shared_info_interface.h | 47 ++++++++++++++++++++++++++++++++++++-----
 include/store_interface.h       |  1 +
 include/suspend_interface.h     |  3 ++-
 src/xeniface.inf                |  6 +++---
 4 files changed, 48 insertions(+), 9 deletions(-)

diff --git a/include/shared_info_interface.h b/include/shared_info_interface.h
index af0f243..287feab 100644
--- a/include/shared_info_interface.h
+++ b/include/shared_info_interface.h
@@ -40,9 +40,6 @@
 
 #ifndef _WINDLL
 
-#define XENBUS_SHARED_INFO_EVTCHN_PER_SELECTOR     (sizeof (ULONG_PTR) * 8)
-#define XENBUS_SHARED_INFO_EVTCHN_SELECTOR_COUNT   (RTL_FIELD_SIZE(shared_info_t, evtchn_pending) / sizeof (ULONG_PTR))
-
 /*! \typedef XENBUS_SHARED_INFO_ACQUIRE
     \brief Acquire a reference to the SHARED_INFO interface
 
@@ -63,11 +60,34 @@ typedef VOID
     IN  PINTERFACE  Interface
     );
 
+/*! \typedef XENBUS_SHARED_INFO_UPCALL_PENDING
+    \brief Private method for EVTCHN inerface
+*/
+typedef BOOLEAN
+(*XENBUS_SHARED_INFO_UPCALL_PENDING)(
+    IN  PINTERFACE  Interface,
+    IN  ULONG       Index
+    );
+
+typedef BOOLEAN
+(*XENBUS_SHARED_INFO_EVENT)(
+    IN  PVOID   Argument,
+    IN  ULONG   Port
+    );
+
 /*! \typedef XENBUS_SHARED_INFO_EVTCHN_POLL
     \brief Private method for EVTCHN inerface
 */  
 typedef BOOLEAN
 (*XENBUS_SHARED_INFO_EVTCHN_POLL)(
+    IN  PINTERFACE                  Interface,
+    IN  ULONG                       Index,
+    IN  XENBUS_SHARED_INFO_EVENT    Event,
+    IN  PVOID                       Argument
+    );
+
+typedef BOOLEAN
+(*XENBUS_SHARED_INFO_EVTCHN_POLL_V1)(
     IN  PINTERFACE  Interface,
     IN  BOOLEAN     (*Function)(PVOID, ULONG),
     IN  PVOID       Argument
@@ -117,11 +137,28 @@ DEFINE_GUID(GUID_XENBUS_SHARED_INFO_INTERFACE,
 
 /*! \struct _XENBUS_SHARED_INFO_INTERFACE_V1
     \brief SHARED_INFO interface version 1
+    \ingroup interfaces
 */
 struct _XENBUS_SHARED_INFO_INTERFACE_V1 {
     INTERFACE                           Interface;
     XENBUS_SHARED_INFO_ACQUIRE          SharedInfoAcquire;
     XENBUS_SHARED_INFO_RELEASE          SharedInfoRelease;
+    XENBUS_SHARED_INFO_EVTCHN_POLL_V1   SharedInfoEvtchnPollVersion1;
+    XENBUS_SHARED_INFO_EVTCHN_ACK       SharedInfoEvtchnAck;
+    XENBUS_SHARED_INFO_EVTCHN_MASK      SharedInfoEvtchnMask;
+    XENBUS_SHARED_INFO_EVTCHN_UNMASK    SharedInfoEvtchnUnmask;
+    XENBUS_SHARED_INFO_GET_TIME         SharedInfoGetTime;
+};
+
+/*! \struct _XENBUS_SHARED_INFO_INTERFACE_V2
+    \brief SHARED_INFO interface version 2
+    \ingroup interfaces
+*/
+struct _XENBUS_SHARED_INFO_INTERFACE_V2 {
+    INTERFACE                           Interface;
+    XENBUS_SHARED_INFO_ACQUIRE          SharedInfoAcquire;
+    XENBUS_SHARED_INFO_RELEASE          SharedInfoRelease;
+    XENBUS_SHARED_INFO_UPCALL_PENDING   SharedInfoUpcallPending;
     XENBUS_SHARED_INFO_EVTCHN_POLL      SharedInfoEvtchnPoll;
     XENBUS_SHARED_INFO_EVTCHN_ACK       SharedInfoEvtchnAck;
     XENBUS_SHARED_INFO_EVTCHN_MASK      SharedInfoEvtchnMask;
@@ -129,7 +166,7 @@ struct _XENBUS_SHARED_INFO_INTERFACE_V1 {
     XENBUS_SHARED_INFO_GET_TIME         SharedInfoGetTime;
 };
 
-typedef struct _XENBUS_SHARED_INFO_INTERFACE_V1 XENBUS_SHARED_INFO_INTERFACE, *PXENBUS_SHARED_INFO_INTERFACE;
+typedef struct _XENBUS_SHARED_INFO_INTERFACE_V2 XENBUS_SHARED_INFO_INTERFACE, *PXENBUS_SHARED_INFO_INTERFACE;
 
 /*! \def XENBUS_SHARED_INFO
     \brief Macro at assist in method invocation
@@ -140,6 +177,6 @@ typedef struct _XENBUS_SHARED_INFO_INTERFACE_V1 XENBUS_SHARED_INFO_INTERFACE, *P
 #endif  // _WINDLL
 
 #define XENBUS_SHARED_INFO_INTERFACE_VERSION_MIN    1
-#define XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX    1
+#define XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX    2
 
 #endif  // _XENBUS_SHARED_INFO_H
diff --git a/include/store_interface.h b/include/store_interface.h
index f052b8f..5bcbba3 100644
--- a/include/store_interface.h
+++ b/include/store_interface.h
@@ -269,6 +269,7 @@ struct _XENBUS_STORE_INTERFACE_V1 {
 
 /*! \struct _XENBUS_STORE_INTERFACE_V1
     \brief STORE interface version 1
+    \ingroup interfaces
 */
 typedef struct _XENBUS_STORE_INTERFACE_V1 XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE;
 
diff --git a/include/suspend_interface.h b/include/suspend_interface.h
index 1a39141..cbe11ab 100644
--- a/include/suspend_interface.h
+++ b/include/suspend_interface.h
@@ -126,7 +126,7 @@ typedef VOID
 
     This method must always be invoked with IRQL == PASSIVE_LEVEL
 */
-typedef VOID
+typedef NTSTATUS
 (*XENBUS_SUSPEND_TRIGGER)(
     IN  PINTERFACE  Interface
     );
@@ -148,6 +148,7 @@ DEFINE_GUID(GUID_XENBUS_SUSPEND_INTERFACE,
 
 /*! \struct _XENBUS_SUSPEND_INTERFACE_V1
     \brief SUSPEND interface version 1
+    \ingroup interfaces
 */
 struct _XENBUS_SUSPEND_INTERFACE_V1 {
     INTERFACE                   Interface;
diff --git a/src/xeniface.inf b/src/xeniface.inf
index 44a54fc..9bb154a 100644
--- a/src/xeniface.inf
+++ b/src/xeniface.inf
@@ -48,9 +48,9 @@ ServiceDestDir.NT.Copy = 11
 ; DisplayName		    Section	      DeviceID
 ; -----------		    -------	      --------
 
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XSC000&DEV_IFACE&REV_00000001
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XS0001&DEV_IFACE&REV_00000001
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XS0002&DEV_IFACE&REV_00000001
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XSC000&DEV_IFACE&REV_08000008
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XS0001&DEV_IFACE&REV_08000008
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XS0002&DEV_IFACE&REV_08000008
 
 [XenIface_Device.NT$ARCH$]
 CopyFiles=XenIface_Device.NT.Copy, ServiceDestDir.NT.Copy
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 13:37:22 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 13:37:22 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCpXO-0003Ia-IP; Wed, 08 Jul 2015 13:37:22 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCpXM-0003IV-Qt
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 13:37:21 +0000
Received: from [193.109.254.147] by server-15.bemta-14.messagelabs.com id
	09/D7-18947-F872D955; Wed, 08 Jul 2015 13:37:19 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1436362638!30352760!1
X-Originating-IP: [209.85.212.171]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14328 invoked from network); 8 Jul 2015 13:37:18 -0000
Received: from mail-wi0-f171.google.com (HELO mail-wi0-f171.google.com)
	(209.85.212.171)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 13:37:18 -0000
Received: by wiclp1 with SMTP id lp1so80783639wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 06:37:18 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=w1cLOatW0DD6tGaymP+4ASj1QKnxudcir41Z+oo/poc=;
	b=e6LsDqkdPzbgTe8igWq92PP949S7ynMIbegBu/wSdYHEItmdTzJqy6MKu2RJ0Tym/e
	njNdVa1WrU1U+IRW38LM0tVhQSeH7dMu51STZbZqQ+PFIMfo00GlA2FQx8TohOZyGvdl
	BUnIVIuoSzwSBCUT2YBVNukgYBP4zZAYm5uOYfYEzkYU55PWJyzupLn1rTYOPPlQ6dad
	fm4fGuFKsJLPFU7vlwLuMCw4i/2s2U9ubsYrIhjk+FjsN4o1EcumUIWPMs3Fx4fOkoie
	u3adY/MBOrZB3aIJm2V9saXP/96A3GgTjLZjf8NW2v9bslmERUFuPeK+pTCYvmeGHo3+
	VynQ==
X-Received: by 10.180.76.202 with SMTP id m10mr35846991wiw.63.1436362637927;
	Wed, 08 Jul 2015 06:37:17 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	fa8sm2995642wib.14.2015.07.08.06.37.17
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 06:37:17 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 14:37:06 +0100
Message-Id: <1436362626-8464-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Update bindings
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Refresh the interface headers and add the XENBUS major version into
the top byte of the revision, since this is now used to avoid namespace
conflicts.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/emulated_interface.h |  5 +++--
 include/evtchn_interface.h   | 36 +++++++++++++++++++++++++++++++-----
 include/suspend_interface.h  |  2 +-
 src/xenvbd.inf               |  6 +++---
 4 files changed, 38 insertions(+), 11 deletions(-)

diff --git a/include/emulated_interface.h b/include/emulated_interface.h
index 85ed2b8..9361f8d 100644
--- a/include/emulated_interface.h
+++ b/include/emulated_interface.h
@@ -66,7 +66,8 @@ typedef VOID
 
     \param Interface The interface header
     \param DeviceID The DeviceID of the device
-    \param InstanceID The (un-prefixed) InstanceID of the device
+    \param InstanceID The (un-prefixed) InstanceID of the device or
+           NULL to match any device instance
     \return TRUE if the specified device is present in the system or
     FALSE if it is not
 */  
@@ -74,7 +75,7 @@ typedef BOOLEAN
 (*XENFILT_EMULATED_IS_DEVICE_PRESENT)(
     IN  PVOID   Context,
     IN  PCHAR   DeviceID,
-    IN  PCHAR   InstanceID
+    IN  PCHAR   InstanceID OPTIONAL
     );
 
 /*! \typedef XENFILT_EMULATED_IS_DISK_PRESENT
diff --git a/include/evtchn_interface.h b/include/evtchn_interface.h
index 1bc456a..6f8fe42 100644
--- a/include/evtchn_interface.h
+++ b/include/evtchn_interface.h
@@ -112,18 +112,27 @@ typedef PXENBUS_EVTCHN_CHANNEL
     ...
     );
 
+typedef NTSTATUS
+(*XENBUS_EVTCHN_BIND_V2)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
+    IN  ULONG                   Cpu
+    );
+
 /*! \typedef XENBUS_EVTCHN_BIND
     \brief Bind an event channel to a specific CPU
 
     \param Interface The interface header
     \param Channel The channel handle
-    \param Cpu The CPU that should handle events
+    \param Group The group number of the CPU that should handle events
+    \param Number The relative number of the CPU that should handle events
 */
 typedef NTSTATUS
 (*XENBUS_EVTCHN_BIND)(
     IN  PINTERFACE              Interface,
     IN  PXENBUS_EVTCHN_CHANNEL  Channel,
-    IN  ULONG                   Cpu
+    IN  USHORT                  Group,
+    IN  UCHAR                   Number
     );
 
 typedef BOOLEAN
@@ -225,7 +234,7 @@ struct _XENBUS_EVTCHN_INTERFACE_V2 {
     XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
     XENBUS_EVTCHN_RELEASE   EvtchnRelease;
     XENBUS_EVTCHN_OPEN      EvtchnOpen;
-    XENBUS_EVTCHN_BIND      EvtchnBind;
+    XENBUS_EVTCHN_BIND_V2   EvtchnBindVersion2;
     XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
     XENBUS_EVTCHN_SEND      EvtchnSend;
     XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
@@ -242,6 +251,23 @@ struct _XENBUS_EVTCHN_INTERFACE_V3 {
     XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
     XENBUS_EVTCHN_RELEASE   EvtchnRelease;
     XENBUS_EVTCHN_OPEN      EvtchnOpen;
+    XENBUS_EVTCHN_BIND_V2   EvtchnBindVersion2;
+    XENBUS_EVTCHN_UNMASK    EvtchnUnmask;
+    XENBUS_EVTCHN_SEND      EvtchnSend;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V4
+    \brief EVTCHN interface version 4
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V4 {
+    INTERFACE               Interface;
+    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
+    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
+    XENBUS_EVTCHN_OPEN      EvtchnOpen;
     XENBUS_EVTCHN_BIND      EvtchnBind;
     XENBUS_EVTCHN_UNMASK    EvtchnUnmask;
     XENBUS_EVTCHN_SEND      EvtchnSend;
@@ -250,7 +276,7 @@ struct _XENBUS_EVTCHN_INTERFACE_V3 {
     XENBUS_EVTCHN_CLOSE     EvtchnClose;
 };
 
-typedef struct _XENBUS_EVTCHN_INTERFACE_V3 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
+typedef struct _XENBUS_EVTCHN_INTERFACE_V4 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
 
 /*! \def XENBUS_EVTCHN
     \brief Macro at assist in method invocation
@@ -261,7 +287,7 @@ typedef struct _XENBUS_EVTCHN_INTERFACE_V3 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVT
 #endif  // _WINDLL
 
 #define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 1
-#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 3
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 4
 
 #endif  // _XENBUS_EVTCHN_INTERFACE_H
 
diff --git a/include/suspend_interface.h b/include/suspend_interface.h
index df1b4b0..cbe11ab 100644
--- a/include/suspend_interface.h
+++ b/include/suspend_interface.h
@@ -126,7 +126,7 @@ typedef VOID
 
     This method must always be invoked with IRQL == PASSIVE_LEVEL
 */
-typedef VOID
+typedef NTSTATUS
 (*XENBUS_SUSPEND_TRIGGER)(
     IN  PINTERFACE  Interface
     );
diff --git a/src/xenvbd.inf b/src/xenvbd.inf
index 17ad793..dc7ca24 100644
--- a/src/xenvbd.inf
+++ b/src/xenvbd.inf
@@ -53,9 +53,9 @@ xenvbd_coinst.dll=0,,
 %Company%=Inst,NT$ARCH$
 
 [Inst.NT$ARCH$]
-%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XSC000&DEV_VBD&REV_00000001
-%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XS0001&DEV_VBD&REV_00000001
-%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XS0002&DEV_VBD&REV_00000001
+%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XSC000&DEV_VBD&REV_08000008
+%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XS0001&DEV_VBD&REV_08000008
+%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XS0002&DEV_VBD&REV_08000008
 
 [XenVbd_Inst] 
 CopyFiles=XenVbd_Copyfiles
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 08 13:37:22 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 08 Jul 2015 13:37:22 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZCpXO-0003Ia-IP; Wed, 08 Jul 2015 13:37:22 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZCpXM-0003IV-Qt
	for win-pv-devel@lists.xenproject.org; Wed, 08 Jul 2015 13:37:21 +0000
Received: from [193.109.254.147] by server-15.bemta-14.messagelabs.com id
	09/D7-18947-F872D955; Wed, 08 Jul 2015 13:37:19 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1436362638!30352760!1
X-Originating-IP: [209.85.212.171]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14328 invoked from network); 8 Jul 2015 13:37:18 -0000
Received: from mail-wi0-f171.google.com (HELO mail-wi0-f171.google.com)
	(209.85.212.171)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Jul 2015 13:37:18 -0000
Received: by wiclp1 with SMTP id lp1so80783639wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 08 Jul 2015 06:37:18 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=w1cLOatW0DD6tGaymP+4ASj1QKnxudcir41Z+oo/poc=;
	b=e6LsDqkdPzbgTe8igWq92PP949S7ynMIbegBu/wSdYHEItmdTzJqy6MKu2RJ0Tym/e
	njNdVa1WrU1U+IRW38LM0tVhQSeH7dMu51STZbZqQ+PFIMfo00GlA2FQx8TohOZyGvdl
	BUnIVIuoSzwSBCUT2YBVNukgYBP4zZAYm5uOYfYEzkYU55PWJyzupLn1rTYOPPlQ6dad
	fm4fGuFKsJLPFU7vlwLuMCw4i/2s2U9ubsYrIhjk+FjsN4o1EcumUIWPMs3Fx4fOkoie
	u3adY/MBOrZB3aIJm2V9saXP/96A3GgTjLZjf8NW2v9bslmERUFuPeK+pTCYvmeGHo3+
	VynQ==
X-Received: by 10.180.76.202 with SMTP id m10mr35846991wiw.63.1436362637927;
	Wed, 08 Jul 2015 06:37:17 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	fa8sm2995642wib.14.2015.07.08.06.37.17
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 08 Jul 2015 06:37:17 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  8 Jul 2015 14:37:06 +0100
Message-Id: <1436362626-8464-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Update bindings
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Refresh the interface headers and add the XENBUS major version into
the top byte of the revision, since this is now used to avoid namespace
conflicts.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/emulated_interface.h |  5 +++--
 include/evtchn_interface.h   | 36 +++++++++++++++++++++++++++++++-----
 include/suspend_interface.h  |  2 +-
 src/xenvbd.inf               |  6 +++---
 4 files changed, 38 insertions(+), 11 deletions(-)

diff --git a/include/emulated_interface.h b/include/emulated_interface.h
index 85ed2b8..9361f8d 100644
--- a/include/emulated_interface.h
+++ b/include/emulated_interface.h
@@ -66,7 +66,8 @@ typedef VOID
 
     \param Interface The interface header
     \param DeviceID The DeviceID of the device
-    \param InstanceID The (un-prefixed) InstanceID of the device
+    \param InstanceID The (un-prefixed) InstanceID of the device or
+           NULL to match any device instance
     \return TRUE if the specified device is present in the system or
     FALSE if it is not
 */  
@@ -74,7 +75,7 @@ typedef BOOLEAN
 (*XENFILT_EMULATED_IS_DEVICE_PRESENT)(
     IN  PVOID   Context,
     IN  PCHAR   DeviceID,
-    IN  PCHAR   InstanceID
+    IN  PCHAR   InstanceID OPTIONAL
     );
 
 /*! \typedef XENFILT_EMULATED_IS_DISK_PRESENT
diff --git a/include/evtchn_interface.h b/include/evtchn_interface.h
index 1bc456a..6f8fe42 100644
--- a/include/evtchn_interface.h
+++ b/include/evtchn_interface.h
@@ -112,18 +112,27 @@ typedef PXENBUS_EVTCHN_CHANNEL
     ...
     );
 
+typedef NTSTATUS
+(*XENBUS_EVTCHN_BIND_V2)(
+    IN  PINTERFACE              Interface,
+    IN  PXENBUS_EVTCHN_CHANNEL  Channel,
+    IN  ULONG                   Cpu
+    );
+
 /*! \typedef XENBUS_EVTCHN_BIND
     \brief Bind an event channel to a specific CPU
 
     \param Interface The interface header
     \param Channel The channel handle
-    \param Cpu The CPU that should handle events
+    \param Group The group number of the CPU that should handle events
+    \param Number The relative number of the CPU that should handle events
 */
 typedef NTSTATUS
 (*XENBUS_EVTCHN_BIND)(
     IN  PINTERFACE              Interface,
     IN  PXENBUS_EVTCHN_CHANNEL  Channel,
-    IN  ULONG                   Cpu
+    IN  USHORT                  Group,
+    IN  UCHAR                   Number
     );
 
 typedef BOOLEAN
@@ -225,7 +234,7 @@ struct _XENBUS_EVTCHN_INTERFACE_V2 {
     XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
     XENBUS_EVTCHN_RELEASE   EvtchnRelease;
     XENBUS_EVTCHN_OPEN      EvtchnOpen;
-    XENBUS_EVTCHN_BIND      EvtchnBind;
+    XENBUS_EVTCHN_BIND_V2   EvtchnBindVersion2;
     XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1;
     XENBUS_EVTCHN_SEND      EvtchnSend;
     XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
@@ -242,6 +251,23 @@ struct _XENBUS_EVTCHN_INTERFACE_V3 {
     XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
     XENBUS_EVTCHN_RELEASE   EvtchnRelease;
     XENBUS_EVTCHN_OPEN      EvtchnOpen;
+    XENBUS_EVTCHN_BIND_V2   EvtchnBindVersion2;
+    XENBUS_EVTCHN_UNMASK    EvtchnUnmask;
+    XENBUS_EVTCHN_SEND      EvtchnSend;
+    XENBUS_EVTCHN_TRIGGER   EvtchnTrigger;
+    XENBUS_EVTCHN_GET_PORT  EvtchnGetPort;
+    XENBUS_EVTCHN_CLOSE     EvtchnClose;
+};
+
+/*! \struct _XENBUS_EVTCHN_INTERFACE_V4
+    \brief EVTCHN interface version 4
+    \ingroup interfaces
+*/
+struct _XENBUS_EVTCHN_INTERFACE_V4 {
+    INTERFACE               Interface;
+    XENBUS_EVTCHN_ACQUIRE   EvtchnAcquire;
+    XENBUS_EVTCHN_RELEASE   EvtchnRelease;
+    XENBUS_EVTCHN_OPEN      EvtchnOpen;
     XENBUS_EVTCHN_BIND      EvtchnBind;
     XENBUS_EVTCHN_UNMASK    EvtchnUnmask;
     XENBUS_EVTCHN_SEND      EvtchnSend;
@@ -250,7 +276,7 @@ struct _XENBUS_EVTCHN_INTERFACE_V3 {
     XENBUS_EVTCHN_CLOSE     EvtchnClose;
 };
 
-typedef struct _XENBUS_EVTCHN_INTERFACE_V3 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
+typedef struct _XENBUS_EVTCHN_INTERFACE_V4 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE;
 
 /*! \def XENBUS_EVTCHN
     \brief Macro at assist in method invocation
@@ -261,7 +287,7 @@ typedef struct _XENBUS_EVTCHN_INTERFACE_V3 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVT
 #endif  // _WINDLL
 
 #define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 1
-#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 3
+#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 4
 
 #endif  // _XENBUS_EVTCHN_INTERFACE_H
 
diff --git a/include/suspend_interface.h b/include/suspend_interface.h
index df1b4b0..cbe11ab 100644
--- a/include/suspend_interface.h
+++ b/include/suspend_interface.h
@@ -126,7 +126,7 @@ typedef VOID
 
     This method must always be invoked with IRQL == PASSIVE_LEVEL
 */
-typedef VOID
+typedef NTSTATUS
 (*XENBUS_SUSPEND_TRIGGER)(
     IN  PINTERFACE  Interface
     );
diff --git a/src/xenvbd.inf b/src/xenvbd.inf
index 17ad793..dc7ca24 100644
--- a/src/xenvbd.inf
+++ b/src/xenvbd.inf
@@ -53,9 +53,9 @@ xenvbd_coinst.dll=0,,
 %Company%=Inst,NT$ARCH$
 
 [Inst.NT$ARCH$]
-%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XSC000&DEV_VBD&REV_00000001
-%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XS0001&DEV_VBD&REV_00000001
-%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XS0002&DEV_VBD&REV_00000001
+%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XSC000&DEV_VBD&REV_08000008
+%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XS0001&DEV_VBD&REV_08000008
+%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XS0002&DEV_VBD&REV_08000008
 
 [XenVbd_Inst] 
 CopyFiles=XenVbd_Copyfiles
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Jul 10 10:58:55 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 10 Jul 2015 10:58:55 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZDW18-0003OY-KK; Fri, 10 Jul 2015 10:58:54 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZDW16-0003OG-IS
	for win-pv-devel@lists.xenproject.org; Fri, 10 Jul 2015 10:58:52 +0000
Received: from [193.109.254.147] by server-1.bemta-14.messagelabs.com id
	AF/0B-06739-B65AF955; Fri, 10 Jul 2015 10:58:51 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1436525930!19546556!1
X-Originating-IP: [209.85.212.179]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26266 invoked from network); 10 Jul 2015 10:58:51 -0000
Received: from mail-wi0-f179.google.com (HELO mail-wi0-f179.google.com)
	(209.85.212.179)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Jul 2015 10:58:51 -0000
Received: by wifm2 with SMTP id m2so43060955wif.1
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 10 Jul 2015 03:58:50 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=6TUwVbLSSWaBysEUBBX25Q1xdDSN1OddXA5dadyGYAc=;
	b=jWZ+7t7IP5iD0U7amq8vUrnF82szr5N81xKRdgTRiKnxvQNK/DuO86dGzFH2B7TFbW
	PuHWaurhDdEBwixl/VKwSBu4J2FjInI7qNSEPNslXIgjkWB+HqNpybyMZ4eVHSfPQwhZ
	4Ogx8JImKJ5MX9Fq8wu2RgWJCTburdWVAz8g/mBNdzHKUwX5CourOcsh/6YAaMpsuJSr
	T59N/xrvFoq4DfK4+yjaHFX7gOGNgvNSeR8V9HLKf/f5McpjxdhHfV4dK8t2MxF1xv0I
	wCXxdDNyFJvnSHuYxDLcmOpfoBfrYZQ80We0cVEAyO2SpRpuTT0jZ/ndHhuIuzeTLK3h
	igrA==
X-Received: by 10.180.23.8 with SMTP id i8mr5214262wif.39.1436525930669;
	Fri, 10 Jul 2015 03:58:50 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ha4sm2394689wib.0.2015.07.10.03.58.49
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 10 Jul 2015 03:58:50 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri, 10 Jul 2015 11:58:37 +0100
Message-Id: <1436525917-12920-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Lookup active network interfaces by index
	rather than LUID
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The frontend address lookup code was failing to check whether the interface
it was querying was actually active, and also using LUID is kind of overkill
when we could just use index.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/frontend.c | 74 ++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 59 insertions(+), 15 deletions(-)

diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index aea907d..257d314 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -455,10 +455,10 @@ fail1:
 }
 
 static NTSTATUS
-FrontendGetLuid(
+FrontendGetInterfaceIndex(
     IN  PXENVIF_FRONTEND    Frontend,
     IN  PMIB_IF_TABLE2      Table,
-    OUT PNET_LUID           Luid
+    OUT PNET_IFINDEX        InterfaceIndex
     )
 {
     ETHERNET_ADDRESS        PermanentPhysicalAddress;
@@ -471,16 +471,33 @@ FrontendGetLuid(
     for (Index = 0; Index < Table->NumEntries; Index++) {
         Row = &Table->Table[Index];
 
+        if (!(Row->InterfaceAndOperStatusFlags.HardwareInterface) ||
+            !(Row->InterfaceAndOperStatusFlags.ConnectorPresent))
+            continue;
+
+        if (Row->OperStatus != IfOperStatusUp)
+            continue;
+
+        if (Row->PhysicalAddressLength != sizeof (ETHERNET_ADDRESS))
+            continue;
+
         if (memcmp(Row->PermanentPhysicalAddress,
                    &PermanentPhysicalAddress,
-                   sizeof (ETHERNET_ADDRESS)) == 0)
-            goto found;
+                   sizeof (ETHERNET_ADDRESS)) != 0)
+            continue;
+
+        goto found;
     }
 
     return STATUS_UNSUCCESSFUL;
 
 found:
-    *Luid = Row->InterfaceLuid;
+    *InterfaceIndex = Row->InterfaceIndex;
+
+    Trace("[%u]: %ws (%ws)",
+          Row->InterfaceIndex,
+          Row->Alias,
+          Row->Description);
 
     return STATUS_SUCCESS;
 }
@@ -496,6 +513,8 @@ FrontendInsertAddress(
     PSOCKADDR_INET              Table;
     NTSTATUS                    status;
 
+    Trace("====>\n");
+
     for (Index = 0; Index < *AddressCount; Index++) {
         if ((*AddressTable)[Index].si_family != Address->si_family)
             continue;
@@ -531,6 +550,8 @@ FrontendInsertAddress(
     *AddressTable = Table;
 
 done:
+    Trace("<====\n");
+
     return STATUS_SUCCESS;
 
 fail1:
@@ -543,7 +564,7 @@ static NTSTATUS
 FrontendProcessAddressTable(
     IN  PXENVIF_FRONTEND            Frontend,
     IN  PMIB_UNICASTIPADDRESS_TABLE Table,
-    IN  PNET_LUID                   Luid,
+    IN  NET_IFINDEX                 InterfaceIndex,
     OUT PSOCKADDR_INET              *AddressTable,
     OUT PULONG                      AddressCount
     )
@@ -559,10 +580,7 @@ FrontendProcessAddressTable(
     for (Index = 0; Index < Table->NumEntries; Index++) {
         PMIB_UNICASTIPADDRESS_ROW   Row = &Table->Table[Index];
 
-        if (Row->InterfaceLuid.Info.IfType != Luid->Info.IfType)
-            continue;
-
-        if (Row->InterfaceLuid.Info.NetLuidIndex != Luid->Info.NetLuidIndex)
+        if (Row->InterfaceIndex != InterfaceIndex)
             continue;
 
         if (Row->Address.si_family != AF_INET &&
@@ -600,6 +618,8 @@ FrontendDumpAddressTable(
     ULONG                       IpVersion6Count;
     NTSTATUS                    status;
 
+    Trace("====>\n");
+
     status = XENBUS_STORE(TransactionStart,
                           &Frontend->StoreInterface,
                           &Transaction);
@@ -656,6 +676,13 @@ FrontendDumpAddressTable(
             if (!NT_SUCCESS(status))
                 goto fail4;
 
+            Trace("%s: %u.%u.%u.%u\n",
+                  __FrontendGetPrefix(Frontend),
+                  Address.Byte[0],
+                  Address.Byte[1],
+                  Address.Byte[2],
+                  Address.Byte[3]);
+
             IpVersion4Count++;
             break;
         }
@@ -690,6 +717,17 @@ FrontendDumpAddressTable(
             if (!NT_SUCCESS(status))
                 goto fail4;
 
+            Trace("%s: %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n",
+                  __FrontendGetPrefix(Frontend),
+                  NTOHS(Address.Word[0]),
+                  NTOHS(Address.Word[1]),
+                  NTOHS(Address.Word[2]),
+                  NTOHS(Address.Word[3]),
+                  NTOHS(Address.Word[4]),
+                  NTOHS(Address.Word[5]),
+                  NTOHS(Address.Word[6]),
+                  NTOHS(Address.Word[7]));
+
             IpVersion6Count++;
             break;
         }
@@ -703,6 +741,8 @@ FrontendDumpAddressTable(
                           Transaction,
                           TRUE);
 
+    Trace("<====\n");
+
     return status;
 
 fail4:
@@ -806,12 +846,14 @@ FrontendMib(
 
     for (;;) { 
         PMIB_IF_TABLE2              IfTable;
-        NET_LUID                    Luid;
+        NET_IFINDEX                 InterfaceIndex;
         PMIB_UNICASTIPADDRESS_TABLE UnicastIpAddressTable;
         KIRQL                       Irql;
         PSOCKADDR_INET              AddressTable;
         ULONG                       AddressCount;
 
+        Trace("waiting...\n");
+
         (VOID) KeWaitForSingleObject(Event,
                                      Executive,
                                      KernelMode,
@@ -819,6 +861,8 @@ FrontendMib(
                                      NULL);
         KeClearEvent(Event);
 
+        Trace("awake\n");
+
         if (ThreadIsAlerted(Self))
             break;
 
@@ -829,9 +873,9 @@ FrontendMib(
         if (!NT_SUCCESS(status))
             goto loop;
 
-        status = FrontendGetLuid(Frontend,
-                                 IfTable,
-                                 &Luid);
+        status = FrontendGetInterfaceIndex(Frontend,
+                                           IfTable,
+                                           &InterfaceIndex);
         if (!NT_SUCCESS(status))
             goto loop;
 
@@ -849,7 +893,7 @@ FrontendMib(
 
         status = FrontendProcessAddressTable(Frontend,
                                              UnicastIpAddressTable,
-                                             &Luid,
+                                             InterfaceIndex,
                                              &AddressTable,
                                              &AddressCount);
         if (!NT_SUCCESS(status))
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Jul 10 10:58:55 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 10 Jul 2015 10:58:55 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZDW18-0003OY-KK; Fri, 10 Jul 2015 10:58:54 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZDW16-0003OG-IS
	for win-pv-devel@lists.xenproject.org; Fri, 10 Jul 2015 10:58:52 +0000
Received: from [193.109.254.147] by server-1.bemta-14.messagelabs.com id
	AF/0B-06739-B65AF955; Fri, 10 Jul 2015 10:58:51 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1436525930!19546556!1
X-Originating-IP: [209.85.212.179]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26266 invoked from network); 10 Jul 2015 10:58:51 -0000
Received: from mail-wi0-f179.google.com (HELO mail-wi0-f179.google.com)
	(209.85.212.179)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Jul 2015 10:58:51 -0000
Received: by wifm2 with SMTP id m2so43060955wif.1
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 10 Jul 2015 03:58:50 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=6TUwVbLSSWaBysEUBBX25Q1xdDSN1OddXA5dadyGYAc=;
	b=jWZ+7t7IP5iD0U7amq8vUrnF82szr5N81xKRdgTRiKnxvQNK/DuO86dGzFH2B7TFbW
	PuHWaurhDdEBwixl/VKwSBu4J2FjInI7qNSEPNslXIgjkWB+HqNpybyMZ4eVHSfPQwhZ
	4Ogx8JImKJ5MX9Fq8wu2RgWJCTburdWVAz8g/mBNdzHKUwX5CourOcsh/6YAaMpsuJSr
	T59N/xrvFoq4DfK4+yjaHFX7gOGNgvNSeR8V9HLKf/f5McpjxdhHfV4dK8t2MxF1xv0I
	wCXxdDNyFJvnSHuYxDLcmOpfoBfrYZQ80We0cVEAyO2SpRpuTT0jZ/ndHhuIuzeTLK3h
	igrA==
X-Received: by 10.180.23.8 with SMTP id i8mr5214262wif.39.1436525930669;
	Fri, 10 Jul 2015 03:58:50 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id ha4sm2394689wib.0.2015.07.10.03.58.49
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 10 Jul 2015 03:58:50 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri, 10 Jul 2015 11:58:37 +0100
Message-Id: <1436525917-12920-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Lookup active network interfaces by index
	rather than LUID
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The frontend address lookup code was failing to check whether the interface
it was querying was actually active, and also using LUID is kind of overkill
when we could just use index.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/frontend.c | 74 ++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 59 insertions(+), 15 deletions(-)

diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index aea907d..257d314 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -455,10 +455,10 @@ fail1:
 }
 
 static NTSTATUS
-FrontendGetLuid(
+FrontendGetInterfaceIndex(
     IN  PXENVIF_FRONTEND    Frontend,
     IN  PMIB_IF_TABLE2      Table,
-    OUT PNET_LUID           Luid
+    OUT PNET_IFINDEX        InterfaceIndex
     )
 {
     ETHERNET_ADDRESS        PermanentPhysicalAddress;
@@ -471,16 +471,33 @@ FrontendGetLuid(
     for (Index = 0; Index < Table->NumEntries; Index++) {
         Row = &Table->Table[Index];
 
+        if (!(Row->InterfaceAndOperStatusFlags.HardwareInterface) ||
+            !(Row->InterfaceAndOperStatusFlags.ConnectorPresent))
+            continue;
+
+        if (Row->OperStatus != IfOperStatusUp)
+            continue;
+
+        if (Row->PhysicalAddressLength != sizeof (ETHERNET_ADDRESS))
+            continue;
+
         if (memcmp(Row->PermanentPhysicalAddress,
                    &PermanentPhysicalAddress,
-                   sizeof (ETHERNET_ADDRESS)) == 0)
-            goto found;
+                   sizeof (ETHERNET_ADDRESS)) != 0)
+            continue;
+
+        goto found;
     }
 
     return STATUS_UNSUCCESSFUL;
 
 found:
-    *Luid = Row->InterfaceLuid;
+    *InterfaceIndex = Row->InterfaceIndex;
+
+    Trace("[%u]: %ws (%ws)",
+          Row->InterfaceIndex,
+          Row->Alias,
+          Row->Description);
 
     return STATUS_SUCCESS;
 }
@@ -496,6 +513,8 @@ FrontendInsertAddress(
     PSOCKADDR_INET              Table;
     NTSTATUS                    status;
 
+    Trace("====>\n");
+
     for (Index = 0; Index < *AddressCount; Index++) {
         if ((*AddressTable)[Index].si_family != Address->si_family)
             continue;
@@ -531,6 +550,8 @@ FrontendInsertAddress(
     *AddressTable = Table;
 
 done:
+    Trace("<====\n");
+
     return STATUS_SUCCESS;
 
 fail1:
@@ -543,7 +564,7 @@ static NTSTATUS
 FrontendProcessAddressTable(
     IN  PXENVIF_FRONTEND            Frontend,
     IN  PMIB_UNICASTIPADDRESS_TABLE Table,
-    IN  PNET_LUID                   Luid,
+    IN  NET_IFINDEX                 InterfaceIndex,
     OUT PSOCKADDR_INET              *AddressTable,
     OUT PULONG                      AddressCount
     )
@@ -559,10 +580,7 @@ FrontendProcessAddressTable(
     for (Index = 0; Index < Table->NumEntries; Index++) {
         PMIB_UNICASTIPADDRESS_ROW   Row = &Table->Table[Index];
 
-        if (Row->InterfaceLuid.Info.IfType != Luid->Info.IfType)
-            continue;
-
-        if (Row->InterfaceLuid.Info.NetLuidIndex != Luid->Info.NetLuidIndex)
+        if (Row->InterfaceIndex != InterfaceIndex)
             continue;
 
         if (Row->Address.si_family != AF_INET &&
@@ -600,6 +618,8 @@ FrontendDumpAddressTable(
     ULONG                       IpVersion6Count;
     NTSTATUS                    status;
 
+    Trace("====>\n");
+
     status = XENBUS_STORE(TransactionStart,
                           &Frontend->StoreInterface,
                           &Transaction);
@@ -656,6 +676,13 @@ FrontendDumpAddressTable(
             if (!NT_SUCCESS(status))
                 goto fail4;
 
+            Trace("%s: %u.%u.%u.%u\n",
+                  __FrontendGetPrefix(Frontend),
+                  Address.Byte[0],
+                  Address.Byte[1],
+                  Address.Byte[2],
+                  Address.Byte[3]);
+
             IpVersion4Count++;
             break;
         }
@@ -690,6 +717,17 @@ FrontendDumpAddressTable(
             if (!NT_SUCCESS(status))
                 goto fail4;
 
+            Trace("%s: %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n",
+                  __FrontendGetPrefix(Frontend),
+                  NTOHS(Address.Word[0]),
+                  NTOHS(Address.Word[1]),
+                  NTOHS(Address.Word[2]),
+                  NTOHS(Address.Word[3]),
+                  NTOHS(Address.Word[4]),
+                  NTOHS(Address.Word[5]),
+                  NTOHS(Address.Word[6]),
+                  NTOHS(Address.Word[7]));
+
             IpVersion6Count++;
             break;
         }
@@ -703,6 +741,8 @@ FrontendDumpAddressTable(
                           Transaction,
                           TRUE);
 
+    Trace("<====\n");
+
     return status;
 
 fail4:
@@ -806,12 +846,14 @@ FrontendMib(
 
     for (;;) { 
         PMIB_IF_TABLE2              IfTable;
-        NET_LUID                    Luid;
+        NET_IFINDEX                 InterfaceIndex;
         PMIB_UNICASTIPADDRESS_TABLE UnicastIpAddressTable;
         KIRQL                       Irql;
         PSOCKADDR_INET              AddressTable;
         ULONG                       AddressCount;
 
+        Trace("waiting...\n");
+
         (VOID) KeWaitForSingleObject(Event,
                                      Executive,
                                      KernelMode,
@@ -819,6 +861,8 @@ FrontendMib(
                                      NULL);
         KeClearEvent(Event);
 
+        Trace("awake\n");
+
         if (ThreadIsAlerted(Self))
             break;
 
@@ -829,9 +873,9 @@ FrontendMib(
         if (!NT_SUCCESS(status))
             goto loop;
 
-        status = FrontendGetLuid(Frontend,
-                                 IfTable,
-                                 &Luid);
+        status = FrontendGetInterfaceIndex(Frontend,
+                                           IfTable,
+                                           &InterfaceIndex);
         if (!NT_SUCCESS(status))
             goto loop;
 
@@ -849,7 +893,7 @@ FrontendMib(
 
         status = FrontendProcessAddressTable(Frontend,
                                              UnicastIpAddressTable,
-                                             &Luid,
+                                             InterfaceIndex,
                                              &AddressTable,
                                              &AddressCount);
         if (!NT_SUCCESS(status))
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Jul 10 16:43:57 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 10 Jul 2015 16:43:57 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZDbP2-0000LG-R1; Fri, 10 Jul 2015 16:43:56 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZDbP2-0000LB-42
	for win-pv-devel@lists.xenproject.org; Fri, 10 Jul 2015 16:43:56 +0000
Received: from [193.109.254.147] by server-15.bemta-14.messagelabs.com id
	59/B5-18947-B46FF955; Fri, 10 Jul 2015 16:43:55 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1436546634!31016129!1
X-Originating-IP: [209.85.212.177]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20331 invoked from network); 10 Jul 2015 16:43:54 -0000
Received: from mail-wi0-f177.google.com (HELO mail-wi0-f177.google.com)
	(209.85.212.177)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Jul 2015 16:43:54 -0000
Received: by wicmv11 with SMTP id mv11so18427024wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 10 Jul 2015 09:43:54 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=XZXGltKMnq5ZJw7ukCgSha5NGmPe2+M3VdT4wVDSheI=;
	b=Fo+5wDG6BMBieBxbbZQ8ufTZZl1mnl0DUAOisYv4mcETNZ923DdeQgVkaevwy4pLbW
	4YA31dVuICfteQdd4lRNIXFJ/LTl16+/yZnxLpewjH/cISUkD897Mp/+/jATR8+bFHfs
	hDfpJpbhY2zTK0QtMJ/kf0bgLBIcvjDkRHF5o4w680k352LpDnA1YdC9MBeKKSYbo5Ws
	pi8ryfB3LgAxk9dXoQMc9UgwfXrMxiaRpvHSY5OBMECe5pnsockA+z6kER57G1HXEDWo
	quQPCBwyWdddaF6/GHGDn7pFHsrR8Um0asehIaauei/pmuLq49YzN2dxdlfdXXKwEN6w
	jcLA==
X-Received: by 10.194.112.3 with SMTP id im3mr43261297wjb.54.1436546634531;
	Fri, 10 Jul 2015 09:43:54 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id dt1sm3697801wib.7.2015.07.10.09.43.53
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 10 Jul 2015 09:43:53 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri, 10 Jul 2015 17:43:36 +0100
Message-Id: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>, Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 1/5] Fix target enumeration
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

From: Owen Smith <owen.smith@citrix.com>

Issues were found when enumeration races with plug/unplug. This patch
should fix these problems.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/fdo.c | 36 +++++++++++++++++-------------------
 src/xenvbd/pdo.c | 12 ++++++++++--
 2 files changed, 27 insertions(+), 21 deletions(-)

diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index f240a97..b146f7c 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -619,31 +619,29 @@ __FdoEnumerate(
     *NeedReboot = FALSE;
 
     for (TargetId = 0; TargetId < XENVBD_MAX_TARGETS; ++TargetId) {
+        BOOLEAN     Missing = TRUE;
+
         Pdo = __FdoGetPdo(Fdo, TargetId);
         if (Pdo == NULL)
             continue;
 
-        if (!PdoIsMissing(Pdo)) {
-            BOOLEAN Missing = TRUE;
-            for (Device = Devices; *Device; Device = __NextSz(Device)) {
-                ULONG DeviceTargetId = __ParseVbd(Device);
-                if (TargetId == DeviceTargetId) {
-                    Missing = FALSE;
-                    break;
-                }
-            }
-            if (Missing) {
-                PdoSetMissing(Pdo, "Device Dissappeared");
-                if (PdoGetDevicePnpState(Pdo) == Present)
-                    PdoSetDevicePnpState(Pdo, Deleted);
-                else
-                    *NeedInvalidate = TRUE;
+        for (Device = Devices; *Device; Device = __NextSz(Device)) {
+            ULONG DeviceTargetId = __ParseVbd(Device);
+            if (TargetId == DeviceTargetId) {
+                Missing = FALSE;
+                break;
             }
         }
-        
-        if (PdoIsMissing(Pdo) && 
-            PdoGetDevicePnpState(Pdo) == Deleted) {
-            // drop reference count before destroying
+
+        if (Missing && !PdoIsMissing(Pdo)) {
+            PdoSetMissing(Pdo, "Device Disappeared");
+            if (PdoGetDevicePnpState(Pdo) == Present)
+                PdoSetDevicePnpState(Pdo, Deleted);
+            else
+                *NeedInvalidate = TRUE;
+        }
+
+        if (PdoGetDevicePnpState(Pdo) == Deleted) {
             PdoDereference(Pdo);
             PdoDestroy(Pdo);
         } else {
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index c5ec9b6..89bfc5a 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -415,8 +415,16 @@ PdoSetDevicePnpState(
     __in DEVICE_PNP_STATE        State
     )
 {
-    ASSERT(Pdo->DevicePnpState != Deleted || State == Deleted);
-    Verbose("Target[%d] : PNP %s to %s\n", PdoGetTargetId(Pdo), __PnpStateName(Pdo->DevicePnpState), __PnpStateName(State));
+    Verbose("Target[%d] : PNP %s to %s\n",
+            PdoGetTargetId(Pdo),
+            __PnpStateName(Pdo->DevicePnpState),
+            __PnpStateName(State));
+
+    if (Pdo->DevicePnpState == Deleted) {
+        ASSERT(State == Deleted);
+        return;
+    }
+
     Pdo->PrevPnpState = Pdo->DevicePnpState;
     Pdo->DevicePnpState = State;
 }
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Jul 10 16:43:57 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 10 Jul 2015 16:43:57 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZDbP2-0000LG-R1; Fri, 10 Jul 2015 16:43:56 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZDbP2-0000LB-42
	for win-pv-devel@lists.xenproject.org; Fri, 10 Jul 2015 16:43:56 +0000
Received: from [193.109.254.147] by server-15.bemta-14.messagelabs.com id
	59/B5-18947-B46FF955; Fri, 10 Jul 2015 16:43:55 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1436546634!31016129!1
X-Originating-IP: [209.85.212.177]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20331 invoked from network); 10 Jul 2015 16:43:54 -0000
Received: from mail-wi0-f177.google.com (HELO mail-wi0-f177.google.com)
	(209.85.212.177)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Jul 2015 16:43:54 -0000
Received: by wicmv11 with SMTP id mv11so18427024wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 10 Jul 2015 09:43:54 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=XZXGltKMnq5ZJw7ukCgSha5NGmPe2+M3VdT4wVDSheI=;
	b=Fo+5wDG6BMBieBxbbZQ8ufTZZl1mnl0DUAOisYv4mcETNZ923DdeQgVkaevwy4pLbW
	4YA31dVuICfteQdd4lRNIXFJ/LTl16+/yZnxLpewjH/cISUkD897Mp/+/jATR8+bFHfs
	hDfpJpbhY2zTK0QtMJ/kf0bgLBIcvjDkRHF5o4w680k352LpDnA1YdC9MBeKKSYbo5Ws
	pi8ryfB3LgAxk9dXoQMc9UgwfXrMxiaRpvHSY5OBMECe5pnsockA+z6kER57G1HXEDWo
	quQPCBwyWdddaF6/GHGDn7pFHsrR8Um0asehIaauei/pmuLq49YzN2dxdlfdXXKwEN6w
	jcLA==
X-Received: by 10.194.112.3 with SMTP id im3mr43261297wjb.54.1436546634531;
	Fri, 10 Jul 2015 09:43:54 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id dt1sm3697801wib.7.2015.07.10.09.43.53
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 10 Jul 2015 09:43:53 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri, 10 Jul 2015 17:43:36 +0100
Message-Id: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>, Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 1/5] Fix target enumeration
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

From: Owen Smith <owen.smith@citrix.com>

Issues were found when enumeration races with plug/unplug. This patch
should fix these problems.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/fdo.c | 36 +++++++++++++++++-------------------
 src/xenvbd/pdo.c | 12 ++++++++++--
 2 files changed, 27 insertions(+), 21 deletions(-)

diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index f240a97..b146f7c 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -619,31 +619,29 @@ __FdoEnumerate(
     *NeedReboot = FALSE;
 
     for (TargetId = 0; TargetId < XENVBD_MAX_TARGETS; ++TargetId) {
+        BOOLEAN     Missing = TRUE;
+
         Pdo = __FdoGetPdo(Fdo, TargetId);
         if (Pdo == NULL)
             continue;
 
-        if (!PdoIsMissing(Pdo)) {
-            BOOLEAN Missing = TRUE;
-            for (Device = Devices; *Device; Device = __NextSz(Device)) {
-                ULONG DeviceTargetId = __ParseVbd(Device);
-                if (TargetId == DeviceTargetId) {
-                    Missing = FALSE;
-                    break;
-                }
-            }
-            if (Missing) {
-                PdoSetMissing(Pdo, "Device Dissappeared");
-                if (PdoGetDevicePnpState(Pdo) == Present)
-                    PdoSetDevicePnpState(Pdo, Deleted);
-                else
-                    *NeedInvalidate = TRUE;
+        for (Device = Devices; *Device; Device = __NextSz(Device)) {
+            ULONG DeviceTargetId = __ParseVbd(Device);
+            if (TargetId == DeviceTargetId) {
+                Missing = FALSE;
+                break;
             }
         }
-        
-        if (PdoIsMissing(Pdo) && 
-            PdoGetDevicePnpState(Pdo) == Deleted) {
-            // drop reference count before destroying
+
+        if (Missing && !PdoIsMissing(Pdo)) {
+            PdoSetMissing(Pdo, "Device Disappeared");
+            if (PdoGetDevicePnpState(Pdo) == Present)
+                PdoSetDevicePnpState(Pdo, Deleted);
+            else
+                *NeedInvalidate = TRUE;
+        }
+
+        if (PdoGetDevicePnpState(Pdo) == Deleted) {
             PdoDereference(Pdo);
             PdoDestroy(Pdo);
         } else {
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index c5ec9b6..89bfc5a 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -415,8 +415,16 @@ PdoSetDevicePnpState(
     __in DEVICE_PNP_STATE        State
     )
 {
-    ASSERT(Pdo->DevicePnpState != Deleted || State == Deleted);
-    Verbose("Target[%d] : PNP %s to %s\n", PdoGetTargetId(Pdo), __PnpStateName(Pdo->DevicePnpState), __PnpStateName(State));
+    Verbose("Target[%d] : PNP %s to %s\n",
+            PdoGetTargetId(Pdo),
+            __PnpStateName(Pdo->DevicePnpState),
+            __PnpStateName(State));
+
+    if (Pdo->DevicePnpState == Deleted) {
+        ASSERT(State == Deleted);
+        return;
+    }
+
     Pdo->PrevPnpState = Pdo->DevicePnpState;
     Pdo->DevicePnpState = State;
 }
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Jul 10 16:43:58 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 10 Jul 2015 16:43:58 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZDbP4-0000Lk-S7; Fri, 10 Jul 2015 16:43:58 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZDbP4-0000LV-1Z
	for win-pv-devel@lists.xenproject.org; Fri, 10 Jul 2015 16:43:58 +0000
Received: from [193.109.254.147] by server-5.bemta-14.messagelabs.com id
	4B/98-29123-D46FF955; Fri, 10 Jul 2015 16:43:57 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1436546636!29947647!1
X-Originating-IP: [209.85.212.169]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7072 invoked from network); 10 Jul 2015 16:43:56 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Jul 2015 16:43:56 -0000
Received: by wiga1 with SMTP id a1so20193357wig.0
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 10 Jul 2015 09:43:56 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=vsOXzGZXgFgqBf+F1FRfbN0lR1rNGM/ZsPLDjHA4Bdc=;
	b=FQGUoeDbI+QxwAy8UuL/YqNDpJ4g5WEGn4N45XCbFfzTYISdveaLSrb9fCPdvbSRYi
	aNJKZEd35Q8Rj6ZNyk+WB3IW5Bn3IwCnlc991pvG2jRM87mCgsFu2QdqiCg6QBadz4tg
	Fxv0GyX6ayttpHqSVRGkISISSzS5lBpBb5pL7+RdnSUuVGIyTKpOvRyXqun5Vt9WnFB6
	rahVdozIXQxiPzzprKFL8/yeLn691nZRVK8BSW19Wk7K93O486vr6CJ/ses1qsTIvCi7
	uy8Jn1tJzx7Hq3Xklvupk6GVuaNp1GzWkLBYQJyC9L/K/3lqASc6IhDscycQI4C5f1aK
	qmbA==
X-Received: by 10.194.59.98 with SMTP id y2mr43439887wjq.42.1436546636218;
	Fri, 10 Jul 2015 09:43:56 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id dt1sm3697801wib.7.2015.07.10.09.43.55
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 10 Jul 2015 09:43:55 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri, 10 Jul 2015 17:43:38 +0100
Message-Id: <1436546620-4384-3-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
References: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 3/5] Use inline functions to acquire/release
	FDO mutex...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...rather then open-coded acquires and releases.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xendisk/fdo.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/xendisk/fdo.c b/src/xendisk/fdo.c
index dc91536..27db284 100644
--- a/src/xendisk/fdo.c
+++ b/src/xendisk/fdo.c
@@ -257,7 +257,7 @@ __FdoEnumerate(
                   Relations->Objects,
                   sizeof (PDEVICE_OBJECT) * Count);
 
-    AcquireMutex(&Fdo->Mutex);
+    __FdoAcquireMutex(Fdo);
 
     // Remove any PDOs that do not appear in the device list
     ListEntry = Fdo->Dx->ListEntry.Flink;
@@ -300,7 +300,7 @@ __FdoEnumerate(
         }
     }
 
-    ReleaseMutex(&Fdo->Mutex);
+    __FdoReleaseMutex(Fdo);
 
     __FdoFree(PhysicalDeviceObject);
     return;
@@ -787,10 +787,10 @@ done:
     status = FdoForwardIrpSynchronously(Fdo, Irp);
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
-    AcquireMutex(&Fdo->Mutex);
+    __FdoAcquireMutex(Fdo);
     ASSERT3U(Fdo->References, !=, 0);
     --Fdo->References;
-    ReleaseMutex(&Fdo->Mutex);
+    __FdoReleaseMutex(Fdo);
 
     if (Fdo->References == 0)
         FdoDestroy(Fdo);
@@ -877,7 +877,7 @@ FdoQueryDeviceRelations(
 
     ExFreePool(Relations);
 
-    AcquireMutex(&Fdo->Mutex);
+    __FdoAcquireMutex(Fdo);
 
     Count = 0;
     for (ListEntry = Fdo->Dx->ListEntry.Flink;
@@ -925,7 +925,7 @@ FdoQueryDeviceRelations(
 
     Trace("%d PDO(s)\n", Relations->Count);
 
-    ReleaseMutex(&Fdo->Mutex);
+    __FdoReleaseMutex(Fdo);
 
     Irp->IoStatus.Information = (ULONG_PTR)Relations;
     status = STATUS_SUCCESS;
@@ -939,7 +939,7 @@ done:
     return status;
 
 fail3:
-    ReleaseMutex(&Fdo->Mutex);
+    __FdoReleaseMutex(Fdo);
 
 fail2:
     IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Jul 10 16:43:58 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 10 Jul 2015 16:43:58 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZDbP4-0000Lk-S7; Fri, 10 Jul 2015 16:43:58 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZDbP4-0000LV-1Z
	for win-pv-devel@lists.xenproject.org; Fri, 10 Jul 2015 16:43:58 +0000
Received: from [193.109.254.147] by server-5.bemta-14.messagelabs.com id
	4B/98-29123-D46FF955; Fri, 10 Jul 2015 16:43:57 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1436546636!29947647!1
X-Originating-IP: [209.85.212.169]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7072 invoked from network); 10 Jul 2015 16:43:56 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Jul 2015 16:43:56 -0000
Received: by wiga1 with SMTP id a1so20193357wig.0
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 10 Jul 2015 09:43:56 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=vsOXzGZXgFgqBf+F1FRfbN0lR1rNGM/ZsPLDjHA4Bdc=;
	b=FQGUoeDbI+QxwAy8UuL/YqNDpJ4g5WEGn4N45XCbFfzTYISdveaLSrb9fCPdvbSRYi
	aNJKZEd35Q8Rj6ZNyk+WB3IW5Bn3IwCnlc991pvG2jRM87mCgsFu2QdqiCg6QBadz4tg
	Fxv0GyX6ayttpHqSVRGkISISSzS5lBpBb5pL7+RdnSUuVGIyTKpOvRyXqun5Vt9WnFB6
	rahVdozIXQxiPzzprKFL8/yeLn691nZRVK8BSW19Wk7K93O486vr6CJ/ses1qsTIvCi7
	uy8Jn1tJzx7Hq3Xklvupk6GVuaNp1GzWkLBYQJyC9L/K/3lqASc6IhDscycQI4C5f1aK
	qmbA==
X-Received: by 10.194.59.98 with SMTP id y2mr43439887wjq.42.1436546636218;
	Fri, 10 Jul 2015 09:43:56 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id dt1sm3697801wib.7.2015.07.10.09.43.55
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 10 Jul 2015 09:43:55 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri, 10 Jul 2015 17:43:38 +0100
Message-Id: <1436546620-4384-3-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
References: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 3/5] Use inline functions to acquire/release
	FDO mutex...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...rather then open-coded acquires and releases.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xendisk/fdo.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/xendisk/fdo.c b/src/xendisk/fdo.c
index dc91536..27db284 100644
--- a/src/xendisk/fdo.c
+++ b/src/xendisk/fdo.c
@@ -257,7 +257,7 @@ __FdoEnumerate(
                   Relations->Objects,
                   sizeof (PDEVICE_OBJECT) * Count);
 
-    AcquireMutex(&Fdo->Mutex);
+    __FdoAcquireMutex(Fdo);
 
     // Remove any PDOs that do not appear in the device list
     ListEntry = Fdo->Dx->ListEntry.Flink;
@@ -300,7 +300,7 @@ __FdoEnumerate(
         }
     }
 
-    ReleaseMutex(&Fdo->Mutex);
+    __FdoReleaseMutex(Fdo);
 
     __FdoFree(PhysicalDeviceObject);
     return;
@@ -787,10 +787,10 @@ done:
     status = FdoForwardIrpSynchronously(Fdo, Irp);
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
-    AcquireMutex(&Fdo->Mutex);
+    __FdoAcquireMutex(Fdo);
     ASSERT3U(Fdo->References, !=, 0);
     --Fdo->References;
-    ReleaseMutex(&Fdo->Mutex);
+    __FdoReleaseMutex(Fdo);
 
     if (Fdo->References == 0)
         FdoDestroy(Fdo);
@@ -877,7 +877,7 @@ FdoQueryDeviceRelations(
 
     ExFreePool(Relations);
 
-    AcquireMutex(&Fdo->Mutex);
+    __FdoAcquireMutex(Fdo);
 
     Count = 0;
     for (ListEntry = Fdo->Dx->ListEntry.Flink;
@@ -925,7 +925,7 @@ FdoQueryDeviceRelations(
 
     Trace("%d PDO(s)\n", Relations->Count);
 
-    ReleaseMutex(&Fdo->Mutex);
+    __FdoReleaseMutex(Fdo);
 
     Irp->IoStatus.Information = (ULONG_PTR)Relations;
     status = STATUS_SUCCESS;
@@ -939,7 +939,7 @@ done:
     return status;
 
 fail3:
-    ReleaseMutex(&Fdo->Mutex);
+    __FdoReleaseMutex(Fdo);
 
 fail2:
     IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Jul 10 16:43:59 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 10 Jul 2015 16:43:59 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZDbP5-0000MK-TG; Fri, 10 Jul 2015 16:43:59 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZDbP4-0000Lg-Ri
	for win-pv-devel@lists.xenproject.org; Fri, 10 Jul 2015 16:43:59 +0000
Received: from [193.109.254.147] by server-9.bemta-14.messagelabs.com id
	34/11-03371-E46FF955; Fri, 10 Jul 2015 16:43:58 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1436546637!31046609!1
X-Originating-IP: [74.125.82.45]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1978 invoked from network); 10 Jul 2015 16:43:57 -0000
Received: from mail-wg0-f45.google.com (HELO mail-wg0-f45.google.com)
	(74.125.82.45)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Jul 2015 16:43:57 -0000
Received: by wgjx7 with SMTP id x7so253706099wgj.2
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 10 Jul 2015 09:43:57 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=zYUGQKaNiA1teQGxI7El/Sy6usFXie3tLgOCRqC7csM=;
	b=yzB5pVSlai26MYgK6bLIwbveH+opuWzWfGmrvyhH80xCqxjYnZdsFttBAs2/Do7wBM
	sYg1D8EXMsFBfqRtbyFBpYIXWXM/ymx/JPyO3GVJTi7bCRqWRcCYm44YIXRRqMW/bSLD
	/IXNTdvjgHnh0uUuTQ5dN7a6RBClHVZvDJaASGyoUmveUtLNvc6o1vMmf479Sd8QMoUj
	pZ+sDS49leK6eGfPNNk86pZqxZB+fpGfALto/Gxoy8XEd3o/5GYYBeY+SsruB1kodLY2
	e60DMe9e2h8fmfQkx16NPGo2W78T/Zr9drhuuTsNfnD9sNxakNvW2/l3/22eJdTdReAQ
	tR7Q==
X-Received: by 10.195.11.3 with SMTP id ee3mr43123185wjd.89.1436546637008;
	Fri, 10 Jul 2015 09:43:57 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id dt1sm3697801wib.7.2015.07.10.09.43.56
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 10 Jul 2015 09:43:56 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri, 10 Jul 2015 17:43:39 +0100
Message-Id: <1436546620-4384-4-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
References: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 4/5] Remove PDO set/is-missing logic from
	XENDISK
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It's all completely unnecessary for a filter driver

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xendisk/fdo.c | 55 +++------------------------------------------
 src/xendisk/pdo.c | 67 ++++++++-----------------------------------------------
 src/xendisk/pdo.h | 16 -------------
 3 files changed, 12 insertions(+), 126 deletions(-)

diff --git a/src/xendisk/fdo.c b/src/xendisk/fdo.c
index 27db284..09f785f 100644
--- a/src/xendisk/fdo.c
+++ b/src/xendisk/fdo.c
@@ -265,28 +265,15 @@ __FdoEnumerate(
         PLIST_ENTRY     Next = ListEntry->Flink;
         PXENDISK_DX     Dx = CONTAINING_RECORD(ListEntry, XENDISK_DX, ListEntry);
         PXENDISK_PDO    Pdo = Dx->Pdo;
-        BOOLEAN         Missing;
 
-        Missing = TRUE;
         for (Index = 0; Index < Count; Index++) {
             if (PdoGetPhysicalDeviceObject(Pdo) == PhysicalDeviceObject[Index]) {
-                Missing = FALSE;
 #pragma prefast(suppress:6387)  // PhysicalDeviceObject[Index] could be NULL
-                ObDereferenceObject(PhysicalDeviceObject[Index]);
                 PhysicalDeviceObject[Index] = NULL; // avoid duplication
                 break;
             }
         }
 
-        if (Missing && !PdoIsMissing(Pdo)) {
-            if (PdoGetDevicePnpState(Pdo) == Present) {
-                PdoSetDevicePnpState(Pdo, Deleted);
-                PdoDestroy(Pdo);
-            } else {
-                PdoSetMissing(Pdo, "device disappeared");
-            }
-        }
-
         ListEntry = Next;
     }
 
@@ -296,7 +283,6 @@ __FdoEnumerate(
         if (PhysicalDeviceObject[Index] != NULL) {
             (VOID) PdoCreate(Fdo,
                              PhysicalDeviceObject[Index]);
-            ObDereferenceObject(PhysicalDeviceObject[Index]);
         }
     }
 
@@ -831,7 +817,6 @@ FdoQueryDeviceRelations(
 {
     KEVENT              Event;
     PIO_STACK_LOCATION  StackLocation;
-    ULONG               Size;
     PDEVICE_RELATIONS   Relations;
     PLIST_ENTRY         ListEntry;
     ULONG               Count;
@@ -875,59 +860,28 @@ FdoQueryDeviceRelations(
     if (Relations->Count != 0)
         __FdoEnumerate(Fdo, Relations);
 
-    ExFreePool(Relations);
-
     __FdoAcquireMutex(Fdo);
 
     Count = 0;
     for (ListEntry = Fdo->Dx->ListEntry.Flink;
          ListEntry != &Fdo->Dx->ListEntry;
-         ListEntry = ListEntry->Flink)
-    {
-        PXENDISK_DX     Dx = CONTAINING_RECORD(ListEntry, XENDISK_DX, ListEntry);
-        PXENDISK_PDO    Pdo = Dx->Pdo;
-
-        if (PdoIsMissing(Pdo))
-            continue;
-
-        Count++;
-    }
-
-    Size = sizeof(DEVICE_RELATIONS) + (sizeof (PDEVICE_OBJECT) * Count);
-
-    Relations = ExAllocatePoolWithTag(PagedPool, Size, 'TLIF');
-
-    status = STATUS_NO_MEMORY;
-    if (Relations == NULL)
-        goto fail3;
-
-    RtlZeroMemory(Relations, Size);
-
-    for (ListEntry = Fdo->Dx->ListEntry.Flink;
-         ListEntry != &Fdo->Dx->ListEntry;
          ListEntry = ListEntry->Flink) {
         PXENDISK_DX     Dx = CONTAINING_RECORD(ListEntry, XENDISK_DX, ListEntry);
         PXENDISK_PDO    Pdo = Dx->Pdo;
 
         ASSERT3U(Dx->Type, ==, PHYSICAL_DEVICE_OBJECT);
 
-        if (PdoIsMissing(Pdo))
-            continue;
-
         if (PdoGetDevicePnpState(Pdo) == Present)
             PdoSetDevicePnpState(Pdo, Enumerated);
 
-        ObReferenceObject(PdoGetPhysicalDeviceObject(Pdo));
-        Relations->Objects[Relations->Count++] = PdoGetPhysicalDeviceObject(Pdo);
+        Count++;
     }
-
     ASSERT3U(Relations->Count, ==, Count);
 
-    Trace("%d PDO(s)\n", Relations->Count);
-
     __FdoReleaseMutex(Fdo);
 
-    Irp->IoStatus.Information = (ULONG_PTR)Relations;
+    Trace("%d PDO(s)\n", Relations->Count);
+
     status = STATUS_SUCCESS;
 
 done:
@@ -938,9 +892,6 @@ done:
 
     return status;
 
-fail3:
-    __FdoReleaseMutex(Fdo);
-
 fail2:
     IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
 
diff --git a/src/xendisk/pdo.c b/src/xendisk/pdo.c
index cdf4af6..dffb294 100644
--- a/src/xendisk/pdo.c
+++ b/src/xendisk/pdo.c
@@ -61,8 +61,6 @@ struct _XENDISK_PDO {
     PIRP                        DevicePowerIrp;
 
     PXENDISK_FDO                Fdo;
-    BOOLEAN                     Missing;
-    const CHAR                  *Reason;
 
     ULONG                       SectorSize;
 };
@@ -188,41 +186,6 @@ PdoGetPhysicalDeviceObject(
 }
 
 static FORCEINLINE VOID
-__PdoSetMissing(
-    IN  PXENDISK_PDO    Pdo,
-    IN  const CHAR      *Reason
-    )
-{
-    Pdo->Reason = Reason;
-    Pdo->Missing = TRUE;
-}
-
-VOID
-PdoSetMissing(
-    IN  PXENDISK_PDO    Pdo,
-    IN  const CHAR      *Reason
-    )
-{
-    __PdoSetMissing(Pdo, Reason);
-}
-
-static FORCEINLINE BOOLEAN
-__PdoIsMissing(
-    IN  PXENDISK_PDO    Pdo
-    )
-{
-    return Pdo->Missing;
-}
-
-BOOLEAN
-PdoIsMissing(
-    IN  PXENDISK_PDO    Pdo
-    )
-{
-    return __PdoIsMissing(Pdo);
-}
-
-static FORCEINLINE VOID
 __PdoLink(
     IN  PXENDISK_PDO    Pdo,
     IN  PXENDISK_FDO    Fdo
@@ -1122,23 +1085,18 @@ PdoRemoveDevice(
                     PowerState);
 
 done:
-    if (__PdoIsMissing(Pdo)) {
-        __PdoSetDevicePnpState(Pdo, Deleted);
-        IoReleaseRemoveLockAndWait(&Pdo->Dx->RemoveLock, Irp);
-    } else {
-        __PdoSetDevicePnpState(Pdo, Enumerated);
-        IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
-    }
+    FdoAcquireMutex(Fdo);
+    __PdoSetDevicePnpState(Pdo, Deleted);
+    FdoReleaseMutex(Fdo);
+
+    IoReleaseRemoveLockAndWait(&Pdo->Dx->RemoveLock, Irp);
 
     status = PdoForwardIrpSynchronously(Pdo, Irp);
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
-    if (__PdoIsMissing(Pdo)) {
-        FdoAcquireMutex(Fdo);
-        PdoDestroy(Pdo);
-        FdoReleaseMutex(Fdo);
-    } else if (__PdoGetDevicePnpState(Pdo) == Enumerated)
-        __PdoSetMissing(Pdo, "Device removed");
+    FdoAcquireMutex(Fdo);
+    PdoDestroy(Pdo);
+    FdoReleaseMutex(Fdo);
 
     return status;
 
@@ -1158,7 +1116,6 @@ PdoEject(
     PXENDISK_FDO        Fdo = __PdoGetFdo(Pdo);
     NTSTATUS            status;
 
-    __PdoSetMissing(Pdo, "Ejected");
     __PdoSetDevicePnpState(Pdo, Deleted);
 
     status = PdoForwardIrpSynchronously(Pdo, Irp);
@@ -2074,15 +2031,9 @@ PdoDestroy(
 
     ASSERT3U(__PdoGetDevicePnpState(Pdo), ==, Deleted);
 
-    ASSERT(__PdoIsMissing(Pdo));
-    Pdo->Missing = FALSE;
-
     __PdoUnlink(Pdo);
 
-    Verbose("%p (%s)\n",
-         FilterDeviceObject,
-         Pdo->Reason);
-    Pdo->Reason = NULL;
+    Verbose("%p\n", FilterDeviceObject);
 
     Dx->Pdo = NULL;
 
diff --git a/src/xendisk/pdo.h b/src/xendisk/pdo.h
index 7866b83..566d60f 100644
--- a/src/xendisk/pdo.h
+++ b/src/xendisk/pdo.h
@@ -54,22 +54,6 @@ PdoGetPhysicalDeviceObject(
     IN  PXENDISK_PDO    Pdo
     );
 
-extern BOOLEAN
-PdoIsMissing(
-    IN  PXENDISK_PDO    Pdo
-    );
-
-extern VOID
-PdoSetMissing(
-    IN  PXENDISK_PDO    Pdo,
-    IN  const CHAR      *Reason
-    );
-
-extern BOOLEAN
-PdoIsMasked(
-    IN  PXENDISK_PDO    Pdo
-    );
-
 extern NTSTATUS
 PdoCreate(
     IN  PXENDISK_FDO    Fdo,
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Jul 10 16:43:59 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 10 Jul 2015 16:43:59 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZDbP5-0000MK-TG; Fri, 10 Jul 2015 16:43:59 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZDbP4-0000Lg-Ri
	for win-pv-devel@lists.xenproject.org; Fri, 10 Jul 2015 16:43:59 +0000
Received: from [193.109.254.147] by server-9.bemta-14.messagelabs.com id
	34/11-03371-E46FF955; Fri, 10 Jul 2015 16:43:58 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1436546637!31046609!1
X-Originating-IP: [74.125.82.45]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1978 invoked from network); 10 Jul 2015 16:43:57 -0000
Received: from mail-wg0-f45.google.com (HELO mail-wg0-f45.google.com)
	(74.125.82.45)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Jul 2015 16:43:57 -0000
Received: by wgjx7 with SMTP id x7so253706099wgj.2
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 10 Jul 2015 09:43:57 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=zYUGQKaNiA1teQGxI7El/Sy6usFXie3tLgOCRqC7csM=;
	b=yzB5pVSlai26MYgK6bLIwbveH+opuWzWfGmrvyhH80xCqxjYnZdsFttBAs2/Do7wBM
	sYg1D8EXMsFBfqRtbyFBpYIXWXM/ymx/JPyO3GVJTi7bCRqWRcCYm44YIXRRqMW/bSLD
	/IXNTdvjgHnh0uUuTQ5dN7a6RBClHVZvDJaASGyoUmveUtLNvc6o1vMmf479Sd8QMoUj
	pZ+sDS49leK6eGfPNNk86pZqxZB+fpGfALto/Gxoy8XEd3o/5GYYBeY+SsruB1kodLY2
	e60DMe9e2h8fmfQkx16NPGo2W78T/Zr9drhuuTsNfnD9sNxakNvW2/l3/22eJdTdReAQ
	tR7Q==
X-Received: by 10.195.11.3 with SMTP id ee3mr43123185wjd.89.1436546637008;
	Fri, 10 Jul 2015 09:43:57 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id dt1sm3697801wib.7.2015.07.10.09.43.56
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 10 Jul 2015 09:43:56 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri, 10 Jul 2015 17:43:39 +0100
Message-Id: <1436546620-4384-4-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
References: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 4/5] Remove PDO set/is-missing logic from
	XENDISK
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It's all completely unnecessary for a filter driver

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xendisk/fdo.c | 55 +++------------------------------------------
 src/xendisk/pdo.c | 67 ++++++++-----------------------------------------------
 src/xendisk/pdo.h | 16 -------------
 3 files changed, 12 insertions(+), 126 deletions(-)

diff --git a/src/xendisk/fdo.c b/src/xendisk/fdo.c
index 27db284..09f785f 100644
--- a/src/xendisk/fdo.c
+++ b/src/xendisk/fdo.c
@@ -265,28 +265,15 @@ __FdoEnumerate(
         PLIST_ENTRY     Next = ListEntry->Flink;
         PXENDISK_DX     Dx = CONTAINING_RECORD(ListEntry, XENDISK_DX, ListEntry);
         PXENDISK_PDO    Pdo = Dx->Pdo;
-        BOOLEAN         Missing;
 
-        Missing = TRUE;
         for (Index = 0; Index < Count; Index++) {
             if (PdoGetPhysicalDeviceObject(Pdo) == PhysicalDeviceObject[Index]) {
-                Missing = FALSE;
 #pragma prefast(suppress:6387)  // PhysicalDeviceObject[Index] could be NULL
-                ObDereferenceObject(PhysicalDeviceObject[Index]);
                 PhysicalDeviceObject[Index] = NULL; // avoid duplication
                 break;
             }
         }
 
-        if (Missing && !PdoIsMissing(Pdo)) {
-            if (PdoGetDevicePnpState(Pdo) == Present) {
-                PdoSetDevicePnpState(Pdo, Deleted);
-                PdoDestroy(Pdo);
-            } else {
-                PdoSetMissing(Pdo, "device disappeared");
-            }
-        }
-
         ListEntry = Next;
     }
 
@@ -296,7 +283,6 @@ __FdoEnumerate(
         if (PhysicalDeviceObject[Index] != NULL) {
             (VOID) PdoCreate(Fdo,
                              PhysicalDeviceObject[Index]);
-            ObDereferenceObject(PhysicalDeviceObject[Index]);
         }
     }
 
@@ -831,7 +817,6 @@ FdoQueryDeviceRelations(
 {
     KEVENT              Event;
     PIO_STACK_LOCATION  StackLocation;
-    ULONG               Size;
     PDEVICE_RELATIONS   Relations;
     PLIST_ENTRY         ListEntry;
     ULONG               Count;
@@ -875,59 +860,28 @@ FdoQueryDeviceRelations(
     if (Relations->Count != 0)
         __FdoEnumerate(Fdo, Relations);
 
-    ExFreePool(Relations);
-
     __FdoAcquireMutex(Fdo);
 
     Count = 0;
     for (ListEntry = Fdo->Dx->ListEntry.Flink;
          ListEntry != &Fdo->Dx->ListEntry;
-         ListEntry = ListEntry->Flink)
-    {
-        PXENDISK_DX     Dx = CONTAINING_RECORD(ListEntry, XENDISK_DX, ListEntry);
-        PXENDISK_PDO    Pdo = Dx->Pdo;
-
-        if (PdoIsMissing(Pdo))
-            continue;
-
-        Count++;
-    }
-
-    Size = sizeof(DEVICE_RELATIONS) + (sizeof (PDEVICE_OBJECT) * Count);
-
-    Relations = ExAllocatePoolWithTag(PagedPool, Size, 'TLIF');
-
-    status = STATUS_NO_MEMORY;
-    if (Relations == NULL)
-        goto fail3;
-
-    RtlZeroMemory(Relations, Size);
-
-    for (ListEntry = Fdo->Dx->ListEntry.Flink;
-         ListEntry != &Fdo->Dx->ListEntry;
          ListEntry = ListEntry->Flink) {
         PXENDISK_DX     Dx = CONTAINING_RECORD(ListEntry, XENDISK_DX, ListEntry);
         PXENDISK_PDO    Pdo = Dx->Pdo;
 
         ASSERT3U(Dx->Type, ==, PHYSICAL_DEVICE_OBJECT);
 
-        if (PdoIsMissing(Pdo))
-            continue;
-
         if (PdoGetDevicePnpState(Pdo) == Present)
             PdoSetDevicePnpState(Pdo, Enumerated);
 
-        ObReferenceObject(PdoGetPhysicalDeviceObject(Pdo));
-        Relations->Objects[Relations->Count++] = PdoGetPhysicalDeviceObject(Pdo);
+        Count++;
     }
-
     ASSERT3U(Relations->Count, ==, Count);
 
-    Trace("%d PDO(s)\n", Relations->Count);
-
     __FdoReleaseMutex(Fdo);
 
-    Irp->IoStatus.Information = (ULONG_PTR)Relations;
+    Trace("%d PDO(s)\n", Relations->Count);
+
     status = STATUS_SUCCESS;
 
 done:
@@ -938,9 +892,6 @@ done:
 
     return status;
 
-fail3:
-    __FdoReleaseMutex(Fdo);
-
 fail2:
     IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
 
diff --git a/src/xendisk/pdo.c b/src/xendisk/pdo.c
index cdf4af6..dffb294 100644
--- a/src/xendisk/pdo.c
+++ b/src/xendisk/pdo.c
@@ -61,8 +61,6 @@ struct _XENDISK_PDO {
     PIRP                        DevicePowerIrp;
 
     PXENDISK_FDO                Fdo;
-    BOOLEAN                     Missing;
-    const CHAR                  *Reason;
 
     ULONG                       SectorSize;
 };
@@ -188,41 +186,6 @@ PdoGetPhysicalDeviceObject(
 }
 
 static FORCEINLINE VOID
-__PdoSetMissing(
-    IN  PXENDISK_PDO    Pdo,
-    IN  const CHAR      *Reason
-    )
-{
-    Pdo->Reason = Reason;
-    Pdo->Missing = TRUE;
-}
-
-VOID
-PdoSetMissing(
-    IN  PXENDISK_PDO    Pdo,
-    IN  const CHAR      *Reason
-    )
-{
-    __PdoSetMissing(Pdo, Reason);
-}
-
-static FORCEINLINE BOOLEAN
-__PdoIsMissing(
-    IN  PXENDISK_PDO    Pdo
-    )
-{
-    return Pdo->Missing;
-}
-
-BOOLEAN
-PdoIsMissing(
-    IN  PXENDISK_PDO    Pdo
-    )
-{
-    return __PdoIsMissing(Pdo);
-}
-
-static FORCEINLINE VOID
 __PdoLink(
     IN  PXENDISK_PDO    Pdo,
     IN  PXENDISK_FDO    Fdo
@@ -1122,23 +1085,18 @@ PdoRemoveDevice(
                     PowerState);
 
 done:
-    if (__PdoIsMissing(Pdo)) {
-        __PdoSetDevicePnpState(Pdo, Deleted);
-        IoReleaseRemoveLockAndWait(&Pdo->Dx->RemoveLock, Irp);
-    } else {
-        __PdoSetDevicePnpState(Pdo, Enumerated);
-        IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
-    }
+    FdoAcquireMutex(Fdo);
+    __PdoSetDevicePnpState(Pdo, Deleted);
+    FdoReleaseMutex(Fdo);
+
+    IoReleaseRemoveLockAndWait(&Pdo->Dx->RemoveLock, Irp);
 
     status = PdoForwardIrpSynchronously(Pdo, Irp);
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
-    if (__PdoIsMissing(Pdo)) {
-        FdoAcquireMutex(Fdo);
-        PdoDestroy(Pdo);
-        FdoReleaseMutex(Fdo);
-    } else if (__PdoGetDevicePnpState(Pdo) == Enumerated)
-        __PdoSetMissing(Pdo, "Device removed");
+    FdoAcquireMutex(Fdo);
+    PdoDestroy(Pdo);
+    FdoReleaseMutex(Fdo);
 
     return status;
 
@@ -1158,7 +1116,6 @@ PdoEject(
     PXENDISK_FDO        Fdo = __PdoGetFdo(Pdo);
     NTSTATUS            status;
 
-    __PdoSetMissing(Pdo, "Ejected");
     __PdoSetDevicePnpState(Pdo, Deleted);
 
     status = PdoForwardIrpSynchronously(Pdo, Irp);
@@ -2074,15 +2031,9 @@ PdoDestroy(
 
     ASSERT3U(__PdoGetDevicePnpState(Pdo), ==, Deleted);
 
-    ASSERT(__PdoIsMissing(Pdo));
-    Pdo->Missing = FALSE;
-
     __PdoUnlink(Pdo);
 
-    Verbose("%p (%s)\n",
-         FilterDeviceObject,
-         Pdo->Reason);
-    Pdo->Reason = NULL;
+    Verbose("%p\n", FilterDeviceObject);
 
     Dx->Pdo = NULL;
 
diff --git a/src/xendisk/pdo.h b/src/xendisk/pdo.h
index 7866b83..566d60f 100644
--- a/src/xendisk/pdo.h
+++ b/src/xendisk/pdo.h
@@ -54,22 +54,6 @@ PdoGetPhysicalDeviceObject(
     IN  PXENDISK_PDO    Pdo
     );
 
-extern BOOLEAN
-PdoIsMissing(
-    IN  PXENDISK_PDO    Pdo
-    );
-
-extern VOID
-PdoSetMissing(
-    IN  PXENDISK_PDO    Pdo,
-    IN  const CHAR      *Reason
-    );
-
-extern BOOLEAN
-PdoIsMasked(
-    IN  PXENDISK_PDO    Pdo
-    );
-
 extern NTSTATUS
 PdoCreate(
     IN  PXENDISK_FDO    Fdo,
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Jul 10 16:43:59 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 10 Jul 2015 16:43:59 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZDbP5-0000MS-Ud; Fri, 10 Jul 2015 16:43:59 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZDbP5-0000Li-0B
	for win-pv-devel@lists.xenproject.org; Fri, 10 Jul 2015 16:43:59 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	09/7E-12923-D46FF955; Fri, 10 Jul 2015 16:43:57 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-8.tower-206.messagelabs.com!1436546635!20344910!1
X-Originating-IP: [74.125.82.53]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9327 invoked from network); 10 Jul 2015 16:43:55 -0000
Received: from mail-wg0-f53.google.com (HELO mail-wg0-f53.google.com)
	(74.125.82.53)
	by server-8.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Jul 2015 16:43:55 -0000
Received: by wgxm20 with SMTP id m20so70611574wgx.3
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 10 Jul 2015 09:43:55 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=BKWjtiOqKLQrxQM9bTXY89YTH0tWmoFEKjz5Kuy9MYw=;
	b=yhWKJhdUjiei9ee//TZTckvEtN/KxEpjEctdxUOYvN4du0tFtECt9zQg5HeEyHgXqL
	6/yfkmhgpyy2c5oJj3DUVx5v3m5Nl6Rj4yXB+xPeiaDNHM3N4c5gT53tuprwdAuzMvsY
	X7sL4oLkiz/DZs+zgIpj3yu+H+BDgqp5f3Sx8dj4Q7+2BA4NiM2hBLPgHKwo3w5K/Sjn
	3ECpFZ/ZTvcmAGSiWXN8zFkZOO8vAhKtjBDKvd7te1v/oobD9H6P5KrwNR343A7sew3e
	sUPkF71csEZWHVQkIDmR3kBWDf0o0lfpv1WfUKOkemKoIlD6dGNYVoj7MDR9yQAH1F51
	NVdQ==
X-Received: by 10.180.75.78 with SMTP id a14mr8244854wiw.68.1436546635469;
	Fri, 10 Jul 2015 09:43:55 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id dt1sm3697801wib.7.2015.07.10.09.43.54
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 10 Jul 2015 09:43:54 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri, 10 Jul 2015 17:43:37 +0100
Message-Id: <1436546620-4384-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
References: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 2/5] REMOVE_DEVICE must set device to Deleted
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

From: Owen Smith <owen.smith@citrix.com>

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/pdo.c | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index 89bfc5a..a77aeed 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -420,10 +420,8 @@ PdoSetDevicePnpState(
             __PnpStateName(Pdo->DevicePnpState),
             __PnpStateName(State));
 
-    if (Pdo->DevicePnpState == Deleted) {
-        ASSERT(State == Deleted);
+    if (Pdo->DevicePnpState == Deleted)
         return;
-    }
 
     Pdo->PrevPnpState = Pdo->DevicePnpState;
     Pdo->DevicePnpState = State;
@@ -2556,15 +2554,11 @@ __PdoRemoveDevice(
         StorPortNotification(BusChangeDetected, PdoGetFdo(Pdo), 0);
         break;
 
-    case Enumerated:
+    default:
         PdoSetMissing(Pdo, "Removed");
         PdoSetDevicePnpState(Pdo, Deleted);
         StorPortNotification(BusChangeDetected, PdoGetFdo(Pdo), 0);
         break;
-
-    default:
-        PdoSetDevicePnpState(Pdo, Enumerated);
-        break;
     }
 }
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Jul 10 16:43:59 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 10 Jul 2015 16:43:59 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZDbP5-0000MS-Ud; Fri, 10 Jul 2015 16:43:59 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZDbP5-0000Li-0B
	for win-pv-devel@lists.xenproject.org; Fri, 10 Jul 2015 16:43:59 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	09/7E-12923-D46FF955; Fri, 10 Jul 2015 16:43:57 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-8.tower-206.messagelabs.com!1436546635!20344910!1
X-Originating-IP: [74.125.82.53]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9327 invoked from network); 10 Jul 2015 16:43:55 -0000
Received: from mail-wg0-f53.google.com (HELO mail-wg0-f53.google.com)
	(74.125.82.53)
	by server-8.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Jul 2015 16:43:55 -0000
Received: by wgxm20 with SMTP id m20so70611574wgx.3
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 10 Jul 2015 09:43:55 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=BKWjtiOqKLQrxQM9bTXY89YTH0tWmoFEKjz5Kuy9MYw=;
	b=yhWKJhdUjiei9ee//TZTckvEtN/KxEpjEctdxUOYvN4du0tFtECt9zQg5HeEyHgXqL
	6/yfkmhgpyy2c5oJj3DUVx5v3m5Nl6Rj4yXB+xPeiaDNHM3N4c5gT53tuprwdAuzMvsY
	X7sL4oLkiz/DZs+zgIpj3yu+H+BDgqp5f3Sx8dj4Q7+2BA4NiM2hBLPgHKwo3w5K/Sjn
	3ECpFZ/ZTvcmAGSiWXN8zFkZOO8vAhKtjBDKvd7te1v/oobD9H6P5KrwNR343A7sew3e
	sUPkF71csEZWHVQkIDmR3kBWDf0o0lfpv1WfUKOkemKoIlD6dGNYVoj7MDR9yQAH1F51
	NVdQ==
X-Received: by 10.180.75.78 with SMTP id a14mr8244854wiw.68.1436546635469;
	Fri, 10 Jul 2015 09:43:55 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id dt1sm3697801wib.7.2015.07.10.09.43.54
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 10 Jul 2015 09:43:54 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri, 10 Jul 2015 17:43:37 +0100
Message-Id: <1436546620-4384-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
References: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 2/5] REMOVE_DEVICE must set device to Deleted
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

From: Owen Smith <owen.smith@citrix.com>

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/pdo.c | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index 89bfc5a..a77aeed 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -420,10 +420,8 @@ PdoSetDevicePnpState(
             __PnpStateName(Pdo->DevicePnpState),
             __PnpStateName(State));
 
-    if (Pdo->DevicePnpState == Deleted) {
-        ASSERT(State == Deleted);
+    if (Pdo->DevicePnpState == Deleted)
         return;
-    }
 
     Pdo->PrevPnpState = Pdo->DevicePnpState;
     Pdo->DevicePnpState = State;
@@ -2556,15 +2554,11 @@ __PdoRemoveDevice(
         StorPortNotification(BusChangeDetected, PdoGetFdo(Pdo), 0);
         break;
 
-    case Enumerated:
+    default:
         PdoSetMissing(Pdo, "Removed");
         PdoSetDevicePnpState(Pdo, Deleted);
         StorPortNotification(BusChangeDetected, PdoGetFdo(Pdo), 0);
         break;
-
-    default:
-        PdoSetDevicePnpState(Pdo, Enumerated);
-        break;
     }
 }
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Jul 10 16:44:01 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 10 Jul 2015 16:44:01 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZDbP7-0000NF-08; Fri, 10 Jul 2015 16:44:01 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZDbP6-0000MJ-6z
	for win-pv-devel@lists.xenproject.org; Fri, 10 Jul 2015 16:44:00 +0000
Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id
	D3/12-01139-F46FF955; Fri, 10 Jul 2015 16:43:59 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-11.tower-206.messagelabs.com!1436546637!16242308!1
X-Originating-IP: [209.85.212.182]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3116 invoked from network); 10 Jul 2015 16:43:59 -0000
Received: from mail-wi0-f182.google.com (HELO mail-wi0-f182.google.com)
	(209.85.212.182)
	by server-11.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Jul 2015 16:43:59 -0000
Received: by widjy10 with SMTP id jy10so20237758wid.1
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 10 Jul 2015 09:43:57 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=xyXzMkdiz7pkPsMjxKw5/qTq1AUF2DZEO+Elb1l+PiU=;
	b=J/x8TjWy1Uzg9jL1EdPAugUmnYpRaeFoft4jZqM/tSIdnQ2XW6xBE1ZuJXoq+nxWDo
	GERH+3Pdet68mq41E0y25NYx7wu6euVFrX1g20VvegOJZp983EpPtSV743QNjr+eLzBC
	tOtAZS/pdq+8cMppd3EYsKcG+T7cgVOSkux5XTyh3kxNgh2o/rWHXOKQntcI3TEmOp4r
	TZHWNZAxUsBnPto56ql1/Y653tnOa8dRFMQzu9y8EzDTtE2VUftPnZ0qRt8RiX526Y/a
	MUDcrWXbPH/Pmo/++zXi+CsUQgdeQm3LpY4LTapOfH+hrsXYCtPBff0W447qh3diYAl5
	kB4w==
X-Received: by 10.194.95.132 with SMTP id dk4mr45891469wjb.88.1436546637850;
	Fri, 10 Jul 2015 09:43:57 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id dt1sm3697801wib.7.2015.07.10.09.43.57
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 10 Jul 2015 09:43:57 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri, 10 Jul 2015 17:43:40 +0100
Message-Id: <1436546620-4384-5-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
References: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 5/5] Ignore failures when closing the frontend
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The backend may disappear when this happens but we must always carry on
and disconnect the frontend regardless.

From: Owen Smith <owen.smith@citrix.com>
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvbd/frontend.c | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/src/xenvbd/frontend.c b/src/xenvbd/frontend.c
index f01b142..94e7f5b 100644
--- a/src/xenvbd/frontend.c
+++ b/src/xenvbd/frontend.c
@@ -1369,12 +1369,7 @@ __FrontendSetState(
             case XENVBD_CLOSED:
             case XENVBD_PREPARED:
                 Status = FrontendClose(Frontend);
-                if (NT_SUCCESS(Status)) {
-                    Frontend->State = XENVBD_CLOSING;
-                } else {
-                    Frontend->State = XENVBD_STATE_INVALID;
-                    Failed = TRUE;
-                }
+                Frontend->State = XENVBD_CLOSING;
                 break;
             default:
                 Failed = TRUE;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Jul 10 16:44:01 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 10 Jul 2015 16:44:01 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZDbP7-0000NF-08; Fri, 10 Jul 2015 16:44:01 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZDbP6-0000MJ-6z
	for win-pv-devel@lists.xenproject.org; Fri, 10 Jul 2015 16:44:00 +0000
Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id
	D3/12-01139-F46FF955; Fri, 10 Jul 2015 16:43:59 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-11.tower-206.messagelabs.com!1436546637!16242308!1
X-Originating-IP: [209.85.212.182]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3116 invoked from network); 10 Jul 2015 16:43:59 -0000
Received: from mail-wi0-f182.google.com (HELO mail-wi0-f182.google.com)
	(209.85.212.182)
	by server-11.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Jul 2015 16:43:59 -0000
Received: by widjy10 with SMTP id jy10so20237758wid.1
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 10 Jul 2015 09:43:57 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=xyXzMkdiz7pkPsMjxKw5/qTq1AUF2DZEO+Elb1l+PiU=;
	b=J/x8TjWy1Uzg9jL1EdPAugUmnYpRaeFoft4jZqM/tSIdnQ2XW6xBE1ZuJXoq+nxWDo
	GERH+3Pdet68mq41E0y25NYx7wu6euVFrX1g20VvegOJZp983EpPtSV743QNjr+eLzBC
	tOtAZS/pdq+8cMppd3EYsKcG+T7cgVOSkux5XTyh3kxNgh2o/rWHXOKQntcI3TEmOp4r
	TZHWNZAxUsBnPto56ql1/Y653tnOa8dRFMQzu9y8EzDTtE2VUftPnZ0qRt8RiX526Y/a
	MUDcrWXbPH/Pmo/++zXi+CsUQgdeQm3LpY4LTapOfH+hrsXYCtPBff0W447qh3diYAl5
	kB4w==
X-Received: by 10.194.95.132 with SMTP id dk4mr45891469wjb.88.1436546637850;
	Fri, 10 Jul 2015 09:43:57 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id dt1sm3697801wib.7.2015.07.10.09.43.57
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 10 Jul 2015 09:43:57 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri, 10 Jul 2015 17:43:40 +0100
Message-Id: <1436546620-4384-5-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
References: <1436546620-4384-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 5/5] Ignore failures when closing the frontend
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The backend may disappear when this happens but we must always carry on
and disconnect the frontend regardless.

From: Owen Smith <owen.smith@citrix.com>
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvbd/frontend.c | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/src/xenvbd/frontend.c b/src/xenvbd/frontend.c
index f01b142..94e7f5b 100644
--- a/src/xenvbd/frontend.c
+++ b/src/xenvbd/frontend.c
@@ -1369,12 +1369,7 @@ __FrontendSetState(
             case XENVBD_CLOSED:
             case XENVBD_PREPARED:
                 Status = FrontendClose(Frontend);
-                if (NT_SUCCESS(Status)) {
-                    Frontend->State = XENVBD_CLOSING;
-                } else {
-                    Frontend->State = XENVBD_STATE_INVALID;
-                    Failed = TRUE;
-                }
+                Frontend->State = XENVBD_CLOSING;
                 break;
             default:
                 Failed = TRUE;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 13 14:08:08 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 13 Jul 2015 14:08:08 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZEeOt-0007kM-Ku; Mon, 13 Jul 2015 14:08:07 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1ZEeOr-0007kE-Oz
	for win-pv-devel@lists.xenproject.org; Mon, 13 Jul 2015 14:08:05 +0000
Received: from [193.109.254.147] by server-11.bemta-14.messagelabs.com id
	A2/84-30658-546C3A55; Mon, 13 Jul 2015 14:08:05 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-2.tower-27.messagelabs.com!1436796483!31639478!1
X-Originating-IP: [74.125.82.52]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25345 invoked from network); 13 Jul 2015 14:08:03 -0000
Received: from mail-wg0-f52.google.com (HELO mail-wg0-f52.google.com)
	(74.125.82.52)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Jul 2015 14:08:03 -0000
Received: by wgkl9 with SMTP id l9so26908896wgk.1
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 13 Jul 2015 07:08:03 -0700 (PDT)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=1e100.net; s=20130820;
	h=x-gm-message-state:to:cc:from:subject:message-id:date:user-agent
	:mime-version:content-type;
	bh=gohYHRUfQ4HyAUO6zEPfTVJVz46dz6+9s/umjUj+8v4=;
	b=hOP4BorGjvx20FDQoKmAi+g8NtDskkxe7LxypoxW90nMvquVkKIlmA5S8v0s7IAmcH
	2AJfb33UteqJEgYd35l8irWQjGfeF0ONArHg0Tk/Ooz+1+j3C2uzkHVjj/uK5/xewZhi
	QBwwCmj2QKOVBKBJMpDeTsgBZ3VrY5PSlX3KDfci5KgWTsnp5dBXnKNHpP9ivP9A5zQ8
	8+WqWCNrgYbICIXTXJq4a5gPEeCp0BBvVtp5S6jHbWY/zdqvs8wjwrkn4UV3VBfwLPKi
	/OLnZwuCnQjmyYAdN0h+LvwHXLJr/Jj0uhXzQNq9TDdLJZLphDG4saXgvjniencrrLi2
	XudA==
X-Gm-Message-State: ALoCoQlcTZKCwimXvirQlPTb+GFtUQ3wT5HXgHTmc2OKR4XEBCt0Fe59WuJsSUkUeIueRANxI62j
X-Received: by 10.180.109.6 with SMTP id ho6mr23570094wib.58.1436796483070;
	Mon, 13 Jul 2015 07:08:03 -0700 (PDT)
Received: from [192.168.1.11] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	w8sm22169557wja.15.2015.07.13.07.08.00
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 13 Jul 2015 07:08:02 -0700 (PDT)
To: win-pv-devel@lists.xenproject.org
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <55A3C63E.3080004@m2r.biz>
Date: Mon, 13 Jul 2015 16:07:58 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.0.1
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------010802020406000709060908"
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] Regression: qemu crash at boot after update winpv
 drivers to latest build
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This is a multi-part message in MIME format.
--------------010802020406000709060908
Content-Type: text/plain; charset=iso-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

I updated winpv drivers to latest build on windows 7 pro 64 bit domU and 
I had qemu crash at windows boot.
In attachment qemu log with xen-platform trace enabled.
Same domU (on same dom0 with same xen, qemu ecc..versions) was working 
before but I did only few tests on new xen-unstable build I did friday.

If you need other information/tests tell me and I'll post them.

Thanks for any reply and sorry for my bad english.

--------------010802020406000709060908
Content-Type: text/plain; charset=UTF-8;
 name="qemu-dm-W7.log"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="qemu-dm-W7.log"

main_channel_link: add main channel client
main_channel_handle_parsed: net test: latency 4.208000 ms, bitrate 1297023432 bps (1236.937935 Mbps)
inputs_connect: inputs channel client create
red_dispatcher_set_cursor_peer: 
17152@1436795187.686464:xen_platform_log xen platform: XEN|DllInitialize: 8.0.0 (61) (08.07.2015)
17152@1436795187.686674:xen_platform_log xen platform: XEN|AcpiFindRsdp: 0x00000000000F65D0
17152@1436795187.686806:xen_platform_log xen platform: XEN|SystemGetStartOptions:  TESTSIGNING  NOEXECUTE=OPTIN
17152@1436795187.686927:xen_platform_log xen platform: XEN|SystemGetVersionInformation: KERNEL: 6.1 (BUILD 7601) PLATFORM WIN32_NT (x64)
17152@1436795187.687011:xen_platform_log xen platform: XEN|SystemGetVersionInformation: SP: 1.0 ()
17152@1436795187.687090:xen_platform_log xen platform: XEN|SystemGetVersionInformation: SUITES:
17152@1436795187.687172:xen_platform_log xen platform: XEN|SystemGetVersionInformation: - TERMINAL
17152@1436795187.687257:xen_platform_log xen platform: XEN|SystemGetVersionInformation: - SINGLEUSERTS
17152@1436795187.687344:xen_platform_log xen platform: XEN|SystemGetVersionInformation: TYPE: WORKSTATION
17152@1436795187.687442:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[0] 00000000.00001000 - 00000000.0009efff
17152@1436795187.687523:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[1] 00000000.00100000 - 00000000.77ffdfff
17152@1436795187.687575:xen_platform_log xen platform: XEN|AcpiGetXsdt: 0x00000000FC00A010
17152@1436795187.688450:xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:0)
17152@1436795187.688565:xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
17152@1436795187.688627:xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 00
17152@1436795187.688687:xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 00
17152@1436795187.688742:xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:0)
17152@1436795187.689582:xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:1)
17152@1436795187.689677:xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
17152@1436795187.689739:xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 02
17152@1436795187.689799:xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 01
17152@1436795187.689857:xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:1)
17152@1436795187.690693:xen_platform_log xen platform: XEN: HYPERCALL PAGE 0 @ 00000000.0368c000
17152@1436795187.726060:xen_platform_log xen platform: XENFILT|DriverEntry: 8.0.0 (61) (08.07.2015)
17152@1436795187.726150:xen_platform_log xen platform: XEN: 4.6-unstable (__XEN_INTERFACE_VERSION__ = 00040600)
17152@1436795187.726272:xen_platform_log xen platform: XENFILT|DriverSetActiveDeviceInstance: PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01/10
17152@1436795187.726341:xen_platform_log xen platform: XENFILT|UnplugCheckForPVDisks: PRESENT
17152@1436795187.726398:xen_platform_log xen platform: XENFILT|UnplugCheckForPVNics: PRESENT
17152@1436795187.760948:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA800255BAC0 (ACPI\PNP0A03\0)
17152@1436795188.041887:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA8002573AC0 (PCI\VEN_8086&DEV_1237&SUBSYS_11001AF4&REV_02\00)
17152@1436795188.042069:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA80025845D0 (PCI\VEN_8086&DEV_7000&SUBSYS_11001AF4&REV_00\08)
17152@1436795188.042205:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA80025855D0 (PCI\VEN_8086&DEV_7010&SUBSYS_11001AF4&REV_00\09)
17152@1436795188.042344:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA80025865D0 (PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10)
17152@1436795188.042478:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA80025875D0 (PCI\VEN_8086&DEV_2668&SUBSYS_11001AF4&REV_01\18)
17152@1436795188.042612:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA80025885D0 (PCI\VEN_1AF4&DEV_1003&SUBSYS_00031AF4&REV_00\20)
17152@1436795188.042789:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA800258A040 (PCI\VEN_1B36&DEV_0100&SUBSYS_11001AF4&REV_04\28)
17152@1436795188.042924:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA800258B040 (PCI\VEN_10EC&DEV_8139&SUBSYS_11001AF4&REV_20\30)
17152@1436795188.043058:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA800258C040 (PCI\VEN_8086&DEV_2922&SUBSYS_11001AF4&REV_02\38)
17152@1436795188.043224:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA800258D040 (ACPI\PNP0103\0)
17152@1436795188.043328:xen_platform_log xen platform: XENFILT|DriverSetFilterState: ACTIVE DEVICE PRESENT
17152@1436795188.043500:xen_platform_log xen platform: UNPLUG: PRE-AMBLE (DRIVERS NOT BLACKLISTED)
17152@1436795188.079657:xen_platform_log xen platform: UNPLUG: DISKS
17152@1436795188.085211:xen_platform_log xen platform: UNPLUG: NICS
17152@1436795188.085354:xen_platform_log xen platform: XENFILT|DriverSetFilterState: PENDING
17152@1436795188.131463:xen_platform_log xen platform: XENFILT|PdoDestroy: FFFFFA800258B040 (PCI\VEN_10EC&DEV_8139&SUBSYS_11001AF4&REV_20\30) (device disappeared)
17152@1436795188.131641:xen_platform_log xen platform: XENFILT|DriverSetFilterState: DISABLED
17152@1436795188.157313:xen_platform_log xen platform: XENBUS|DriverEntry: 8.0.0 (61) (08.07.2015)
17152@1436795188.157683:xen_platform_log xen platform: XENFILT|PdoQueryInterface: PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10: UNPLUG_INTERFACE (VERSION 1)
17152@1436795188.157836:xen_platform_log xen platform: XENBUS|FdoCreate: FFFFFA80016FF040 (XS0001 XENBUS) [ACTIVE]
17152@1436795188.176219:xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFFA8001700B58: Shared LevelSensitive CPU 0:0 VECTOR 51
17152@1436795188.176388:xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFFA8001700908: DeviceExclusive Latched CPU 0:0 VECTOR b0
17152@1436795188.176556:xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFFA80017006B8: DeviceExclusive Latched CPU 0:1 VECTOR b0
17152@1436795188.177434:xen_platform_log xen platform: XENBUS|FdoScan: ====>
17152@1436795188.177537:xen_platform_log xen platform: XENBUS|FdoCreateIoSpace: 00000000.f8000000 - 00000000.f8ffffff
17152@1436795188.177595:xen_platform_log xen platform: XENBUS|FdoSuspend: ====>
17152@1436795188.177651:xen_platform_log xen platform: XEN|HvmSetParam: fail1 (c0000022)
17152@1436795188.178474:xen_platform_log xen platform: XENBUS|FdoBalloon: ====>
17152@1436795188.178560:xen_platform_log xen platform: SHARED_INFO: MAP XENMAPSPACE_shared_info @ 00000000.f8000000
17152@1436795188.178667:xen_platform_log xen platform: EVTCHN_FIFO: CONTROLBLOCK[0] @ 00000000.36f65000
17152@1436795188.178749:xen_platform_log xen platform: EVTCHN_FIFO: CONTROLBLOCK[1] @ 00000000.37866000
17152@1436795188.178803:xen_platform_log xen platform: XENBUS|EvtchnAbiAcquire: FIFO
17152@1436795188.178884:xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CPU 0:0 (Vector = 176)
17152@1436795188.178952:xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CPU 0:1 (Vector = 176)
17152@1436795188.179051:xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CALLBACK VIA (Vector = 24)
17152@1436795188.179107:xen_platform_log xen platform: STORE: PAGE @ 00000000.feffc000
17152@1436795188.179157:xen_platform_log xen platform: STORE: EVTCHN 1
17152@1436795188.179242:xen_platform_log xen platform: EVTCHN_FIFO: EVENTARRAY[0] @ 00000000.368e7000
17152@1436795188.179312:xen_platform_log xen platform: XENBUS|EvtchnFifoExpand: added ports [00000000 - 000003ff]
17152@1436795188.180110:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000001 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v1 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.180237:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000002 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v2 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.180353:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000003 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v3 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.180482:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000004 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.180600:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000005 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v1 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.180714:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000006 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v2 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.180829:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000007 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v3 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.180943:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000008 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.181021:xen_platform_log xen platform: XENBUS|PdoCreate: FFFFFA8001702720 (VBD: Highest Revision = 08000008)
17152@1436795188.181202:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000001 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v1 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.181325:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000002 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v2 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.181441:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000003 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v3 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.181555:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000004 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.181670:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000005 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v1 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.181784:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000006 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v2 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.181898:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000007 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v3 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.182013:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000008 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.182096:xen_platform_log xen platform: XENBUS|PdoCreate: FFFFFA8001703D40 (VIF: Highest Revision = 08000008)
17152@1436795188.182274:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000001 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v1 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.182395:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000002 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v2 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.182510:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000003 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v3 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.182625:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000004 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.182739:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000005 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v1 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.182854:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000006 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v2 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.182977:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000007 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v3 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.183092:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000008 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.189358:xen_platform_log xen platform: XENBUS|PdoCreate: FFFFFA800252C850 (IFACE: Highest Revision = 08000008)
17152@1436795188.211600:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA800253CAC0 (PCIIDE\IDEChannel\0)
17152@1436795188.211833:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA8002541AC0 (PCIIDE\IDEChannel\1)
17152@1436795191.230397:xen_platform_log xen platform: XENVBD|DriverEntry:8.0.0.20 (12/6/2015)
17152@1436795191.230631:xen_platform_log xen platform: XENVBD|__DriverParseParameterKey:DriverParameters: 
17152@1436795191.231868:xen_platform_log xen platform: XENDISK|DriverEntry:XENDISK 8.0.0 (20) (12.06.2015)
17152@1436795191.259475:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA8002555040 (PCIIDE\IDEChannel\0)
17152@1436795191.260045:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA8002558040 (PCIIDE\IDEChannel\1)
17152@1436795191.261117:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA8002559040 (PCIIDE\IDEChannel\2)
17152@1436795191.261671:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA8002599040 (PCIIDE\IDEChannel\3)
17152@1436795191.262225:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA80025CE040 (PCIIDE\IDEChannel\4)
17152@1436795191.262803:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA80025D9040 (PCIIDE\IDEChannel\5)
17152@1436795191.267891:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA80025F3040 (IDE\DiskQEMU_HARDDISK___________________________2.3.50__\0.0.0)
17152@1436795191.520153:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA800260C630 (IDE\CdRomQEMU_QEMU_DVD-ROM_______________________2.3.____\5.0.0)
Bad ram offset 847cb000

--------------010802020406000709060908
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
--------------010802020406000709060908--


From win-pv-devel-bounces@lists.xenproject.org Mon Jul 13 14:08:08 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 13 Jul 2015 14:08:08 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZEeOt-0007kM-Ku; Mon, 13 Jul 2015 14:08:07 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1ZEeOr-0007kE-Oz
	for win-pv-devel@lists.xenproject.org; Mon, 13 Jul 2015 14:08:05 +0000
Received: from [193.109.254.147] by server-11.bemta-14.messagelabs.com id
	A2/84-30658-546C3A55; Mon, 13 Jul 2015 14:08:05 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-2.tower-27.messagelabs.com!1436796483!31639478!1
X-Originating-IP: [74.125.82.52]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25345 invoked from network); 13 Jul 2015 14:08:03 -0000
Received: from mail-wg0-f52.google.com (HELO mail-wg0-f52.google.com)
	(74.125.82.52)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Jul 2015 14:08:03 -0000
Received: by wgkl9 with SMTP id l9so26908896wgk.1
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 13 Jul 2015 07:08:03 -0700 (PDT)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=1e100.net; s=20130820;
	h=x-gm-message-state:to:cc:from:subject:message-id:date:user-agent
	:mime-version:content-type;
	bh=gohYHRUfQ4HyAUO6zEPfTVJVz46dz6+9s/umjUj+8v4=;
	b=hOP4BorGjvx20FDQoKmAi+g8NtDskkxe7LxypoxW90nMvquVkKIlmA5S8v0s7IAmcH
	2AJfb33UteqJEgYd35l8irWQjGfeF0ONArHg0Tk/Ooz+1+j3C2uzkHVjj/uK5/xewZhi
	QBwwCmj2QKOVBKBJMpDeTsgBZ3VrY5PSlX3KDfci5KgWTsnp5dBXnKNHpP9ivP9A5zQ8
	8+WqWCNrgYbICIXTXJq4a5gPEeCp0BBvVtp5S6jHbWY/zdqvs8wjwrkn4UV3VBfwLPKi
	/OLnZwuCnQjmyYAdN0h+LvwHXLJr/Jj0uhXzQNq9TDdLJZLphDG4saXgvjniencrrLi2
	XudA==
X-Gm-Message-State: ALoCoQlcTZKCwimXvirQlPTb+GFtUQ3wT5HXgHTmc2OKR4XEBCt0Fe59WuJsSUkUeIueRANxI62j
X-Received: by 10.180.109.6 with SMTP id ho6mr23570094wib.58.1436796483070;
	Mon, 13 Jul 2015 07:08:03 -0700 (PDT)
Received: from [192.168.1.11] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	w8sm22169557wja.15.2015.07.13.07.08.00
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 13 Jul 2015 07:08:02 -0700 (PDT)
To: win-pv-devel@lists.xenproject.org
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <55A3C63E.3080004@m2r.biz>
Date: Mon, 13 Jul 2015 16:07:58 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.0.1
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------010802020406000709060908"
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] Regression: qemu crash at boot after update winpv
 drivers to latest build
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This is a multi-part message in MIME format.
--------------010802020406000709060908
Content-Type: text/plain; charset=iso-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

I updated winpv drivers to latest build on windows 7 pro 64 bit domU and 
I had qemu crash at windows boot.
In attachment qemu log with xen-platform trace enabled.
Same domU (on same dom0 with same xen, qemu ecc..versions) was working 
before but I did only few tests on new xen-unstable build I did friday.

If you need other information/tests tell me and I'll post them.

Thanks for any reply and sorry for my bad english.

--------------010802020406000709060908
Content-Type: text/plain; charset=UTF-8;
 name="qemu-dm-W7.log"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="qemu-dm-W7.log"

main_channel_link: add main channel client
main_channel_handle_parsed: net test: latency 4.208000 ms, bitrate 1297023432 bps (1236.937935 Mbps)
inputs_connect: inputs channel client create
red_dispatcher_set_cursor_peer: 
17152@1436795187.686464:xen_platform_log xen platform: XEN|DllInitialize: 8.0.0 (61) (08.07.2015)
17152@1436795187.686674:xen_platform_log xen platform: XEN|AcpiFindRsdp: 0x00000000000F65D0
17152@1436795187.686806:xen_platform_log xen platform: XEN|SystemGetStartOptions:  TESTSIGNING  NOEXECUTE=OPTIN
17152@1436795187.686927:xen_platform_log xen platform: XEN|SystemGetVersionInformation: KERNEL: 6.1 (BUILD 7601) PLATFORM WIN32_NT (x64)
17152@1436795187.687011:xen_platform_log xen platform: XEN|SystemGetVersionInformation: SP: 1.0 ()
17152@1436795187.687090:xen_platform_log xen platform: XEN|SystemGetVersionInformation: SUITES:
17152@1436795187.687172:xen_platform_log xen platform: XEN|SystemGetVersionInformation: - TERMINAL
17152@1436795187.687257:xen_platform_log xen platform: XEN|SystemGetVersionInformation: - SINGLEUSERTS
17152@1436795187.687344:xen_platform_log xen platform: XEN|SystemGetVersionInformation: TYPE: WORKSTATION
17152@1436795187.687442:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[0] 00000000.00001000 - 00000000.0009efff
17152@1436795187.687523:xen_platform_log xen platform: XEN|SystemGetMemoryInformation: RANGE[1] 00000000.00100000 - 00000000.77ffdfff
17152@1436795187.687575:xen_platform_log xen platform: XEN|AcpiGetXsdt: 0x00000000FC00A010
17152@1436795187.688450:xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:0)
17152@1436795187.688565:xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
17152@1436795187.688627:xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 00
17152@1436795187.688687:xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 00
17152@1436795187.688742:xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:0)
17152@1436795187.689582:xen_platform_log xen platform: XEN|SystemProcessorInformation: ====> (0:1)
17152@1436795187.689677:xen_platform_log xen platform: XEN|SystemProcessorInformation: Manufacturer: GenuineIntel
17152@1436795187.689739:xen_platform_log xen platform: XEN|SystemProcessorInformation: APIC ID: 02
17152@1436795187.689799:xen_platform_log xen platform: XEN|SystemProcessorInformation: PROCESSOR ID: 01
17152@1436795187.689857:xen_platform_log xen platform: XEN|SystemProcessorInformation: <==== (0:1)
17152@1436795187.690693:xen_platform_log xen platform: XEN: HYPERCALL PAGE 0 @ 00000000.0368c000
17152@1436795187.726060:xen_platform_log xen platform: XENFILT|DriverEntry: 8.0.0 (61) (08.07.2015)
17152@1436795187.726150:xen_platform_log xen platform: XEN: 4.6-unstable (__XEN_INTERFACE_VERSION__ = 00040600)
17152@1436795187.726272:xen_platform_log xen platform: XENFILT|DriverSetActiveDeviceInstance: PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01/10
17152@1436795187.726341:xen_platform_log xen platform: XENFILT|UnplugCheckForPVDisks: PRESENT
17152@1436795187.726398:xen_platform_log xen platform: XENFILT|UnplugCheckForPVNics: PRESENT
17152@1436795187.760948:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA800255BAC0 (ACPI\PNP0A03\0)
17152@1436795188.041887:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA8002573AC0 (PCI\VEN_8086&DEV_1237&SUBSYS_11001AF4&REV_02\00)
17152@1436795188.042069:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA80025845D0 (PCI\VEN_8086&DEV_7000&SUBSYS_11001AF4&REV_00\08)
17152@1436795188.042205:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA80025855D0 (PCI\VEN_8086&DEV_7010&SUBSYS_11001AF4&REV_00\09)
17152@1436795188.042344:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA80025865D0 (PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10)
17152@1436795188.042478:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA80025875D0 (PCI\VEN_8086&DEV_2668&SUBSYS_11001AF4&REV_01\18)
17152@1436795188.042612:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA80025885D0 (PCI\VEN_1AF4&DEV_1003&SUBSYS_00031AF4&REV_00\20)
17152@1436795188.042789:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA800258A040 (PCI\VEN_1B36&DEV_0100&SUBSYS_11001AF4&REV_04\28)
17152@1436795188.042924:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA800258B040 (PCI\VEN_10EC&DEV_8139&SUBSYS_11001AF4&REV_20\30)
17152@1436795188.043058:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA800258C040 (PCI\VEN_8086&DEV_2922&SUBSYS_11001AF4&REV_02\38)
17152@1436795188.043224:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA800258D040 (ACPI\PNP0103\0)
17152@1436795188.043328:xen_platform_log xen platform: XENFILT|DriverSetFilterState: ACTIVE DEVICE PRESENT
17152@1436795188.043500:xen_platform_log xen platform: UNPLUG: PRE-AMBLE (DRIVERS NOT BLACKLISTED)
17152@1436795188.079657:xen_platform_log xen platform: UNPLUG: DISKS
17152@1436795188.085211:xen_platform_log xen platform: UNPLUG: NICS
17152@1436795188.085354:xen_platform_log xen platform: XENFILT|DriverSetFilterState: PENDING
17152@1436795188.131463:xen_platform_log xen platform: XENFILT|PdoDestroy: FFFFFA800258B040 (PCI\VEN_10EC&DEV_8139&SUBSYS_11001AF4&REV_20\30) (device disappeared)
17152@1436795188.131641:xen_platform_log xen platform: XENFILT|DriverSetFilterState: DISABLED
17152@1436795188.157313:xen_platform_log xen platform: XENBUS|DriverEntry: 8.0.0 (61) (08.07.2015)
17152@1436795188.157683:xen_platform_log xen platform: XENFILT|PdoQueryInterface: PCI\VEN_5853&DEV_0001&SUBSYS_00015853&REV_01\10: UNPLUG_INTERFACE (VERSION 1)
17152@1436795188.157836:xen_platform_log xen platform: XENBUS|FdoCreate: FFFFFA80016FF040 (XS0001 XENBUS) [ACTIVE]
17152@1436795188.176219:xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFFA8001700B58: Shared LevelSensitive CPU 0:0 VECTOR 51
17152@1436795188.176388:xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFFA8001700908: DeviceExclusive Latched CPU 0:0 VECTOR b0
17152@1436795188.176556:xen_platform_log xen platform: XENBUS|FdoConnectInterrupt: FFFFFA80017006B8: DeviceExclusive Latched CPU 0:1 VECTOR b0
17152@1436795188.177434:xen_platform_log xen platform: XENBUS|FdoScan: ====>
17152@1436795188.177537:xen_platform_log xen platform: XENBUS|FdoCreateIoSpace: 00000000.f8000000 - 00000000.f8ffffff
17152@1436795188.177595:xen_platform_log xen platform: XENBUS|FdoSuspend: ====>
17152@1436795188.177651:xen_platform_log xen platform: XEN|HvmSetParam: fail1 (c0000022)
17152@1436795188.178474:xen_platform_log xen platform: XENBUS|FdoBalloon: ====>
17152@1436795188.178560:xen_platform_log xen platform: SHARED_INFO: MAP XENMAPSPACE_shared_info @ 00000000.f8000000
17152@1436795188.178667:xen_platform_log xen platform: EVTCHN_FIFO: CONTROLBLOCK[0] @ 00000000.36f65000
17152@1436795188.178749:xen_platform_log xen platform: EVTCHN_FIFO: CONTROLBLOCK[1] @ 00000000.37866000
17152@1436795188.178803:xen_platform_log xen platform: XENBUS|EvtchnAbiAcquire: FIFO
17152@1436795188.178884:xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CPU 0:0 (Vector = 176)
17152@1436795188.178952:xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CPU 0:1 (Vector = 176)
17152@1436795188.179051:xen_platform_log xen platform: XENBUS|EvtchnInterruptEnable: CALLBACK VIA (Vector = 24)
17152@1436795188.179107:xen_platform_log xen platform: STORE: PAGE @ 00000000.feffc000
17152@1436795188.179157:xen_platform_log xen platform: STORE: EVTCHN 1
17152@1436795188.179242:xen_platform_log xen platform: EVTCHN_FIFO: EVENTARRAY[0] @ 00000000.368e7000
17152@1436795188.179312:xen_platform_log xen platform: XENBUS|EvtchnFifoExpand: added ports [00000000 - 000003ff]
17152@1436795188.180110:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000001 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v1 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.180237:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000002 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v2 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.180353:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000003 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v3 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.180482:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000004 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.180600:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000005 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v1 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.180714:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000006 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v2 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.180829:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000007 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v3 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.180943:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000008 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.181021:xen_platform_log xen platform: XENBUS|PdoCreate: FFFFFA8001702720 (VBD: Highest Revision = 08000008)
17152@1436795188.181202:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000001 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v1 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.181325:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000002 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v2 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.181441:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000003 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v3 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.181555:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000004 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.181670:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000005 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v1 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.181784:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000006 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v2 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.181898:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000007 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v3 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.182013:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000008 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.182096:xen_platform_log xen platform: XENBUS|PdoCreate: FFFFFA8001703D40 (VIF: Highest Revision = 08000008)
17152@1436795188.182274:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000001 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v1 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.182395:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000002 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v2 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.182510:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000003 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v3 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.182625:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000004 -> SUSPEND v1 SHARED_INFO v1 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.182739:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000005 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v1 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.182854:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000006 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v2 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.182977:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000007 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v3 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.183092:xen_platform_log xen platform: XENBUS|PdoSetRevisions: 08000008 -> SUSPEND v1 SHARED_INFO v2 EVTCHN v4 DEBUG v1 STORE v1 RANGE_SET v1 CACHE v1 GNTTAB v1 EMULATED v1 UNPLUG v1
17152@1436795188.189358:xen_platform_log xen platform: XENBUS|PdoCreate: FFFFFA800252C850 (IFACE: Highest Revision = 08000008)
17152@1436795188.211600:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA800253CAC0 (PCIIDE\IDEChannel\0)
17152@1436795188.211833:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA8002541AC0 (PCIIDE\IDEChannel\1)
17152@1436795191.230397:xen_platform_log xen platform: XENVBD|DriverEntry:8.0.0.20 (12/6/2015)
17152@1436795191.230631:xen_platform_log xen platform: XENVBD|__DriverParseParameterKey:DriverParameters: 
17152@1436795191.231868:xen_platform_log xen platform: XENDISK|DriverEntry:XENDISK 8.0.0 (20) (12.06.2015)
17152@1436795191.259475:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA8002555040 (PCIIDE\IDEChannel\0)
17152@1436795191.260045:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA8002558040 (PCIIDE\IDEChannel\1)
17152@1436795191.261117:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA8002559040 (PCIIDE\IDEChannel\2)
17152@1436795191.261671:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA8002599040 (PCIIDE\IDEChannel\3)
17152@1436795191.262225:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA80025CE040 (PCIIDE\IDEChannel\4)
17152@1436795191.262803:xen_platform_log xen platform: XENFILT|FdoCreate: FFFFFA80025D9040 (PCIIDE\IDEChannel\5)
17152@1436795191.267891:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA80025F3040 (IDE\DiskQEMU_HARDDISK___________________________2.3.50__\0.0.0)
17152@1436795191.520153:xen_platform_log xen platform: XENFILT|PdoCreate: FFFFFA800260C630 (IDE\CdRomQEMU_QEMU_DVD-ROM_______________________2.3.____\5.0.0)
Bad ram offset 847cb000

--------------010802020406000709060908
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
--------------010802020406000709060908--


From win-pv-devel-bounces@lists.xenproject.org Mon Jul 13 15:16:09 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 13 Jul 2015 15:16:09 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZEfSi-0002z7-JE; Mon, 13 Jul 2015 15:16:08 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1ZEfSh-0002yw-EX
	for win-pv-devel@lists.xenproject.org; Mon, 13 Jul 2015 15:16:07 +0000
Received: from [85.158.137.68] by server-2.bemta-3.messagelabs.com id
	A0/CC-00727-636D3A55; Mon, 13 Jul 2015 15:16:06 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1436800565!25385700!1
X-Originating-IP: [66.111.4.26]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjYgPT4gMTIyNTM=\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14475 invoked from network); 13 Jul 2015 15:16:06 -0000
Received: from out2-smtp.messagingengine.com (HELO
	out2-smtp.messagingengine.com) (66.111.4.26)
	by server-3.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Jul 2015 15:16:06 -0000
Received: from compute6.internal (compute6.nyi.internal [10.202.2.46])
	by mailout.nyi.internal (Postfix) with ESMTP id 4F072203BD
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 13 Jul 2015 11:16:05 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute6.internal (MEProxy); Mon, 13 Jul 2015 11:16:05 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:message-id:mime-version:subject:to:x-sasl-enc
	:x-sasl-enc; s=mesmtp; bh=pj4pq6l0F3Q27Tg/Rhl4kVhcWFA=; b=ljL1ez
	+39qTMKUZ2dRIASI9WZZAP5A32Hm354uL/DDCLEqh+fW8ysssYxtVAjC3LZu05dB
	WmaLMwjGoe7QMEIe+5izX6Bx/6tXRF3YDS4IJ/71cTET9uPpXPdhD5Z5ZpNOkOmc
	ggJmFmopXK3CLMH1x5QFlct3dQpGmaYtLBXw8=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:message-id:mime-version:subject:to:x-sasl-enc
	:x-sasl-enc; s=smtpout; bh=pj4pq6l0F3Q27Tg/Rhl4kVhcWFA=; b=frDWZ
	wJuV1jBQ7sweb5PTWy6N3TuOklr+IR5xpqTcBZ1ddMrf9vtJt5EGI06XoBVLTk5L
	/iSnkuPmoWL2wo46FcoFGlmVMmWeoV3ahUiDU1oNIMz5Lw9z+RtdYSHdb1gBR7c5
	TQ/R/X55IgZxwndQ3AqY5wveoVC1w2OYOqQ/HI=
X-Sasl-enc: +s4oDHH3r7JqUb8jh67WWfw3PIvUalfmyp+9ZJ3senfX 1436800565
Received: from [10.137.2.8] (89-67-247-126.dynamic.chello.pl [89.67.247.126])
	by mail.messagingengine.com (Postfix) with ESMTPA id D7F7968012C
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 13 Jul 2015 11:16:04 -0400 (EDT)
Message-ID: <55A3D62E.7030802@invisiblethingslab.com>
Date: Mon, 13 Jul 2015 17:15:58 +0200
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:31.0) Gecko/20100101 Thunderbird/31.7.0
MIME-Version: 1.0
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Content-Length: 722
Subject: [win-pv-devel] Identifying PV disk devices
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

SGksCgpJcyBpdCBwb3NzaWJsZSB0byBvYnRhaW4gdGhlIGJhY2tlbmQgZGV2aWNlIElEIGZvciBh
IHBhcnRpY3VsYXIgUFYgZGlzawpmcm9tIHVzZXIgbW9kZT8gQ3VycmVudGx5IGl0J3MgaGFyZCB0
byBpZGVudGlmeSB3aGljaCBkaXNrIGlzIHdoaWNoIGlmCnRoZXJlIGFyZSBtdWx0aXBsZSBkaXNr
cyBhdHRhY2hlZC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpbiBkZXZpY2UKcHJvcGVydGllcyBJIGZv
dW5kIGlzIGxvY2F0aW9uLCBidXQgbWF5YmUgdGhlcmUgaXMgYW4gZWFzaWVyIHdheT8KCi0tIApS
YWZhxYIgV29qZHnFgmEKUXViZXMgVG9vbHMgZm9yIFdpbmRvd3MgZGV2ZWxvcGVyCmh0dHBzOi8v
d3d3LnF1YmVzLW9zLm9yZy8KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fCndpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QKd2luLXB2LWRldmVsQGxpc3RzLnhl
bnByb2plY3Qub3JnCmh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4v
bGlzdGluZm8vd2luLXB2LWRldmVs

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 13 15:16:09 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 13 Jul 2015 15:16:09 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZEfSi-0002z7-JE; Mon, 13 Jul 2015 15:16:08 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1ZEfSh-0002yw-EX
	for win-pv-devel@lists.xenproject.org; Mon, 13 Jul 2015 15:16:07 +0000
Received: from [85.158.137.68] by server-2.bemta-3.messagelabs.com id
	A0/CC-00727-636D3A55; Mon, 13 Jul 2015 15:16:06 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1436800565!25385700!1
X-Originating-IP: [66.111.4.26]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjYgPT4gMTIyNTM=\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14475 invoked from network); 13 Jul 2015 15:16:06 -0000
Received: from out2-smtp.messagingengine.com (HELO
	out2-smtp.messagingengine.com) (66.111.4.26)
	by server-3.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Jul 2015 15:16:06 -0000
Received: from compute6.internal (compute6.nyi.internal [10.202.2.46])
	by mailout.nyi.internal (Postfix) with ESMTP id 4F072203BD
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 13 Jul 2015 11:16:05 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute6.internal (MEProxy); Mon, 13 Jul 2015 11:16:05 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:message-id:mime-version:subject:to:x-sasl-enc
	:x-sasl-enc; s=mesmtp; bh=pj4pq6l0F3Q27Tg/Rhl4kVhcWFA=; b=ljL1ez
	+39qTMKUZ2dRIASI9WZZAP5A32Hm354uL/DDCLEqh+fW8ysssYxtVAjC3LZu05dB
	WmaLMwjGoe7QMEIe+5izX6Bx/6tXRF3YDS4IJ/71cTET9uPpXPdhD5Z5ZpNOkOmc
	ggJmFmopXK3CLMH1x5QFlct3dQpGmaYtLBXw8=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:message-id:mime-version:subject:to:x-sasl-enc
	:x-sasl-enc; s=smtpout; bh=pj4pq6l0F3Q27Tg/Rhl4kVhcWFA=; b=frDWZ
	wJuV1jBQ7sweb5PTWy6N3TuOklr+IR5xpqTcBZ1ddMrf9vtJt5EGI06XoBVLTk5L
	/iSnkuPmoWL2wo46FcoFGlmVMmWeoV3ahUiDU1oNIMz5Lw9z+RtdYSHdb1gBR7c5
	TQ/R/X55IgZxwndQ3AqY5wveoVC1w2OYOqQ/HI=
X-Sasl-enc: +s4oDHH3r7JqUb8jh67WWfw3PIvUalfmyp+9ZJ3senfX 1436800565
Received: from [10.137.2.8] (89-67-247-126.dynamic.chello.pl [89.67.247.126])
	by mail.messagingengine.com (Postfix) with ESMTPA id D7F7968012C
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 13 Jul 2015 11:16:04 -0400 (EDT)
Message-ID: <55A3D62E.7030802@invisiblethingslab.com>
Date: Mon, 13 Jul 2015 17:15:58 +0200
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:31.0) Gecko/20100101 Thunderbird/31.7.0
MIME-Version: 1.0
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Content-Length: 722
Subject: [win-pv-devel] Identifying PV disk devices
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

SGksCgpJcyBpdCBwb3NzaWJsZSB0byBvYnRhaW4gdGhlIGJhY2tlbmQgZGV2aWNlIElEIGZvciBh
IHBhcnRpY3VsYXIgUFYgZGlzawpmcm9tIHVzZXIgbW9kZT8gQ3VycmVudGx5IGl0J3MgaGFyZCB0
byBpZGVudGlmeSB3aGljaCBkaXNrIGlzIHdoaWNoIGlmCnRoZXJlIGFyZSBtdWx0aXBsZSBkaXNr
cyBhdHRhY2hlZC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpbiBkZXZpY2UKcHJvcGVydGllcyBJIGZv
dW5kIGlzIGxvY2F0aW9uLCBidXQgbWF5YmUgdGhlcmUgaXMgYW4gZWFzaWVyIHdheT8KCi0tIApS
YWZhxYIgV29qZHnFgmEKUXViZXMgVG9vbHMgZm9yIFdpbmRvd3MgZGV2ZWxvcGVyCmh0dHBzOi8v
d3d3LnF1YmVzLW9zLm9yZy8KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fCndpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QKd2luLXB2LWRldmVsQGxpc3RzLnhl
bnByb2plY3Qub3JnCmh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4v
bGlzdGluZm8vd2luLXB2LWRldmVs

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 13 15:16:28 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 13 Jul 2015 15:16:28 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZEfT2-00031g-L9; Mon, 13 Jul 2015 15:16:28 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=6292261b2=Paul.Durrant@citrix.com>)
	id 1ZEfT1-00031F-Ul
	for win-pv-devel@lists.xenproject.org; Mon, 13 Jul 2015 15:16:28 +0000
Received: from [193.109.254.147] by server-6.bemta-14.messagelabs.com id
	1D/D8-13047-B46D3A55; Mon, 13 Jul 2015 15:16:27 +0000
X-Env-Sender: prvs=6292261b2=Paul.Durrant@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1436800586!31710597!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10101 invoked from network); 13 Jul 2015 15:16:26 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Jul 2015 15:16:26 -0000
X-IronPort-AV: E=Sophos;i="5.15,463,1432598400"; 
   d="scan'208";a="1312562"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Fabio Fantoni <fabio.fantoni@m2r.biz>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Regression: qemu crash at boot after update
	winpv drivers to latest build
Thread-Index: AQHQvXVvOxwZxoj9uEagJo5+yYg7653Zgopw
Date: Mon, 13 Jul 2015 15:16:25 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C047A@AMSPEX01CL02.citrite.net>
References: <55A3C63E.3080004@m2r.biz>
In-Reply-To: <55A3C63E.3080004@m2r.biz>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Regression: qemu crash at boot after update
 winpv drivers to latest build
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Fabio Fantoni
> Sent: 13 July 2015 15:08
> To: win-pv-devel@lists.xenproject.org
> Cc: Paul Durrant
> Subject: [win-pv-devel] Regression: qemu crash at boot after update winpv
> drivers to latest build
> 
> I updated winpv drivers to latest build on windows 7 pro 64 bit domU and
> I had qemu crash at windows boot.
> In attachment qemu log with xen-platform trace enabled.
> Same domU (on same dom0 with same xen, qemu ecc..versions) was
> working
> before but I did only few tests on new xen-unstable build I did friday.
> 

Pretty hard to see how PV drivers are going to crash QEMU unless QEMU has a bug. Have you tried using trad?

  Paul

> If you need other information/tests tell me and I'll post them.
> 
> Thanks for any reply and sorry for my bad english.

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 13 15:16:28 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 13 Jul 2015 15:16:28 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZEfT2-00031g-L9; Mon, 13 Jul 2015 15:16:28 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=6292261b2=Paul.Durrant@citrix.com>)
	id 1ZEfT1-00031F-Ul
	for win-pv-devel@lists.xenproject.org; Mon, 13 Jul 2015 15:16:28 +0000
Received: from [193.109.254.147] by server-6.bemta-14.messagelabs.com id
	1D/D8-13047-B46D3A55; Mon, 13 Jul 2015 15:16:27 +0000
X-Env-Sender: prvs=6292261b2=Paul.Durrant@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1436800586!31710597!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10101 invoked from network); 13 Jul 2015 15:16:26 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Jul 2015 15:16:26 -0000
X-IronPort-AV: E=Sophos;i="5.15,463,1432598400"; 
   d="scan'208";a="1312562"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Fabio Fantoni <fabio.fantoni@m2r.biz>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Regression: qemu crash at boot after update
	winpv drivers to latest build
Thread-Index: AQHQvXVvOxwZxoj9uEagJo5+yYg7653Zgopw
Date: Mon, 13 Jul 2015 15:16:25 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C047A@AMSPEX01CL02.citrite.net>
References: <55A3C63E.3080004@m2r.biz>
In-Reply-To: <55A3C63E.3080004@m2r.biz>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Regression: qemu crash at boot after update
 winpv drivers to latest build
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Fabio Fantoni
> Sent: 13 July 2015 15:08
> To: win-pv-devel@lists.xenproject.org
> Cc: Paul Durrant
> Subject: [win-pv-devel] Regression: qemu crash at boot after update winpv
> drivers to latest build
> 
> I updated winpv drivers to latest build on windows 7 pro 64 bit domU and
> I had qemu crash at windows boot.
> In attachment qemu log with xen-platform trace enabled.
> Same domU (on same dom0 with same xen, qemu ecc..versions) was
> working
> before but I did only few tests on new xen-unstable build I did friday.
> 

Pretty hard to see how PV drivers are going to crash QEMU unless QEMU has a bug. Have you tried using trad?

  Paul

> If you need other information/tests tell me and I'll post them.
> 
> Thanks for any reply and sorry for my bad english.

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 13 15:23:50 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 13 Jul 2015 15:23:50 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZEfaA-0003gy-HA; Mon, 13 Jul 2015 15:23:50 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=6292261b2=Paul.Durrant@citrix.com>)
	id 1ZEfa9-0003gm-9M
	for win-pv-devel@lists.xenproject.org; Mon, 13 Jul 2015 15:23:49 +0000
Received: from [85.158.139.211] by server-12.bemta-5.messagelabs.com id
	B8/8F-00468-408D3A55; Mon, 13 Jul 2015 15:23:48 +0000
X-Env-Sender: prvs=6292261b2=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-206.messagelabs.com!1436801027!17461372!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10492 invoked from network); 13 Jul 2015 15:23:47 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-15.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Jul 2015 15:23:47 -0000
X-IronPort-AV: E=Sophos;i="5.15,463,1432598400"; 
   d="scan'208";a="1312734"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Identifying PV disk devices
Thread-Index: AQHQvX7+JfQ1oOS45kqtrAwAwidXVJ3Zg6WQ
Date: Mon, 13 Jul 2015 15:23:46 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C05D2@AMSPEX01CL02.citrite.net>
References: <55A3D62E.7030802@invisiblethingslab.com>
In-Reply-To: <55A3D62E.7030802@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Identifying PV disk devices
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNl
c0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0NCj4gYm91bmNlc0Bs
aXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGENCj4gU2VudDog
MTMgSnVseSAyMDE1IDE2OjE2DQo+IFRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5v
cmcNCj4gU3ViamVjdDogW3dpbi1wdi1kZXZlbF0gSWRlbnRpZnlpbmcgUFYgZGlzayBkZXZpY2Vz
DQo+IA0KPiBIaSwNCj4gDQo+IElzIGl0IHBvc3NpYmxlIHRvIG9idGFpbiB0aGUgYmFja2VuZCBk
ZXZpY2UgSUQgZm9yIGEgcGFydGljdWxhciBQViBkaXNrDQo+IGZyb20gdXNlciBtb2RlPyBDdXJy
ZW50bHkgaXQncyBoYXJkIHRvIGlkZW50aWZ5IHdoaWNoIGRpc2sgaXMgd2hpY2ggaWYNCj4gdGhl
cmUgYXJlIG11bHRpcGxlIGRpc2tzIGF0dGFjaGVkLiBUaGUgb25seSBkaWZmZXJlbmNlIGluIGRl
dmljZQ0KPiBwcm9wZXJ0aWVzIEkgZm91bmQgaXMgbG9jYXRpb24sIGJ1dCBtYXliZSB0aGVyZSBp
cyBhbiBlYXNpZXIgd2F5Pw0KPiANCg0KV2hhdCBkbyB5b3UgbWVhbiBieSBkZXZpY2UgaWQ/IFRo
ZSBsb2NhdGlvbiBpcyBwcmV0dHkgbXVjaCB0aGUgbWFpbiBkaXN0aW5ndWlzaGluZyBmZWF0dXJl
LiBUaGUgZHJpdmVyIGlzIGNhcGFibGUgb2YgdGFraW5nIHBhZ2UgODAgYW5kIDgzIGRhdGEgZnJv
bSB4ZW5zdG9yZSBpZiB0aGUgdG9vbHN0YWNrIHB1dHMgc29tZXRoaW5nIHRoZXJlLCBidXQgeGwg
ZG9lc24ndCBkbyB0aGF0IEFGQUlLLg0KDQogIFBhdWwNCg0KPiAtLQ0KPiBSYWZhxYIgV29qZHnF
gmENCj4gUXViZXMgVG9vbHMgZm9yIFdpbmRvd3MgZGV2ZWxvcGVyDQo+IGh0dHBzOi8vd3d3LnF1
YmVzLW9zLm9yZy8NCj4gDQo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fDQo+IHdpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QNCj4gd2luLXB2LWRldmVsQGxp
c3RzLnhlbnByb2plY3Qub3JnDQo+IGh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmlu
L21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRldmVsDQpfX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1wdi1k
ZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dp
LWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 13 15:23:50 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 13 Jul 2015 15:23:50 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZEfaA-0003gy-HA; Mon, 13 Jul 2015 15:23:50 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=6292261b2=Paul.Durrant@citrix.com>)
	id 1ZEfa9-0003gm-9M
	for win-pv-devel@lists.xenproject.org; Mon, 13 Jul 2015 15:23:49 +0000
Received: from [85.158.139.211] by server-12.bemta-5.messagelabs.com id
	B8/8F-00468-408D3A55; Mon, 13 Jul 2015 15:23:48 +0000
X-Env-Sender: prvs=6292261b2=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-206.messagelabs.com!1436801027!17461372!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10492 invoked from network); 13 Jul 2015 15:23:47 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-15.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Jul 2015 15:23:47 -0000
X-IronPort-AV: E=Sophos;i="5.15,463,1432598400"; 
   d="scan'208";a="1312734"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Identifying PV disk devices
Thread-Index: AQHQvX7+JfQ1oOS45kqtrAwAwidXVJ3Zg6WQ
Date: Mon, 13 Jul 2015 15:23:46 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C05D2@AMSPEX01CL02.citrite.net>
References: <55A3D62E.7030802@invisiblethingslab.com>
In-Reply-To: <55A3D62E.7030802@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Identifying PV disk devices
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNl
c0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0NCj4gYm91bmNlc0Bs
aXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGENCj4gU2VudDog
MTMgSnVseSAyMDE1IDE2OjE2DQo+IFRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5v
cmcNCj4gU3ViamVjdDogW3dpbi1wdi1kZXZlbF0gSWRlbnRpZnlpbmcgUFYgZGlzayBkZXZpY2Vz
DQo+IA0KPiBIaSwNCj4gDQo+IElzIGl0IHBvc3NpYmxlIHRvIG9idGFpbiB0aGUgYmFja2VuZCBk
ZXZpY2UgSUQgZm9yIGEgcGFydGljdWxhciBQViBkaXNrDQo+IGZyb20gdXNlciBtb2RlPyBDdXJy
ZW50bHkgaXQncyBoYXJkIHRvIGlkZW50aWZ5IHdoaWNoIGRpc2sgaXMgd2hpY2ggaWYNCj4gdGhl
cmUgYXJlIG11bHRpcGxlIGRpc2tzIGF0dGFjaGVkLiBUaGUgb25seSBkaWZmZXJlbmNlIGluIGRl
dmljZQ0KPiBwcm9wZXJ0aWVzIEkgZm91bmQgaXMgbG9jYXRpb24sIGJ1dCBtYXliZSB0aGVyZSBp
cyBhbiBlYXNpZXIgd2F5Pw0KPiANCg0KV2hhdCBkbyB5b3UgbWVhbiBieSBkZXZpY2UgaWQ/IFRo
ZSBsb2NhdGlvbiBpcyBwcmV0dHkgbXVjaCB0aGUgbWFpbiBkaXN0aW5ndWlzaGluZyBmZWF0dXJl
LiBUaGUgZHJpdmVyIGlzIGNhcGFibGUgb2YgdGFraW5nIHBhZ2UgODAgYW5kIDgzIGRhdGEgZnJv
bSB4ZW5zdG9yZSBpZiB0aGUgdG9vbHN0YWNrIHB1dHMgc29tZXRoaW5nIHRoZXJlLCBidXQgeGwg
ZG9lc24ndCBkbyB0aGF0IEFGQUlLLg0KDQogIFBhdWwNCg0KPiAtLQ0KPiBSYWZhxYIgV29qZHnF
gmENCj4gUXViZXMgVG9vbHMgZm9yIFdpbmRvd3MgZGV2ZWxvcGVyDQo+IGh0dHBzOi8vd3d3LnF1
YmVzLW9zLm9yZy8NCj4gDQo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fDQo+IHdpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QNCj4gd2luLXB2LWRldmVsQGxp
c3RzLnhlbnByb2plY3Qub3JnDQo+IGh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmlu
L21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRldmVsDQpfX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1wdi1k
ZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dp
LWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 13 15:35:24 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 13 Jul 2015 15:35:24 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZEflM-0004Y1-3R; Mon, 13 Jul 2015 15:35:24 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1ZEflL-0004Xt-ET
	for win-pv-devel@lists.xenproject.org; Mon, 13 Jul 2015 15:35:23 +0000
Received: from [85.158.137.68] by server-12.bemta-3.messagelabs.com id
	31/18-02952-ABAD3A55; Mon, 13 Jul 2015 15:35:22 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-6.tower-31.messagelabs.com!1436801718!20919240!1
X-Originating-IP: [66.111.4.26]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjYgPT4gMTIyNTM=\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20255 invoked from network); 13 Jul 2015 15:35:22 -0000
Received: from out2-smtp.messagingengine.com (HELO
	out2-smtp.messagingengine.com) (66.111.4.26)
	by server-6.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Jul 2015 15:35:22 -0000
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
	by mailout.nyi.internal (Postfix) with ESMTP id 428132074E
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 13 Jul 2015 11:35:18 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute2.internal (MEProxy); Mon, 13 Jul 2015 11:35:18 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=zWaeFBGUaasKIpxS
	xfr1iU4zUoo=; b=EX3UXDIHUXF7DXhrqqM/2HG4QtVPhTwVVzafIAzsLzfUKTGb
	KQTvpa/odhTml/GUUd2Igg6oZoajPfqkfNH0w0JY5bPyStYU6HZ/W93nqIufbzwQ
	aRVabU8nvil7RvScQQSbRbEoR0N+FpJjhN9CkEMBfWH1FF0XLiPI9V31p4Q=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=zWaeFBGUaasKIpx
	Sxfr1iU4zUoo=; b=XbaNW7y95+DmxYIEJbk515Hm8AZs6TQkQiAU0EF1+MG6kwC
	4SrCD+ejblavXGTMAXIeqD8gHPH3sIXrR84HfYEkAoxXb7zGdnDy+7/7ClX2U9uC
	7NEfqbMK/eSGqPnIZemvk8h8+XKPICldllczpnRgA8y0R6becLIusDYgSDkY=
X-Sasl-enc: H8ckvbYsQ3H0Su1Cbb9zbIcGzSB+8vhr5fcrrV0Xkn9V 1436801717
Received: from [10.137.2.8] (89-67-247-126.dynamic.chello.pl [89.67.247.126])
	by mail.messagingengine.com (Postfix) with ESMTPA id A4789C0001F;
	Mon, 13 Jul 2015 11:35:17 -0400 (EDT)
Message-ID: <55A3DAB1.1020105@invisiblethingslab.com>
Date: Mon, 13 Jul 2015 17:35:13 +0200
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:31.0) Gecko/20100101 Thunderbird/31.7.0
MIME-Version: 1.0
To: Paul Durrant <Paul.Durrant@citrix.com>, 
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <55A3D62E.7030802@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F4C05D2@AMSPEX01CL02.citrite.net>
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C05D2@AMSPEX01CL02.citrite.net>
Content-Length: 1990
Subject: Re: [win-pv-devel] Identifying PV disk devices
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

T24gMDcvMTMvMjAxNSAwNToyMyBQTSwgUGF1bCBEdXJyYW50IHdyb3RlOgo+PiAtLS0tLU9yaWdp
bmFsIE1lc3NhZ2UtLS0tLQo+PiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5w
cm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0KPj4gYm91bmNlc0BsaXN0cy54ZW5wcm9q
ZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGEKPj4gU2VudDogMTMgSnVseSAyMDE1
IDE2OjE2Cj4+IFRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKPj4gU3ViamVj
dDogW3dpbi1wdi1kZXZlbF0gSWRlbnRpZnlpbmcgUFYgZGlzayBkZXZpY2VzCj4+Cj4+IEhpLAo+
Pgo+PiBJcyBpdCBwb3NzaWJsZSB0byBvYnRhaW4gdGhlIGJhY2tlbmQgZGV2aWNlIElEIGZvciBh
IHBhcnRpY3VsYXIgUFYgZGlzawo+PiBmcm9tIHVzZXIgbW9kZT8gQ3VycmVudGx5IGl0J3MgaGFy
ZCB0byBpZGVudGlmeSB3aGljaCBkaXNrIGlzIHdoaWNoIGlmCj4+IHRoZXJlIGFyZSBtdWx0aXBs
ZSBkaXNrcyBhdHRhY2hlZC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpbiBkZXZpY2UKPj4gcHJvcGVy
dGllcyBJIGZvdW5kIGlzIGxvY2F0aW9uLCBidXQgbWF5YmUgdGhlcmUgaXMgYW4gZWFzaWVyIHdh
eT8KPj4KPiAKPiBXaGF0IGRvIHlvdSBtZWFuIGJ5IGRldmljZSBpZD8gVGhlIGxvY2F0aW9uIGlz
IHByZXR0eSBtdWNoIHRoZSBtYWluIGRpc3Rpbmd1aXNoaW5nIGZlYXR1cmUuIFRoZSBkcml2ZXIg
aXMgY2FwYWJsZSBvZiB0YWtpbmcgcGFnZSA4MCBhbmQgODMgZGF0YSBmcm9tIHhlbnN0b3JlIGlm
IHRoZSB0b29sc3RhY2sgcHV0cyBzb21ldGhpbmcgdGhlcmUsIGJ1dCB4bCBkb2Vzbid0IGRvIHRo
YXQgQUZBSUsuCj4gCkkgbWVhbiB0aGUgSUQgaW4geGVuc3RvcmUgcGF0aCBsaWtlIC9sb2NhbC9k
b21haW4vMC9iYWNrZW5kL3ZiZC85LzUxNzI4LgpPdXIgdG9vbHN0YWNrIGFsd2F5cyBhc3NpZ25z
IHRoZSBzYW1lIGJhY2tlbmQgSURzIGZvciBwYXJ0aWN1bGFyIEhWTQpkaXNrcyAocm9vdCBkaXNr
LCBwcml2YXRlIHN0b3JhZ2UgaWYgdGVtcGxhdGVzIGFyZSB1c2VkIGV0YykuIEknbQpsb29raW5n
IGZvciBhIHdheSB0byBpZGVudGlmeSB3aGljaCBQViBkZXZpY2UgY29ycmVzcG9uZHMgdG8gd2hp
Y2ggSUQgc28Kb3VyIGd1ZXN0IHRvb2xzIGNhbiBmb3IgZXhhbXBsZSBpbml0aWFsaXplL2Zvcm1h
dCB0aGUgY29ycmVjdCBvbmUuCgotLSAKUmFmYcWCIFdvamR5xYJhClF1YmVzIFRvb2xzIGZvciBX
aW5kb3dzIGRldmVsb3BlcgpodHRwczovL3d3dy5xdWJlcy1vcy5vcmcvCgpfX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYtZGV2ZWwgbWFpbGluZyBs
aXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwOi8vbGlzdHMueGVucHJv
amVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 13 15:35:24 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 13 Jul 2015 15:35:24 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZEflM-0004Y1-3R; Mon, 13 Jul 2015 15:35:24 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1ZEflL-0004Xt-ET
	for win-pv-devel@lists.xenproject.org; Mon, 13 Jul 2015 15:35:23 +0000
Received: from [85.158.137.68] by server-12.bemta-3.messagelabs.com id
	31/18-02952-ABAD3A55; Mon, 13 Jul 2015 15:35:22 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-6.tower-31.messagelabs.com!1436801718!20919240!1
X-Originating-IP: [66.111.4.26]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjYgPT4gMTIyNTM=\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20255 invoked from network); 13 Jul 2015 15:35:22 -0000
Received: from out2-smtp.messagingengine.com (HELO
	out2-smtp.messagingengine.com) (66.111.4.26)
	by server-6.tower-31.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Jul 2015 15:35:22 -0000
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
	by mailout.nyi.internal (Postfix) with ESMTP id 428132074E
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 13 Jul 2015 11:35:18 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute2.internal (MEProxy); Mon, 13 Jul 2015 11:35:18 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=zWaeFBGUaasKIpxS
	xfr1iU4zUoo=; b=EX3UXDIHUXF7DXhrqqM/2HG4QtVPhTwVVzafIAzsLzfUKTGb
	KQTvpa/odhTml/GUUd2Igg6oZoajPfqkfNH0w0JY5bPyStYU6HZ/W93nqIufbzwQ
	aRVabU8nvil7RvScQQSbRbEoR0N+FpJjhN9CkEMBfWH1FF0XLiPI9V31p4Q=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=zWaeFBGUaasKIpx
	Sxfr1iU4zUoo=; b=XbaNW7y95+DmxYIEJbk515Hm8AZs6TQkQiAU0EF1+MG6kwC
	4SrCD+ejblavXGTMAXIeqD8gHPH3sIXrR84HfYEkAoxXb7zGdnDy+7/7ClX2U9uC
	7NEfqbMK/eSGqPnIZemvk8h8+XKPICldllczpnRgA8y0R6becLIusDYgSDkY=
X-Sasl-enc: H8ckvbYsQ3H0Su1Cbb9zbIcGzSB+8vhr5fcrrV0Xkn9V 1436801717
Received: from [10.137.2.8] (89-67-247-126.dynamic.chello.pl [89.67.247.126])
	by mail.messagingengine.com (Postfix) with ESMTPA id A4789C0001F;
	Mon, 13 Jul 2015 11:35:17 -0400 (EDT)
Message-ID: <55A3DAB1.1020105@invisiblethingslab.com>
Date: Mon, 13 Jul 2015 17:35:13 +0200
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:31.0) Gecko/20100101 Thunderbird/31.7.0
MIME-Version: 1.0
To: Paul Durrant <Paul.Durrant@citrix.com>, 
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <55A3D62E.7030802@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F4C05D2@AMSPEX01CL02.citrite.net>
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C05D2@AMSPEX01CL02.citrite.net>
Content-Length: 1990
Subject: Re: [win-pv-devel] Identifying PV disk devices
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

T24gMDcvMTMvMjAxNSAwNToyMyBQTSwgUGF1bCBEdXJyYW50IHdyb3RlOgo+PiAtLS0tLU9yaWdp
bmFsIE1lc3NhZ2UtLS0tLQo+PiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5w
cm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0KPj4gYm91bmNlc0BsaXN0cy54ZW5wcm9q
ZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGEKPj4gU2VudDogMTMgSnVseSAyMDE1
IDE2OjE2Cj4+IFRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKPj4gU3ViamVj
dDogW3dpbi1wdi1kZXZlbF0gSWRlbnRpZnlpbmcgUFYgZGlzayBkZXZpY2VzCj4+Cj4+IEhpLAo+
Pgo+PiBJcyBpdCBwb3NzaWJsZSB0byBvYnRhaW4gdGhlIGJhY2tlbmQgZGV2aWNlIElEIGZvciBh
IHBhcnRpY3VsYXIgUFYgZGlzawo+PiBmcm9tIHVzZXIgbW9kZT8gQ3VycmVudGx5IGl0J3MgaGFy
ZCB0byBpZGVudGlmeSB3aGljaCBkaXNrIGlzIHdoaWNoIGlmCj4+IHRoZXJlIGFyZSBtdWx0aXBs
ZSBkaXNrcyBhdHRhY2hlZC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpbiBkZXZpY2UKPj4gcHJvcGVy
dGllcyBJIGZvdW5kIGlzIGxvY2F0aW9uLCBidXQgbWF5YmUgdGhlcmUgaXMgYW4gZWFzaWVyIHdh
eT8KPj4KPiAKPiBXaGF0IGRvIHlvdSBtZWFuIGJ5IGRldmljZSBpZD8gVGhlIGxvY2F0aW9uIGlz
IHByZXR0eSBtdWNoIHRoZSBtYWluIGRpc3Rpbmd1aXNoaW5nIGZlYXR1cmUuIFRoZSBkcml2ZXIg
aXMgY2FwYWJsZSBvZiB0YWtpbmcgcGFnZSA4MCBhbmQgODMgZGF0YSBmcm9tIHhlbnN0b3JlIGlm
IHRoZSB0b29sc3RhY2sgcHV0cyBzb21ldGhpbmcgdGhlcmUsIGJ1dCB4bCBkb2Vzbid0IGRvIHRo
YXQgQUZBSUsuCj4gCkkgbWVhbiB0aGUgSUQgaW4geGVuc3RvcmUgcGF0aCBsaWtlIC9sb2NhbC9k
b21haW4vMC9iYWNrZW5kL3ZiZC85LzUxNzI4LgpPdXIgdG9vbHN0YWNrIGFsd2F5cyBhc3NpZ25z
IHRoZSBzYW1lIGJhY2tlbmQgSURzIGZvciBwYXJ0aWN1bGFyIEhWTQpkaXNrcyAocm9vdCBkaXNr
LCBwcml2YXRlIHN0b3JhZ2UgaWYgdGVtcGxhdGVzIGFyZSB1c2VkIGV0YykuIEknbQpsb29raW5n
IGZvciBhIHdheSB0byBpZGVudGlmeSB3aGljaCBQViBkZXZpY2UgY29ycmVzcG9uZHMgdG8gd2hp
Y2ggSUQgc28Kb3VyIGd1ZXN0IHRvb2xzIGNhbiBmb3IgZXhhbXBsZSBpbml0aWFsaXplL2Zvcm1h
dCB0aGUgY29ycmVjdCBvbmUuCgotLSAKUmFmYcWCIFdvamR5xYJhClF1YmVzIFRvb2xzIGZvciBX
aW5kb3dzIGRldmVsb3BlcgpodHRwczovL3d3dy5xdWJlcy1vcy5vcmcvCgpfX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYtZGV2ZWwgbWFpbGluZyBs
aXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwOi8vbGlzdHMueGVucHJv
amVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 13 15:36:22 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 13 Jul 2015 15:36:22 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZEfmI-0004d9-Iy; Mon, 13 Jul 2015 15:36:22 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=6292724cb=owen.smith@citrix.com>)
	id 1ZEfmH-0004co-7I
	for win-pv-devel@lists.xenproject.org; Mon, 13 Jul 2015 15:36:21 +0000
Received: from [193.109.254.147] by server-14.bemta-14.messagelabs.com id
	9B/34-21300-4FAD3A55; Mon, 13 Jul 2015 15:36:20 +0000
X-Env-Sender: prvs=6292724cb=owen.smith@citrix.com
X-Msg-Ref: server-16.tower-27.messagelabs.com!1436801779!24101340!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7142 invoked from network); 13 Jul 2015 15:36:19 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-16.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Jul 2015 15:36:19 -0000
X-IronPort-AV: E=Sophos;i="5.15,463,1432598400"; 
   d="scan'208";a="1312973"
From: Owen Smith <owen.smith@citrix.com>
To: Paul Durrant <Paul.Durrant@citrix.com>, =?utf-8?B?UmFmYcWCIFdvamR5xYJh?=
	<omeg@invisiblethingslab.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Identifying PV disk devices
Thread-Index: AQHQvX7+xncQdRQ4NEWnMFe6dOPOZ53ZY0wAgAAiUhA=
Date: Mon, 13 Jul 2015 15:36:19 +0000
Message-ID: <6624BC057AF4E240B6D036F5CC505B1219A20FCF@AMSPEX01CL02.citrite.net>
References: <55A3D62E.7030802@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F4C05D2@AMSPEX01CL02.citrite.net>
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C05D2@AMSPEX01CL02.citrite.net>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Identifying PV disk devices
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

TG9jYXRpb25JbmZvcm1hdGlvbiBpbmRpY2F0ZXMgdGhlIFRhcmdldElkIGFzIHRoZSBtaWRkbGUg
MiBjaGFyYWN0ZXJzLiANClRoZSB4ZW5zdG9yZSBiYWNrZW5kIGRldmljZSBJRCBjb250YWlucyBh
IGZvcm1hdHRlZCB2YXJpYW50IG9mIHRoaXMsIGFzIGl0IGVuY29kZXMNCmFkZGl0aW9uYWwgaW5m
b3JtYXRpb24gKHNlZSB4ZW52YmQvZmRvLmMgX19QYXJzZVZiZCgpIEA0MjYpDQoNClRoZSBQYWdl
IDgzIGRhdGEgd2lsbCBhcHBlbmQgdGhlIHZkaS11dWlkIHRvIGFueSBvdGhlciBkYXRhIChmcm9t
IHhlbnN0b3JlIG9yIA0Kc3ludGhlc2l6ZWQpIGFzIGEgdmVuZG9yIHNwZWNpZmljIGFzY2lpIGZp
ZWxkLg0KDQo+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+IEZyb206IHdpbi1wdi1kZXZl
bC1ib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2LWRldmVsLQ0KPiBi
b3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnXSBPbiBCZWhhbGYgT2YgUGF1bCBEdXJyYW50DQo+
IFNlbnQ6IDEzIEp1bHkgMjAxNSAxNjoyNA0KPiBUbzogUmFmYcWCIFdvamR5xYJhOyB3aW4tcHYt
ZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcNCj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxd
IElkZW50aWZ5aW5nIFBWIGRpc2sgZGV2aWNlcw0KPiANCj4gPiAtLS0tLU9yaWdpbmFsIE1lc3Nh
Z2UtLS0tLQ0KPiA+IEZyb206IHdpbi1wdi1kZXZlbC1ib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qu
b3JnIFttYWlsdG86d2luLXB2LWRldmVsLQ0KPiA+IGJvdW5jZXNAbGlzdHMueGVucHJvamVjdC5v
cmddIE9uIEJlaGFsZiBPZiBSYWZhbCBXb2pkeWxhDQo+ID4gU2VudDogMTMgSnVseSAyMDE1IDE2
OjE2DQo+ID4gVG86IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZw0KPiA+IFN1Ympl
Y3Q6IFt3aW4tcHYtZGV2ZWxdIElkZW50aWZ5aW5nIFBWIGRpc2sgZGV2aWNlcw0KPiA+DQo+ID4g
SGksDQo+ID4NCj4gPiBJcyBpdCBwb3NzaWJsZSB0byBvYnRhaW4gdGhlIGJhY2tlbmQgZGV2aWNl
IElEIGZvciBhIHBhcnRpY3VsYXIgUFYNCj4gPiBkaXNrIGZyb20gdXNlciBtb2RlPyBDdXJyZW50
bHkgaXQncyBoYXJkIHRvIGlkZW50aWZ5IHdoaWNoIGRpc2sgaXMNCj4gPiB3aGljaCBpZiB0aGVy
ZSBhcmUgbXVsdGlwbGUgZGlza3MgYXR0YWNoZWQuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaW4NCj4g
PiBkZXZpY2UgcHJvcGVydGllcyBJIGZvdW5kIGlzIGxvY2F0aW9uLCBidXQgbWF5YmUgdGhlcmUg
aXMgYW4gZWFzaWVyIHdheT8NCj4gPg0KPiANCj4gV2hhdCBkbyB5b3UgbWVhbiBieSBkZXZpY2Ug
aWQ/IFRoZSBsb2NhdGlvbiBpcyBwcmV0dHkgbXVjaCB0aGUgbWFpbg0KPiBkaXN0aW5ndWlzaGlu
ZyBmZWF0dXJlLiBUaGUgZHJpdmVyIGlzIGNhcGFibGUgb2YgdGFraW5nIHBhZ2UgODAgYW5kIDgz
IGRhdGENCj4gZnJvbSB4ZW5zdG9yZSBpZiB0aGUgdG9vbHN0YWNrIHB1dHMgc29tZXRoaW5nIHRo
ZXJlLCBidXQgeGwgZG9lc24ndCBkbyB0aGF0DQo+IEFGQUlLLg0KPiANCj4gICBQYXVsDQo+IA0K
PiA+IC0tDQo+ID4gUmFmYcWCIFdvamR5xYJhDQo+ID4gUXViZXMgVG9vbHMgZm9yIFdpbmRvd3Mg
ZGV2ZWxvcGVyDQo+ID4gaHR0cHM6Ly93d3cucXViZXMtb3Mub3JnLw0KPiA+DQo+ID4gX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCj4gPiB3aW4tcHYtZGV2
ZWwgbWFpbGluZyBsaXN0DQo+ID4gd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+
ID4gaHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby93
aW4tcHYtZGV2ZWwNCj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX18NCj4gd2luLXB2LWRldmVsIG1haWxpbmcgbGlzdA0KPiB3aW4tcHYtZGV2ZWxAbGlzdHMu
eGVucHJvamVjdC5vcmcNCj4gaHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFp
bG1hbi9saXN0aW5mby93aW4tcHYtZGV2ZWwNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fCndpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QKd2luLXB2LWRldmVs
QGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmlu
L21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRldmVs

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 13 15:36:22 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 13 Jul 2015 15:36:22 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZEfmI-0004d9-Iy; Mon, 13 Jul 2015 15:36:22 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=6292724cb=owen.smith@citrix.com>)
	id 1ZEfmH-0004co-7I
	for win-pv-devel@lists.xenproject.org; Mon, 13 Jul 2015 15:36:21 +0000
Received: from [193.109.254.147] by server-14.bemta-14.messagelabs.com id
	9B/34-21300-4FAD3A55; Mon, 13 Jul 2015 15:36:20 +0000
X-Env-Sender: prvs=6292724cb=owen.smith@citrix.com
X-Msg-Ref: server-16.tower-27.messagelabs.com!1436801779!24101340!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7142 invoked from network); 13 Jul 2015 15:36:19 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-16.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Jul 2015 15:36:19 -0000
X-IronPort-AV: E=Sophos;i="5.15,463,1432598400"; 
   d="scan'208";a="1312973"
From: Owen Smith <owen.smith@citrix.com>
To: Paul Durrant <Paul.Durrant@citrix.com>, =?utf-8?B?UmFmYcWCIFdvamR5xYJh?=
	<omeg@invisiblethingslab.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Identifying PV disk devices
Thread-Index: AQHQvX7+xncQdRQ4NEWnMFe6dOPOZ53ZY0wAgAAiUhA=
Date: Mon, 13 Jul 2015 15:36:19 +0000
Message-ID: <6624BC057AF4E240B6D036F5CC505B1219A20FCF@AMSPEX01CL02.citrite.net>
References: <55A3D62E.7030802@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F4C05D2@AMSPEX01CL02.citrite.net>
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C05D2@AMSPEX01CL02.citrite.net>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Identifying PV disk devices
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

TG9jYXRpb25JbmZvcm1hdGlvbiBpbmRpY2F0ZXMgdGhlIFRhcmdldElkIGFzIHRoZSBtaWRkbGUg
MiBjaGFyYWN0ZXJzLiANClRoZSB4ZW5zdG9yZSBiYWNrZW5kIGRldmljZSBJRCBjb250YWlucyBh
IGZvcm1hdHRlZCB2YXJpYW50IG9mIHRoaXMsIGFzIGl0IGVuY29kZXMNCmFkZGl0aW9uYWwgaW5m
b3JtYXRpb24gKHNlZSB4ZW52YmQvZmRvLmMgX19QYXJzZVZiZCgpIEA0MjYpDQoNClRoZSBQYWdl
IDgzIGRhdGEgd2lsbCBhcHBlbmQgdGhlIHZkaS11dWlkIHRvIGFueSBvdGhlciBkYXRhIChmcm9t
IHhlbnN0b3JlIG9yIA0Kc3ludGhlc2l6ZWQpIGFzIGEgdmVuZG9yIHNwZWNpZmljIGFzY2lpIGZp
ZWxkLg0KDQo+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+IEZyb206IHdpbi1wdi1kZXZl
bC1ib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2LWRldmVsLQ0KPiBi
b3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnXSBPbiBCZWhhbGYgT2YgUGF1bCBEdXJyYW50DQo+
IFNlbnQ6IDEzIEp1bHkgMjAxNSAxNjoyNA0KPiBUbzogUmFmYcWCIFdvamR5xYJhOyB3aW4tcHYt
ZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcNCj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxd
IElkZW50aWZ5aW5nIFBWIGRpc2sgZGV2aWNlcw0KPiANCj4gPiAtLS0tLU9yaWdpbmFsIE1lc3Nh
Z2UtLS0tLQ0KPiA+IEZyb206IHdpbi1wdi1kZXZlbC1ib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qu
b3JnIFttYWlsdG86d2luLXB2LWRldmVsLQ0KPiA+IGJvdW5jZXNAbGlzdHMueGVucHJvamVjdC5v
cmddIE9uIEJlaGFsZiBPZiBSYWZhbCBXb2pkeWxhDQo+ID4gU2VudDogMTMgSnVseSAyMDE1IDE2
OjE2DQo+ID4gVG86IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZw0KPiA+IFN1Ympl
Y3Q6IFt3aW4tcHYtZGV2ZWxdIElkZW50aWZ5aW5nIFBWIGRpc2sgZGV2aWNlcw0KPiA+DQo+ID4g
SGksDQo+ID4NCj4gPiBJcyBpdCBwb3NzaWJsZSB0byBvYnRhaW4gdGhlIGJhY2tlbmQgZGV2aWNl
IElEIGZvciBhIHBhcnRpY3VsYXIgUFYNCj4gPiBkaXNrIGZyb20gdXNlciBtb2RlPyBDdXJyZW50
bHkgaXQncyBoYXJkIHRvIGlkZW50aWZ5IHdoaWNoIGRpc2sgaXMNCj4gPiB3aGljaCBpZiB0aGVy
ZSBhcmUgbXVsdGlwbGUgZGlza3MgYXR0YWNoZWQuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaW4NCj4g
PiBkZXZpY2UgcHJvcGVydGllcyBJIGZvdW5kIGlzIGxvY2F0aW9uLCBidXQgbWF5YmUgdGhlcmUg
aXMgYW4gZWFzaWVyIHdheT8NCj4gPg0KPiANCj4gV2hhdCBkbyB5b3UgbWVhbiBieSBkZXZpY2Ug
aWQ/IFRoZSBsb2NhdGlvbiBpcyBwcmV0dHkgbXVjaCB0aGUgbWFpbg0KPiBkaXN0aW5ndWlzaGlu
ZyBmZWF0dXJlLiBUaGUgZHJpdmVyIGlzIGNhcGFibGUgb2YgdGFraW5nIHBhZ2UgODAgYW5kIDgz
IGRhdGENCj4gZnJvbSB4ZW5zdG9yZSBpZiB0aGUgdG9vbHN0YWNrIHB1dHMgc29tZXRoaW5nIHRo
ZXJlLCBidXQgeGwgZG9lc24ndCBkbyB0aGF0DQo+IEFGQUlLLg0KPiANCj4gICBQYXVsDQo+IA0K
PiA+IC0tDQo+ID4gUmFmYcWCIFdvamR5xYJhDQo+ID4gUXViZXMgVG9vbHMgZm9yIFdpbmRvd3Mg
ZGV2ZWxvcGVyDQo+ID4gaHR0cHM6Ly93d3cucXViZXMtb3Mub3JnLw0KPiA+DQo+ID4gX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCj4gPiB3aW4tcHYtZGV2
ZWwgbWFpbGluZyBsaXN0DQo+ID4gd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+
ID4gaHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby93
aW4tcHYtZGV2ZWwNCj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX18NCj4gd2luLXB2LWRldmVsIG1haWxpbmcgbGlzdA0KPiB3aW4tcHYtZGV2ZWxAbGlzdHMu
eGVucHJvamVjdC5vcmcNCj4gaHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFp
bG1hbi9saXN0aW5mby93aW4tcHYtZGV2ZWwNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fCndpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QKd2luLXB2LWRldmVs
QGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmlu
L21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRldmVs

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 13 15:54:28 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 13 Jul 2015 15:54:28 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZEg3o-0006Ea-18; Mon, 13 Jul 2015 15:54:28 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1ZEg3n-0006EC-0N
	for win-pv-devel@lists.xenproject.org; Mon, 13 Jul 2015 15:54:27 +0000
Received: from [193.109.254.147] by server-3.bemta-14.messagelabs.com id
	34/73-18676-23FD3A55; Mon, 13 Jul 2015 15:54:26 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1436802864!31705637!1
X-Originating-IP: [66.111.4.26]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjYgPT4gMTIyNTM=\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7128 invoked from network); 13 Jul 2015 15:54:25 -0000
Received: from out2-smtp.messagingengine.com (HELO
	out2-smtp.messagingengine.com) (66.111.4.26)
	by server-15.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Jul 2015 15:54:25 -0000
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
	by mailout.nyi.internal (Postfix) with ESMTP id A5B1120B57
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 13 Jul 2015 11:54:24 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute5.internal (MEProxy); Mon, 13 Jul 2015 11:54:24 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=y1Mw4Z06yUvcDYu5
	Qp6lOQoa//4=; b=KSjg8KMpUdrq5kYcnrbwxAc5/WEVRQBx1y6TiLay4iUtkXXb
	t1/yu1FZiz2GENnuR0NEsIprTPRKea5gjpyWq6/FhlM9eMctvl6/f2Gfb2sdKoEC
	gjSYXBtUsz+/ZkIDJhFgjODPvllMCix3F6OjJ/LkbToPtn+puBb/gdgVanw=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=y1Mw4Z06yUvcDYu
	5Qp6lOQoa//4=; b=iGmrinoHwqLkoLGRE7BGstoTLQJDeuxKHW+ymuC3WOHGEX7
	TjNyB1MV/EYUfMXsGYiPc1oOn4IQ7lRTZohsHvLnnO+5vuZHSscS0Fn6MdIpgFsu
	xcXrCv9yHJOc5kzjTOA5SBZ3gEZvzlapgg5EGZ/25vujd4yDeGjcS9YubmgI=
X-Sasl-enc: lnFT0ODm3OQl2YXtarvyHS8UD/Sl33zw/wjeOxPWLhRG 1436802864
Received: from [10.137.2.8] (89-67-247-126.dynamic.chello.pl [89.67.247.126])
	by mail.messagingengine.com (Postfix) with ESMTPA id E432CC00022;
	Mon, 13 Jul 2015 11:54:23 -0400 (EDT)
Message-ID: <55A3DF2B.2020603@invisiblethingslab.com>
Date: Mon, 13 Jul 2015 17:54:19 +0200
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:31.0) Gecko/20100101 Thunderbird/31.7.0
MIME-Version: 1.0
To: Owen Smith <owen.smith@citrix.com>, 
	Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <55A3D62E.7030802@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F4C05D2@AMSPEX01CL02.citrite.net>
	<6624BC057AF4E240B6D036F5CC505B1219A20FCF@AMSPEX01CL02.citrite.net>
In-Reply-To: <6624BC057AF4E240B6D036F5CC505B1219A20FCF@AMSPEX01CL02.citrite.net>
Content-Length: 2667
Subject: Re: [win-pv-devel] Identifying PV disk devices
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

T24gMDcvMTMvMjAxNSAwNTozNiBQTSwgT3dlbiBTbWl0aCB3cm90ZToKPiBMb2NhdGlvbkluZm9y
bWF0aW9uIGluZGljYXRlcyB0aGUgVGFyZ2V0SWQgYXMgdGhlIG1pZGRsZSAyIGNoYXJhY3RlcnMu
IAo+IFRoZSB4ZW5zdG9yZSBiYWNrZW5kIGRldmljZSBJRCBjb250YWlucyBhIGZvcm1hdHRlZCB2
YXJpYW50IG9mIHRoaXMsIGFzIGl0IGVuY29kZXMKPiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIChz
ZWUgeGVudmJkL2Zkby5jIF9fUGFyc2VWYmQoKSBANDI2KQo+IAo+IFRoZSBQYWdlIDgzIGRhdGEg
d2lsbCBhcHBlbmQgdGhlIHZkaS11dWlkIHRvIGFueSBvdGhlciBkYXRhIChmcm9tIHhlbnN0b3Jl
IG9yIAo+IHN5bnRoZXNpemVkKSBhcyBhIHZlbmRvciBzcGVjaWZpYyBhc2NpaSBmaWVsZC4KPiAK
SSBzZWUsIHRoYXQncyBleGFjdGx5IHdoYXQgSSBuZWVkZWQuIFRoYW5rIHlvdS4KCj4+IC0tLS0t
T3JpZ2luYWwgTWVzc2FnZS0tLS0tCj4+IEZyb206IHdpbi1wdi1kZXZlbC1ib3VuY2VzQGxpc3Rz
LnhlbnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2LWRldmVsLQo+PiBib3VuY2VzQGxpc3RzLnhl
bnByb2plY3Qub3JnXSBPbiBCZWhhbGYgT2YgUGF1bCBEdXJyYW50Cj4+IFNlbnQ6IDEzIEp1bHkg
MjAxNSAxNjoyNAo+PiBUbzogUmFmYcWCIFdvamR5xYJhOyB3aW4tcHYtZGV2ZWxAbGlzdHMueGVu
cHJvamVjdC5vcmcKPj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxdIElkZW50aWZ5aW5nIFBW
IGRpc2sgZGV2aWNlcwo+Pgo+Pj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPj4+IEZyb206
IHdpbi1wdi1kZXZlbC1ib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2
LWRldmVsLQo+Pj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJh
ZmFsIFdvamR5bGEKPj4+IFNlbnQ6IDEzIEp1bHkgMjAxNSAxNjoxNgo+Pj4gVG86IHdpbi1wdi1k
ZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwo+Pj4gU3ViamVjdDogW3dpbi1wdi1kZXZlbF0gSWRl
bnRpZnlpbmcgUFYgZGlzayBkZXZpY2VzCj4+Pgo+Pj4gSGksCj4+Pgo+Pj4gSXMgaXQgcG9zc2li
bGUgdG8gb2J0YWluIHRoZSBiYWNrZW5kIGRldmljZSBJRCBmb3IgYSBwYXJ0aWN1bGFyIFBWCj4+
PiBkaXNrIGZyb20gdXNlciBtb2RlPyBDdXJyZW50bHkgaXQncyBoYXJkIHRvIGlkZW50aWZ5IHdo
aWNoIGRpc2sgaXMKPj4+IHdoaWNoIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBkaXNrcyBhdHRhY2hl
ZC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpbgo+Pj4gZGV2aWNlIHByb3BlcnRpZXMgSSBmb3VuZCBp
cyBsb2NhdGlvbiwgYnV0IG1heWJlIHRoZXJlIGlzIGFuIGVhc2llciB3YXk/Cj4+Pgo+Pgo+PiBX
aGF0IGRvIHlvdSBtZWFuIGJ5IGRldmljZSBpZD8gVGhlIGxvY2F0aW9uIGlzIHByZXR0eSBtdWNo
IHRoZSBtYWluCj4+IGRpc3Rpbmd1aXNoaW5nIGZlYXR1cmUuIFRoZSBkcml2ZXIgaXMgY2FwYWJs
ZSBvZiB0YWtpbmcgcGFnZSA4MCBhbmQgODMgZGF0YQo+PiBmcm9tIHhlbnN0b3JlIGlmIHRoZSB0
b29sc3RhY2sgcHV0cyBzb21ldGhpbmcgdGhlcmUsIGJ1dCB4bCBkb2Vzbid0IGRvIHRoYXQKPj4g
QUZBSUsuCj4+Cj4+ICAgUGF1bAo+Pgo+Pj4gLS0KPj4+IFJhZmHFgiBXb2pkecWCYQo+Pj4gUXVi
ZXMgVG9vbHMgZm9yIFdpbmRvd3MgZGV2ZWxvcGVyCj4+PiBodHRwczovL3d3dy5xdWJlcy1vcy5v
cmcvCj4+PgoKLS0gClJhZmHFgiBXb2pkecWCYQpRdWJlcyBUb29scyBmb3IgV2luZG93cyBkZXZl
bG9wZXIKaHR0cHM6Ly93d3cucXViZXMtb3Mub3JnLwoKX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX18Kd2luLXB2LWRldmVsIG1haWxpbmcgbGlzdAp3aW4tcHYt
ZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKaHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2Nn
aS1iaW4vbWFpbG1hbi9saXN0aW5mby93aW4tcHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 13 15:54:28 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 13 Jul 2015 15:54:28 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZEg3o-0006Ea-18; Mon, 13 Jul 2015 15:54:28 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1ZEg3n-0006EC-0N
	for win-pv-devel@lists.xenproject.org; Mon, 13 Jul 2015 15:54:27 +0000
Received: from [193.109.254.147] by server-3.bemta-14.messagelabs.com id
	34/73-18676-23FD3A55; Mon, 13 Jul 2015 15:54:26 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1436802864!31705637!1
X-Originating-IP: [66.111.4.26]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjYgPT4gMTIyNTM=\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7128 invoked from network); 13 Jul 2015 15:54:25 -0000
Received: from out2-smtp.messagingengine.com (HELO
	out2-smtp.messagingengine.com) (66.111.4.26)
	by server-15.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Jul 2015 15:54:25 -0000
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
	by mailout.nyi.internal (Postfix) with ESMTP id A5B1120B57
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 13 Jul 2015 11:54:24 -0400 (EDT)
Received: from frontend1 ([10.202.2.160])
	by compute5.internal (MEProxy); Mon, 13 Jul 2015 11:54:24 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=y1Mw4Z06yUvcDYu5
	Qp6lOQoa//4=; b=KSjg8KMpUdrq5kYcnrbwxAc5/WEVRQBx1y6TiLay4iUtkXXb
	t1/yu1FZiz2GENnuR0NEsIprTPRKea5gjpyWq6/FhlM9eMctvl6/f2Gfb2sdKoEC
	gjSYXBtUsz+/ZkIDJhFgjODPvllMCix3F6OjJ/LkbToPtn+puBb/gdgVanw=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=y1Mw4Z06yUvcDYu
	5Qp6lOQoa//4=; b=iGmrinoHwqLkoLGRE7BGstoTLQJDeuxKHW+ymuC3WOHGEX7
	TjNyB1MV/EYUfMXsGYiPc1oOn4IQ7lRTZohsHvLnnO+5vuZHSscS0Fn6MdIpgFsu
	xcXrCv9yHJOc5kzjTOA5SBZ3gEZvzlapgg5EGZ/25vujd4yDeGjcS9YubmgI=
X-Sasl-enc: lnFT0ODm3OQl2YXtarvyHS8UD/Sl33zw/wjeOxPWLhRG 1436802864
Received: from [10.137.2.8] (89-67-247-126.dynamic.chello.pl [89.67.247.126])
	by mail.messagingengine.com (Postfix) with ESMTPA id E432CC00022;
	Mon, 13 Jul 2015 11:54:23 -0400 (EDT)
Message-ID: <55A3DF2B.2020603@invisiblethingslab.com>
Date: Mon, 13 Jul 2015 17:54:19 +0200
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:31.0) Gecko/20100101 Thunderbird/31.7.0
MIME-Version: 1.0
To: Owen Smith <owen.smith@citrix.com>, 
	Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <55A3D62E.7030802@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F4C05D2@AMSPEX01CL02.citrite.net>
	<6624BC057AF4E240B6D036F5CC505B1219A20FCF@AMSPEX01CL02.citrite.net>
In-Reply-To: <6624BC057AF4E240B6D036F5CC505B1219A20FCF@AMSPEX01CL02.citrite.net>
Content-Length: 2667
Subject: Re: [win-pv-devel] Identifying PV disk devices
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

T24gMDcvMTMvMjAxNSAwNTozNiBQTSwgT3dlbiBTbWl0aCB3cm90ZToKPiBMb2NhdGlvbkluZm9y
bWF0aW9uIGluZGljYXRlcyB0aGUgVGFyZ2V0SWQgYXMgdGhlIG1pZGRsZSAyIGNoYXJhY3RlcnMu
IAo+IFRoZSB4ZW5zdG9yZSBiYWNrZW5kIGRldmljZSBJRCBjb250YWlucyBhIGZvcm1hdHRlZCB2
YXJpYW50IG9mIHRoaXMsIGFzIGl0IGVuY29kZXMKPiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIChz
ZWUgeGVudmJkL2Zkby5jIF9fUGFyc2VWYmQoKSBANDI2KQo+IAo+IFRoZSBQYWdlIDgzIGRhdGEg
d2lsbCBhcHBlbmQgdGhlIHZkaS11dWlkIHRvIGFueSBvdGhlciBkYXRhIChmcm9tIHhlbnN0b3Jl
IG9yIAo+IHN5bnRoZXNpemVkKSBhcyBhIHZlbmRvciBzcGVjaWZpYyBhc2NpaSBmaWVsZC4KPiAK
SSBzZWUsIHRoYXQncyBleGFjdGx5IHdoYXQgSSBuZWVkZWQuIFRoYW5rIHlvdS4KCj4+IC0tLS0t
T3JpZ2luYWwgTWVzc2FnZS0tLS0tCj4+IEZyb206IHdpbi1wdi1kZXZlbC1ib3VuY2VzQGxpc3Rz
LnhlbnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2LWRldmVsLQo+PiBib3VuY2VzQGxpc3RzLnhl
bnByb2plY3Qub3JnXSBPbiBCZWhhbGYgT2YgUGF1bCBEdXJyYW50Cj4+IFNlbnQ6IDEzIEp1bHkg
MjAxNSAxNjoyNAo+PiBUbzogUmFmYcWCIFdvamR5xYJhOyB3aW4tcHYtZGV2ZWxAbGlzdHMueGVu
cHJvamVjdC5vcmcKPj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxdIElkZW50aWZ5aW5nIFBW
IGRpc2sgZGV2aWNlcwo+Pgo+Pj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPj4+IEZyb206
IHdpbi1wdi1kZXZlbC1ib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2
LWRldmVsLQo+Pj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJh
ZmFsIFdvamR5bGEKPj4+IFNlbnQ6IDEzIEp1bHkgMjAxNSAxNjoxNgo+Pj4gVG86IHdpbi1wdi1k
ZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwo+Pj4gU3ViamVjdDogW3dpbi1wdi1kZXZlbF0gSWRl
bnRpZnlpbmcgUFYgZGlzayBkZXZpY2VzCj4+Pgo+Pj4gSGksCj4+Pgo+Pj4gSXMgaXQgcG9zc2li
bGUgdG8gb2J0YWluIHRoZSBiYWNrZW5kIGRldmljZSBJRCBmb3IgYSBwYXJ0aWN1bGFyIFBWCj4+
PiBkaXNrIGZyb20gdXNlciBtb2RlPyBDdXJyZW50bHkgaXQncyBoYXJkIHRvIGlkZW50aWZ5IHdo
aWNoIGRpc2sgaXMKPj4+IHdoaWNoIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBkaXNrcyBhdHRhY2hl
ZC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpbgo+Pj4gZGV2aWNlIHByb3BlcnRpZXMgSSBmb3VuZCBp
cyBsb2NhdGlvbiwgYnV0IG1heWJlIHRoZXJlIGlzIGFuIGVhc2llciB3YXk/Cj4+Pgo+Pgo+PiBX
aGF0IGRvIHlvdSBtZWFuIGJ5IGRldmljZSBpZD8gVGhlIGxvY2F0aW9uIGlzIHByZXR0eSBtdWNo
IHRoZSBtYWluCj4+IGRpc3Rpbmd1aXNoaW5nIGZlYXR1cmUuIFRoZSBkcml2ZXIgaXMgY2FwYWJs
ZSBvZiB0YWtpbmcgcGFnZSA4MCBhbmQgODMgZGF0YQo+PiBmcm9tIHhlbnN0b3JlIGlmIHRoZSB0
b29sc3RhY2sgcHV0cyBzb21ldGhpbmcgdGhlcmUsIGJ1dCB4bCBkb2Vzbid0IGRvIHRoYXQKPj4g
QUZBSUsuCj4+Cj4+ICAgUGF1bAo+Pgo+Pj4gLS0KPj4+IFJhZmHFgiBXb2pkecWCYQo+Pj4gUXVi
ZXMgVG9vbHMgZm9yIFdpbmRvd3MgZGV2ZWxvcGVyCj4+PiBodHRwczovL3d3dy5xdWJlcy1vcy5v
cmcvCj4+PgoKLS0gClJhZmHFgiBXb2pkecWCYQpRdWJlcyBUb29scyBmb3IgV2luZG93cyBkZXZl
bG9wZXIKaHR0cHM6Ly93d3cucXViZXMtb3Mub3JnLwoKX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX18Kd2luLXB2LWRldmVsIG1haWxpbmcgbGlzdAp3aW4tcHYt
ZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKaHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2Nn
aS1iaW4vbWFpbG1hbi9saXN0aW5mby93aW4tcHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Tue Jul 14 10:42:53 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 14 Jul 2015 10:42:53 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZExfo-0004tg-64; Tue, 14 Jul 2015 10:42:52 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1ZExfm-0004tb-EX
	for win-pv-devel@lists.xenproject.org; Tue, 14 Jul 2015 10:42:50 +0000
Received: from [193.109.254.147] by server-15.bemta-14.messagelabs.com id
	23/A6-18947-9A7E4A55; Tue, 14 Jul 2015 10:42:49 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-7.tower-27.messagelabs.com!1436870568!31904116!1
X-Originating-IP: [209.85.212.174]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30616 invoked from network); 14 Jul 2015 10:42:48 -0000
Received: from mail-wi0-f174.google.com (HELO mail-wi0-f174.google.com)
	(209.85.212.174)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Jul 2015 10:42:48 -0000
Received: by widic2 with SMTP id ic2so34648354wid.0
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 14 Jul 2015 03:42:48 -0700 (PDT)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=1e100.net; s=20130820;
	h=x-gm-message-state:subject:to:references:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type
	:content-transfer-encoding;
	bh=uhbi1ySu40BDhDYp6QW4ep1IO1JeH8L2JloMCCIeUtk=;
	b=M0n4+VUmJpZlp4tNxxRCE13BNS7+pqCCOg3HPGXEOmjQf3Pp0w2MhcjxiWe6kMsiiU
	L/z7h6Xf/rUVShi8Qx+4091ClI5fMu9J29jLkFgMUxarCooYNiG7hSmvigkdoXNM+/LH
	9YpbrAS/yWT1TZLntuRurZOt+ADbYRMWgOf/FBUG9t/MzvYR7kPKdKx+xJlmxNTC+J8h
	sk1aoOoHkA/mXSNSIlaJEkZjFXn5GacgGn+55qANAbaHyVbYRW0NXyZyclION73c9XJq
	KrLUX27kiJeDxyif3i8N5x7KsJg+BnG2hSFduoCm6XuaOFS591RbFIhqQb4Y0c1BwABB
	a+AQ==
X-Gm-Message-State: ALoCoQnzRJgdxYQ0yHF7LUy1Gkk1RRqDOW8FJQ+L2c9jPmG3HCH6k5YD1IpVRCIkHEcRRSAywpDS
X-Received: by 10.194.86.161 with SMTP id q1mr78231151wjz.18.1436870568307;
	Tue, 14 Jul 2015 03:42:48 -0700 (PDT)
Received: from [192.168.1.11] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	lk5sm2414252wic.24.2015.07.14.03.42.46
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 14 Jul 2015 03:42:47 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <55A3C63E.3080004@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F4C047A@AMSPEX01CL02.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <55A4E7A8.9060904@m2r.biz>
Date: Tue, 14 Jul 2015 12:42:48 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.0.1
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C047A@AMSPEX01CL02.citrite.net>
Subject: Re: [win-pv-devel] Regression: qemu crash at boot after update
 winpv drivers to latest build
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Il 13/07/2015 17:16, Paul Durrant ha scritto:
>> -----Original Message-----
>> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
>> bounces@lists.xenproject.org] On Behalf Of Fabio Fantoni
>> Sent: 13 July 2015 15:08
>> To: win-pv-devel@lists.xenproject.org
>> Cc: Paul Durrant
>> Subject: [win-pv-devel] Regression: qemu crash at boot after update winpv
>> drivers to latest build
>>
>> I updated winpv drivers to latest build on windows 7 pro 64 bit domU and
>> I had qemu crash at windows boot.
>> In attachment qemu log with xen-platform trace enabled.
>> Same domU (on same dom0 with same xen, qemu ecc..versions) was
>> working
>> before but I did only few tests on new xen-unstable build I did friday.
>>
> Pretty hard to see how PV drivers are going to crash QEMU unless QEMU has a bug. Have you tried using trad?
>
>    Paul

Thanks for your reply.
I tried to do gdb on qemu but I was unable to reproduce the bug for take 
full backtrace.
Today I also updated xen to latest staging and I did other tests without 
had qemu crashes.
About qemu traditional I don't use it anymore, is too old and can't do 
what I need.
I'll do other tests.

>
>> If you need other information/tests tell me and I'll post them.
>>
>> Thanks for any reply and sorry for my bad english.


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Jul 14 10:42:53 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 14 Jul 2015 10:42:53 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZExfo-0004tg-64; Tue, 14 Jul 2015 10:42:52 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1ZExfm-0004tb-EX
	for win-pv-devel@lists.xenproject.org; Tue, 14 Jul 2015 10:42:50 +0000
Received: from [193.109.254.147] by server-15.bemta-14.messagelabs.com id
	23/A6-18947-9A7E4A55; Tue, 14 Jul 2015 10:42:49 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-7.tower-27.messagelabs.com!1436870568!31904116!1
X-Originating-IP: [209.85.212.174]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30616 invoked from network); 14 Jul 2015 10:42:48 -0000
Received: from mail-wi0-f174.google.com (HELO mail-wi0-f174.google.com)
	(209.85.212.174)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Jul 2015 10:42:48 -0000
Received: by widic2 with SMTP id ic2so34648354wid.0
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 14 Jul 2015 03:42:48 -0700 (PDT)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=1e100.net; s=20130820;
	h=x-gm-message-state:subject:to:references:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type
	:content-transfer-encoding;
	bh=uhbi1ySu40BDhDYp6QW4ep1IO1JeH8L2JloMCCIeUtk=;
	b=M0n4+VUmJpZlp4tNxxRCE13BNS7+pqCCOg3HPGXEOmjQf3Pp0w2MhcjxiWe6kMsiiU
	L/z7h6Xf/rUVShi8Qx+4091ClI5fMu9J29jLkFgMUxarCooYNiG7hSmvigkdoXNM+/LH
	9YpbrAS/yWT1TZLntuRurZOt+ADbYRMWgOf/FBUG9t/MzvYR7kPKdKx+xJlmxNTC+J8h
	sk1aoOoHkA/mXSNSIlaJEkZjFXn5GacgGn+55qANAbaHyVbYRW0NXyZyclION73c9XJq
	KrLUX27kiJeDxyif3i8N5x7KsJg+BnG2hSFduoCm6XuaOFS591RbFIhqQb4Y0c1BwABB
	a+AQ==
X-Gm-Message-State: ALoCoQnzRJgdxYQ0yHF7LUy1Gkk1RRqDOW8FJQ+L2c9jPmG3HCH6k5YD1IpVRCIkHEcRRSAywpDS
X-Received: by 10.194.86.161 with SMTP id q1mr78231151wjz.18.1436870568307;
	Tue, 14 Jul 2015 03:42:48 -0700 (PDT)
Received: from [192.168.1.11] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	lk5sm2414252wic.24.2015.07.14.03.42.46
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 14 Jul 2015 03:42:47 -0700 (PDT)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <55A3C63E.3080004@m2r.biz>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F4C047A@AMSPEX01CL02.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <55A4E7A8.9060904@m2r.biz>
Date: Tue, 14 Jul 2015 12:42:48 +0200
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.0.1
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C047A@AMSPEX01CL02.citrite.net>
Subject: Re: [win-pv-devel] Regression: qemu crash at boot after update
 winpv drivers to latest build
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Il 13/07/2015 17:16, Paul Durrant ha scritto:
>> -----Original Message-----
>> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
>> bounces@lists.xenproject.org] On Behalf Of Fabio Fantoni
>> Sent: 13 July 2015 15:08
>> To: win-pv-devel@lists.xenproject.org
>> Cc: Paul Durrant
>> Subject: [win-pv-devel] Regression: qemu crash at boot after update winpv
>> drivers to latest build
>>
>> I updated winpv drivers to latest build on windows 7 pro 64 bit domU and
>> I had qemu crash at windows boot.
>> In attachment qemu log with xen-platform trace enabled.
>> Same domU (on same dom0 with same xen, qemu ecc..versions) was
>> working
>> before but I did only few tests on new xen-unstable build I did friday.
>>
> Pretty hard to see how PV drivers are going to crash QEMU unless QEMU has a bug. Have you tried using trad?
>
>    Paul

Thanks for your reply.
I tried to do gdb on qemu but I was unable to reproduce the bug for take 
full backtrace.
Today I also updated xen to latest staging and I did other tests without 
had qemu crashes.
About qemu traditional I don't use it anymore, is too old and can't do 
what I need.
I'll do other tests.

>
>> If you need other information/tests tell me and I'll post them.
>>
>> Thanks for any reply and sorry for my bad english.


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Jul 14 10:52:26 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 14 Jul 2015 10:52:26 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZExp4-0005bP-GD; Tue, 14 Jul 2015 10:52:26 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZExp3-0005bJ-Tn
	for win-pv-devel@lists.xenproject.org; Tue, 14 Jul 2015 10:52:26 +0000
Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id
	1F/34-00913-9E9E4A55; Tue, 14 Jul 2015 10:52:25 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-7.tower-206.messagelabs.com!1436871144!21051312!1
X-Originating-IP: [209.85.212.174]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25862 invoked from network); 14 Jul 2015 10:52:24 -0000
Received: from mail-wi0-f174.google.com (HELO mail-wi0-f174.google.com)
	(209.85.212.174)
	by server-7.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Jul 2015 10:52:24 -0000
Received: by wibud3 with SMTP id ud3so52268447wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 14 Jul 2015 03:52:24 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=dYZkurdj27bP67p2whoRV7LP9/eu6Xdvw2jQU/5l5g4=;
	b=yHZ+nSAViTb07RQPqSR8tuH764OtOOrGVFG7fl247M6+rdQj8Pu0dqoFkCHoEEwgiO
	qWXJYWMsVrgF22G0XP7Ic7jwHuHE6m/GG7+ttMh1KrcHarMZs6+t4Bzy8uJ+tfD1P7sz
	MZTXdrldZZgS9si97CSMJ0pLUpyQW+ZZajVeqJG9TVhP38iZ+ebrZFaP817GiV5ZZbcP
	WiLzoawCmEg7LzYyqJdAriPImkLJjFaASQPLjOiyDyTZ4RIfBR07jVIihacz4huIIk+B
	ingDnvtjZ3rLyHqBbYdgY7tdtemiOUnA/nheW0fT9oORcD436TuGaavjvpSVwAkHzhAj
	pWmA==
X-Received: by 10.180.13.232 with SMTP id k8mr4199555wic.41.1436871144520;
	Tue, 14 Jul 2015 03:52:24 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id k2sm2504265wif.4.2015.07.14.03.52.23
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 14 Jul 2015 03:52:23 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Tue, 14 Jul 2015 11:52:07 +0100
Message-Id: <1436871127-10092-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove test for HardwareInterface in
	FrontendGetInterfaceIndex()
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Apparently no interface in the mib table on Windows Server 2008 SP2 is
a hardware interface, even if it has (virtual) hardware.

Also add a missing \n to a trace statement.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/frontend.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index 257d314..b389b1c 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -471,8 +471,7 @@ FrontendGetInterfaceIndex(
     for (Index = 0; Index < Table->NumEntries; Index++) {
         Row = &Table->Table[Index];
 
-        if (!(Row->InterfaceAndOperStatusFlags.HardwareInterface) ||
-            !(Row->InterfaceAndOperStatusFlags.ConnectorPresent))
+        if (!Row->InterfaceAndOperStatusFlags.ConnectorPresent)
             continue;
 
         if (Row->OperStatus != IfOperStatusUp)
@@ -494,7 +493,7 @@ FrontendGetInterfaceIndex(
 found:
     *InterfaceIndex = Row->InterfaceIndex;
 
-    Trace("[%u]: %ws (%ws)",
+    Trace("[%u]: %ws (%ws)\n",
           Row->InterfaceIndex,
           Row->Alias,
           Row->Description);
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Jul 14 10:52:26 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 14 Jul 2015 10:52:26 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZExp4-0005bP-GD; Tue, 14 Jul 2015 10:52:26 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZExp3-0005bJ-Tn
	for win-pv-devel@lists.xenproject.org; Tue, 14 Jul 2015 10:52:26 +0000
Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id
	1F/34-00913-9E9E4A55; Tue, 14 Jul 2015 10:52:25 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-7.tower-206.messagelabs.com!1436871144!21051312!1
X-Originating-IP: [209.85.212.174]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25862 invoked from network); 14 Jul 2015 10:52:24 -0000
Received: from mail-wi0-f174.google.com (HELO mail-wi0-f174.google.com)
	(209.85.212.174)
	by server-7.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Jul 2015 10:52:24 -0000
Received: by wibud3 with SMTP id ud3so52268447wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 14 Jul 2015 03:52:24 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=dYZkurdj27bP67p2whoRV7LP9/eu6Xdvw2jQU/5l5g4=;
	b=yHZ+nSAViTb07RQPqSR8tuH764OtOOrGVFG7fl247M6+rdQj8Pu0dqoFkCHoEEwgiO
	qWXJYWMsVrgF22G0XP7Ic7jwHuHE6m/GG7+ttMh1KrcHarMZs6+t4Bzy8uJ+tfD1P7sz
	MZTXdrldZZgS9si97CSMJ0pLUpyQW+ZZajVeqJG9TVhP38iZ+ebrZFaP817GiV5ZZbcP
	WiLzoawCmEg7LzYyqJdAriPImkLJjFaASQPLjOiyDyTZ4RIfBR07jVIihacz4huIIk+B
	ingDnvtjZ3rLyHqBbYdgY7tdtemiOUnA/nheW0fT9oORcD436TuGaavjvpSVwAkHzhAj
	pWmA==
X-Received: by 10.180.13.232 with SMTP id k8mr4199555wic.41.1436871144520;
	Tue, 14 Jul 2015 03:52:24 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id k2sm2504265wif.4.2015.07.14.03.52.23
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 14 Jul 2015 03:52:23 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Tue, 14 Jul 2015 11:52:07 +0100
Message-Id: <1436871127-10092-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove test for HardwareInterface in
	FrontendGetInterfaceIndex()
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Apparently no interface in the mib table on Windows Server 2008 SP2 is
a hardware interface, even if it has (virtual) hardware.

Also add a missing \n to a trace statement.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/frontend.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index 257d314..b389b1c 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -471,8 +471,7 @@ FrontendGetInterfaceIndex(
     for (Index = 0; Index < Table->NumEntries; Index++) {
         Row = &Table->Table[Index];
 
-        if (!(Row->InterfaceAndOperStatusFlags.HardwareInterface) ||
-            !(Row->InterfaceAndOperStatusFlags.ConnectorPresent))
+        if (!Row->InterfaceAndOperStatusFlags.ConnectorPresent)
             continue;
 
         if (Row->OperStatus != IfOperStatusUp)
@@ -494,7 +493,7 @@ FrontendGetInterfaceIndex(
 found:
     *InterfaceIndex = Row->InterfaceIndex;
 
-    Trace("[%u]: %ws (%ws)",
+    Trace("[%u]: %ws (%ws)\n",
           Row->InterfaceIndex,
           Row->Alias,
           Row->Description);
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Jul 14 10:52:59 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 14 Jul 2015 10:52:59 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZExpa-0005ev-UF; Tue, 14 Jul 2015 10:52:58 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZExpZ-0005eX-5A
	for win-pv-devel@lists.xenproject.org; Tue, 14 Jul 2015 10:52:57 +0000
Received: from [85.158.139.211] by server-6.bemta-5.messagelabs.com id
	B9/2C-10311-80AE4A55; Tue, 14 Jul 2015 10:52:56 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1436871175!21013355!1
X-Originating-IP: [74.125.82.54]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9109 invoked from network); 14 Jul 2015 10:52:55 -0000
Received: from mail-wg0-f54.google.com (HELO mail-wg0-f54.google.com)
	(74.125.82.54)
	by server-6.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Jul 2015 10:52:55 -0000
Received: by wgmn9 with SMTP id n9so5585586wgm.0
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 14 Jul 2015 03:52:55 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=nhP+8r9+wcFLnG5RSQKupUkIrLStLYukxSLdM9xbyHA=;
	b=RfWb+eJoqrqGnjh79nwIj1MRp2X/pQrxNXDQF4MJY4tAuEb/oI4ACbRj/vVEvdOqw7
	dDaNQXfuDGngPQ9mfJ1Ezy2/pjDJW/BUQJOb3JeFGuKyjesPBJASWcM8FMXtJVRpvDbq
	2PobWt7hXwduzxj1N3X1BanWn6M+/TFLB/S00YopB8whBvt5JfHYFf4H5C8y7wnEGTSp
	xA5APbj0ytl/uSlnnYxLN9vmPCGBXET78wh8JFDMaoJeXuImKFhyINbbjlxO060LEbJY
	qXSc6YTscQAiZyv3A5V2qjHnqYsbpLOOYiE+hTdHETbZzvrUqetfk0l7D0okTW3u3Xe8
	9G6g==
X-Received: by 10.194.78.110 with SMTP id a14mr80847346wjx.87.1436871175350;
	Tue, 14 Jul 2015 03:52:55 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	ef10sm1248672wjd.49.2015.07.14.03.52.54
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 14 Jul 2015 03:52:54 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Tue, 14 Jul 2015 11:52:41 +0100
Message-Id: <1436871161-6848-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Note lack of IPv6 addresses in the log
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

When we are copying settings, say whether we found any IPv6 address.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/settings.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/xenvif/settings.c b/src/xenvif/settings.c
index 145e83d..54fb12e 100644
--- a/src/xenvif/settings.c
+++ b/src/xenvif/settings.c
@@ -268,8 +268,10 @@ SettingsCopyIpVersion6Addresses(
                                 IPV6_PATH,
                                 (Save) ? KEY_READ : KEY_ALL_ACCESS,
                                 &ValueKey);
-    if (!NT_SUCCESS(status))
+    if (!NT_SUCCESS(status)) {
+        Info("NOT FOUND\n");
         goto done;
+    }
 
     Trace("%s %s\\%s\n",
           (Save) ? "FROM" : "TO",
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Jul 14 10:52:59 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 14 Jul 2015 10:52:59 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZExpa-0005ev-UF; Tue, 14 Jul 2015 10:52:58 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZExpZ-0005eX-5A
	for win-pv-devel@lists.xenproject.org; Tue, 14 Jul 2015 10:52:57 +0000
Received: from [85.158.139.211] by server-6.bemta-5.messagelabs.com id
	B9/2C-10311-80AE4A55; Tue, 14 Jul 2015 10:52:56 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1436871175!21013355!1
X-Originating-IP: [74.125.82.54]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9109 invoked from network); 14 Jul 2015 10:52:55 -0000
Received: from mail-wg0-f54.google.com (HELO mail-wg0-f54.google.com)
	(74.125.82.54)
	by server-6.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Jul 2015 10:52:55 -0000
Received: by wgmn9 with SMTP id n9so5585586wgm.0
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 14 Jul 2015 03:52:55 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=nhP+8r9+wcFLnG5RSQKupUkIrLStLYukxSLdM9xbyHA=;
	b=RfWb+eJoqrqGnjh79nwIj1MRp2X/pQrxNXDQF4MJY4tAuEb/oI4ACbRj/vVEvdOqw7
	dDaNQXfuDGngPQ9mfJ1Ezy2/pjDJW/BUQJOb3JeFGuKyjesPBJASWcM8FMXtJVRpvDbq
	2PobWt7hXwduzxj1N3X1BanWn6M+/TFLB/S00YopB8whBvt5JfHYFf4H5C8y7wnEGTSp
	xA5APbj0ytl/uSlnnYxLN9vmPCGBXET78wh8JFDMaoJeXuImKFhyINbbjlxO060LEbJY
	qXSc6YTscQAiZyv3A5V2qjHnqYsbpLOOYiE+hTdHETbZzvrUqetfk0l7D0okTW3u3Xe8
	9G6g==
X-Received: by 10.194.78.110 with SMTP id a14mr80847346wjx.87.1436871175350;
	Tue, 14 Jul 2015 03:52:55 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	ef10sm1248672wjd.49.2015.07.14.03.52.54
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 14 Jul 2015 03:52:54 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Tue, 14 Jul 2015 11:52:41 +0100
Message-Id: <1436871161-6848-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Note lack of IPv6 addresses in the log
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

When we are copying settings, say whether we found any IPv6 address.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/settings.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/xenvif/settings.c b/src/xenvif/settings.c
index 145e83d..54fb12e 100644
--- a/src/xenvif/settings.c
+++ b/src/xenvif/settings.c
@@ -268,8 +268,10 @@ SettingsCopyIpVersion6Addresses(
                                 IPV6_PATH,
                                 (Save) ? KEY_READ : KEY_ALL_ACCESS,
                                 &ValueKey);
-    if (!NT_SUCCESS(status))
+    if (!NT_SUCCESS(status)) {
+        Info("NOT FOUND\n");
         goto done;
+    }
 
     Trace("%s %s\\%s\n",
           (Save) ? "FROM" : "TO",
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Jul 14 10:57:56 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 14 Jul 2015 10:57:56 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZExuO-0006LB-2z; Tue, 14 Jul 2015 10:57:56 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZExuM-0006L6-Uv
	for win-pv-devel@lists.xenproject.org; Tue, 14 Jul 2015 10:57:55 +0000
Received: from [85.158.137.68] by server-10.bemta-3.messagelabs.com id
	6C/5F-03895-23BE4A55; Tue, 14 Jul 2015 10:57:54 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-31.messagelabs.com!1436871473!25559330!1
X-Originating-IP: [209.85.212.179]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30383 invoked from network); 14 Jul 2015 10:57:53 -0000
Received: from mail-wi0-f179.google.com (HELO mail-wi0-f179.google.com)
	(209.85.212.179)
	by server-12.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Jul 2015 10:57:53 -0000
Received: by wicmv11 with SMTP id mv11so11015000wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 14 Jul 2015 03:57:53 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=N2zicj2ctd1nLygVqswnLxS6V7U5jSjZMo65GEdgU5s=;
	b=UsdKaq2kyQ0m0K1ToxsiGYNgIk7QV+AflNx1ccwCXl2C+oXCzxULqGpzFDBbWNNG7C
	UEe5YFY2plu8Y/Ic8MIIj1xRRyzV4t05P0x0i578sihQ82XRRu9dBCBJGQlM+50Y1NBz
	tPQjog1W7FtpE4cv43cUnThgK4751YuAL873FTAP4+Sp7SfuUEKGXDO8uCHksJ9Ukx9O
	AgfMBOjadDLrSALPkv0C6WXbjf4y3DZAY4BlJqpEVgw68FZpO48OOJbnM06val8+s+lP
	JFcyJdifVuSxuWO11SJxCAsxnDMJyIxDUVgIO46976tmoAsXAQwaoIUd4KpQoJWpFIj+
	YZLA==
X-Received: by 10.180.20.48 with SMTP id k16mr32332771wie.56.1436871473216;
	Tue, 14 Jul 2015 03:57:53 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	s10sm10305647wik.6.2015.07.14.03.57.52
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 14 Jul 2015 03:57:52 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Tue, 14 Jul 2015 11:57:38 +0100
Message-Id: <1436871458-9152-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Fix potential buffer overflow
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The buffer allocation in FdoQueryDeviceRelations() is completely bogus. Fix
it.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/fdo.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/xenvif/fdo.c b/src/xenvif/fdo.c
index b903b09..aabc9c1 100644
--- a/src/xenvif/fdo.c
+++ b/src/xenvif/fdo.c
@@ -1632,7 +1632,7 @@ FdoQueryDeviceRelations(
          ListEntry = ListEntry->Flink)
         Count++;
 
-    Size = FIELD_OFFSET(DEVICE_RELATIONS, Objects) + (sizeof (DEVICE_OBJECT) * __min(Count, 1));
+    Size = FIELD_OFFSET(DEVICE_RELATIONS, Objects) + (sizeof (PDEVICE_OBJECT) * __max(Count, 1));
 
     Relations = ExAllocatePoolWithTag(PagedPool, Size, 'FIV');
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Jul 14 10:57:56 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 14 Jul 2015 10:57:56 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZExuO-0006LB-2z; Tue, 14 Jul 2015 10:57:56 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZExuM-0006L6-Uv
	for win-pv-devel@lists.xenproject.org; Tue, 14 Jul 2015 10:57:55 +0000
Received: from [85.158.137.68] by server-10.bemta-3.messagelabs.com id
	6C/5F-03895-23BE4A55; Tue, 14 Jul 2015 10:57:54 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-31.messagelabs.com!1436871473!25559330!1
X-Originating-IP: [209.85.212.179]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30383 invoked from network); 14 Jul 2015 10:57:53 -0000
Received: from mail-wi0-f179.google.com (HELO mail-wi0-f179.google.com)
	(209.85.212.179)
	by server-12.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Jul 2015 10:57:53 -0000
Received: by wicmv11 with SMTP id mv11so11015000wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 14 Jul 2015 03:57:53 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=N2zicj2ctd1nLygVqswnLxS6V7U5jSjZMo65GEdgU5s=;
	b=UsdKaq2kyQ0m0K1ToxsiGYNgIk7QV+AflNx1ccwCXl2C+oXCzxULqGpzFDBbWNNG7C
	UEe5YFY2plu8Y/Ic8MIIj1xRRyzV4t05P0x0i578sihQ82XRRu9dBCBJGQlM+50Y1NBz
	tPQjog1W7FtpE4cv43cUnThgK4751YuAL873FTAP4+Sp7SfuUEKGXDO8uCHksJ9Ukx9O
	AgfMBOjadDLrSALPkv0C6WXbjf4y3DZAY4BlJqpEVgw68FZpO48OOJbnM06val8+s+lP
	JFcyJdifVuSxuWO11SJxCAsxnDMJyIxDUVgIO46976tmoAsXAQwaoIUd4KpQoJWpFIj+
	YZLA==
X-Received: by 10.180.20.48 with SMTP id k16mr32332771wie.56.1436871473216;
	Tue, 14 Jul 2015 03:57:53 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	s10sm10305647wik.6.2015.07.14.03.57.52
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 14 Jul 2015 03:57:52 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Tue, 14 Jul 2015 11:57:38 +0100
Message-Id: <1436871458-9152-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Fix potential buffer overflow
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The buffer allocation in FdoQueryDeviceRelations() is completely bogus. Fix
it.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/fdo.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/xenvif/fdo.c b/src/xenvif/fdo.c
index b903b09..aabc9c1 100644
--- a/src/xenvif/fdo.c
+++ b/src/xenvif/fdo.c
@@ -1632,7 +1632,7 @@ FdoQueryDeviceRelations(
          ListEntry = ListEntry->Flink)
         Count++;
 
-    Size = FIELD_OFFSET(DEVICE_RELATIONS, Objects) + (sizeof (DEVICE_OBJECT) * __min(Count, 1));
+    Size = FIELD_OFFSET(DEVICE_RELATIONS, Objects) + (sizeof (PDEVICE_OBJECT) * __max(Count, 1));
 
     Relations = ExAllocatePoolWithTag(PagedPool, Size, 'FIV');
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Jul 14 14:28:20 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 14 Jul 2015 14:28:20 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZF1Bz-0007Cr-Th; Tue, 14 Jul 2015 14:28:19 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZF1By-0007CW-SD
	for win-pv-devel@lists.xenproject.org; Tue, 14 Jul 2015 14:28:18 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	FE/DD-31258-28C15A55; Tue, 14 Jul 2015 14:28:18 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1436884097!32023652!1
X-Originating-IP: [209.85.212.171]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10694 invoked from network); 14 Jul 2015 14:28:17 -0000
Received: from mail-wi0-f171.google.com (HELO mail-wi0-f171.google.com)
	(209.85.212.171)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Jul 2015 14:28:17 -0000
Received: by wibud3 with SMTP id ud3so57192422wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 14 Jul 2015 07:28:17 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=yP7x6Vqt/IdoMjIMyonGDr7e9ossFMNlaNUs7DB/Lic=;
	b=yYUjVqDEqRBHMHdIDzwDPMRz5XwIEDqGLKua2fYVFBPbCVO26ntIC3nxxRQmwQnqxW
	MV0zGtiNGMV31LAxmKaYeRKJL1Wf0SAuHScJe0lloWdlgXqy6JlQbvbuDa3O2OffXRFZ
	TGg4yNced8N9cWvhIQwXWERBbZrzb0hc6R5cnCul3lqquRxQ+iG1j+QomLhR3m6WcdF7
	cHKWq4rpKa8NWEZ6gzjgI5fWUGxAlernIw08ZWeZPoTlCQhoZV2ORoKAe9tz+JMdM6FV
	i9wbqi0G8IWS535Fx9v/dL//GFAwUEjsuNVmpKFWsGH3iTiK7Q+VwaYiLW7ZBOz+a6Tj
	zGPg==
X-Received: by 10.194.22.105 with SMTP id c9mr82810805wjf.120.1436884097074;
	Tue, 14 Jul 2015 07:28:17 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id k5sm21160205wij.1.2015.07.14.07.28.16
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 14 Jul 2015 07:28:16 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Tue, 14 Jul 2015 15:28:04 +0100
Message-Id: <1436884084-8680-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Fix potential buffer overflow
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The buffer allocation in FdoQueryDeviceRelations() is completely bogus. Fix
it.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/fdo.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index cbd2d9a..8208111 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -3347,7 +3347,7 @@ FdoQueryDeviceRelations(
          ListEntry = ListEntry->Flink)
         Count++;
 
-    Size = FIELD_OFFSET(DEVICE_RELATIONS, Objects) + (sizeof (DEVICE_OBJECT) * __min(Count, 1));
+    Size = FIELD_OFFSET(DEVICE_RELATIONS, Objects) + (sizeof (PDEVICE_OBJECT) * __max(Count, 1));
 
     Relations = __AllocatePoolWithTag(PagedPool, Size, 'SUB');
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Jul 14 14:28:20 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 14 Jul 2015 14:28:20 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZF1Bz-0007Cr-Th; Tue, 14 Jul 2015 14:28:19 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZF1By-0007CW-SD
	for win-pv-devel@lists.xenproject.org; Tue, 14 Jul 2015 14:28:18 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	FE/DD-31258-28C15A55; Tue, 14 Jul 2015 14:28:18 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1436884097!32023652!1
X-Originating-IP: [209.85.212.171]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10694 invoked from network); 14 Jul 2015 14:28:17 -0000
Received: from mail-wi0-f171.google.com (HELO mail-wi0-f171.google.com)
	(209.85.212.171)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Jul 2015 14:28:17 -0000
Received: by wibud3 with SMTP id ud3so57192422wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 14 Jul 2015 07:28:17 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=yP7x6Vqt/IdoMjIMyonGDr7e9ossFMNlaNUs7DB/Lic=;
	b=yYUjVqDEqRBHMHdIDzwDPMRz5XwIEDqGLKua2fYVFBPbCVO26ntIC3nxxRQmwQnqxW
	MV0zGtiNGMV31LAxmKaYeRKJL1Wf0SAuHScJe0lloWdlgXqy6JlQbvbuDa3O2OffXRFZ
	TGg4yNced8N9cWvhIQwXWERBbZrzb0hc6R5cnCul3lqquRxQ+iG1j+QomLhR3m6WcdF7
	cHKWq4rpKa8NWEZ6gzjgI5fWUGxAlernIw08ZWeZPoTlCQhoZV2ORoKAe9tz+JMdM6FV
	i9wbqi0G8IWS535Fx9v/dL//GFAwUEjsuNVmpKFWsGH3iTiK7Q+VwaYiLW7ZBOz+a6Tj
	zGPg==
X-Received: by 10.194.22.105 with SMTP id c9mr82810805wjf.120.1436884097074;
	Tue, 14 Jul 2015 07:28:17 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id k5sm21160205wij.1.2015.07.14.07.28.16
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 14 Jul 2015 07:28:16 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Tue, 14 Jul 2015 15:28:04 +0100
Message-Id: <1436884084-8680-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Fix potential buffer overflow
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The buffer allocation in FdoQueryDeviceRelations() is completely bogus. Fix
it.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/fdo.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index cbd2d9a..8208111 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -3347,7 +3347,7 @@ FdoQueryDeviceRelations(
          ListEntry = ListEntry->Flink)
         Count++;
 
-    Size = FIELD_OFFSET(DEVICE_RELATIONS, Objects) + (sizeof (DEVICE_OBJECT) * __min(Count, 1));
+    Size = FIELD_OFFSET(DEVICE_RELATIONS, Objects) + (sizeof (PDEVICE_OBJECT) * __max(Count, 1));
 
     Relations = __AllocatePoolWithTag(PagedPool, Size, 'SUB');
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Jul 14 14:29:24 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 14 Jul 2015 14:29:24 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZF1D2-0007Gi-1d; Tue, 14 Jul 2015 14:29:24 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZF1D0-0007Gd-Ox
	for win-pv-devel@lists.xenproject.org; Tue, 14 Jul 2015 14:29:22 +0000
Received: from [85.158.139.211] by server-3.bemta-5.messagelabs.com id
	A2/DB-25757-2CC15A55; Tue, 14 Jul 2015 14:29:22 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-206.messagelabs.com!1436884131!21075509!1
X-Originating-IP: [209.85.212.178]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31146 invoked from network); 14 Jul 2015 14:28:51 -0000
Received: from mail-wi0-f178.google.com (HELO mail-wi0-f178.google.com)
	(209.85.212.178)
	by server-2.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Jul 2015 14:28:51 -0000
Received: by widic2 with SMTP id ic2so39776726wid.0
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 14 Jul 2015 07:28:51 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=tcMHtLVXguVuuASkckN5SPoZkw0LJmLGy1tZ+dU6dl8=;
	b=M0MmCPhVqxgHJ1lBieWeDD88+0mzP4Ro1Rq93P4dUMQsP8Ov8a6duThA47EjEIyX5A
	If52E9GWGC6moxoL+TErrR93phqWMfxqEz8AZvBlzMRkaZAGXsGYaj2YkCqBXWtvZ5aQ
	w2jTz6gdbQ0eDv/+cjdi1n3W3PIqkJUEQVe5Ed5aV38zo6wF/6FWaIPvUXcv1loosDSF
	N9TbInYvVasHlO6R4bIaAae9xh0pbVgpDQXwLPm1kb9buLOCmtFqH20BHvfck2FuQg7w
	CwAiRfNDR76n/u8MHhCf1mrWaVi2UM3k3doRUsYQcI0A4ThRTy4aaDbiJoahglEFxzEc
	2uKg==
X-Received: by 10.194.158.42 with SMTP id wr10mr76889452wjb.81.1436884131695; 
	Tue, 14 Jul 2015 07:28:51 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	s10sm11319901wik.6.2015.07.14.07.28.50
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 14 Jul 2015 07:28:51 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Tue, 14 Jul 2015 15:28:41 +0100
Message-Id: <1436884121-8508-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove PDO set/is-missing logic from XENFILT
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It's all completely unnecessary for a filter driver

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenfilt/fdo.c | 74 ++++++++++++++-----------------------------------------
 src/xenfilt/pdo.c | 67 ++++++++-----------------------------------------
 src/xenfilt/pdo.h | 16 ------------
 3 files changed, 29 insertions(+), 128 deletions(-)

diff --git a/src/xenfilt/fdo.c b/src/xenfilt/fdo.c
index cff179b..25b3dc2 100644
--- a/src/xenfilt/fdo.c
+++ b/src/xenfilt/fdo.c
@@ -536,43 +536,22 @@ FdoEnumerate(
         PLIST_ENTRY     Next = ListEntry->Flink;
         PXENFILT_DX     Dx = CONTAINING_RECORD(ListEntry, XENFILT_DX, ListEntry);
         PXENFILT_PDO    Pdo = Dx->Pdo;
-        BOOLEAN         Missing;
 
-        Missing = TRUE;
         for (Index = 0; Index < Count; Index++) {
             if (PdoGetPhysicalDeviceObject(Pdo) == PhysicalDeviceObject[Index]) {
-                Missing = FALSE;
-#pragma prefast(suppress:6387)  // PhysicalDeviceObject[Index] could be NULL
-                ObDereferenceObject(PhysicalDeviceObject[Index]);
                 PhysicalDeviceObject[Index] = NULL; // avoid duplication
                 break;
             }
         }
 
-        if (Missing &&
-            !PdoIsMissing(Pdo) &&
-            PdoGetDevicePnpState(Pdo) != Deleted) {
-            PdoSetMissing(Pdo, "device disappeared");
-
-            // If the PDO has not yet been enumerated then we can go ahead
-            // and mark it as deleted, otherwise we need to notify PnP manager and
-            // wait for the REMOVE_DEVICE IRP.
-            if (PdoGetDevicePnpState(Pdo) == Present) {
-                PdoSetDevicePnpState(Pdo, Deleted);
-                PdoDestroy(Pdo);
-            }
-        }
-
         ListEntry = Next;
     }
 
     // Walk the list and create PDO filters for any new devices
     for (Index = 0; Index < Count; Index++) {
 #pragma warning(suppress:6385)  // Reading invalid data from 'PhysicalDeviceObject'
-        if (PhysicalDeviceObject[Index] != NULL) {
+        if (PhysicalDeviceObject[Index] != NULL)
             (VOID) FdoAddDevice(Fdo, PhysicalDeviceObject[Index]);
-            ObDereferenceObject(PhysicalDeviceObject[Index]);
-        }
     }
     
     __FdoReleaseMutex(Fdo);
@@ -1101,8 +1080,8 @@ FdoQueryDeviceRelations(
     KEVENT                  Event;
     PIO_STACK_LOCATION      StackLocation;
     ULONG                   Size;
+    PDEVICE_RELATIONS       LowerRelations;
     PDEVICE_RELATIONS       Relations;
-    PLIST_ENTRY             ListEntry;
     XENFILT_FILTER_STATE    State;
     ULONG                   Count;
     NTSTATUS                status;
@@ -1140,24 +1119,14 @@ FdoQueryDeviceRelations(
     if (StackLocation->Parameters.QueryDeviceRelations.Type != BusRelations)
         goto done;
 
-    Relations = (PDEVICE_RELATIONS)Irp->IoStatus.Information;
-
-    if (Relations->Count != 0)
-        FdoEnumerate(Fdo, Relations);
+    LowerRelations = (PDEVICE_RELATIONS)Irp->IoStatus.Information;
 
-    ExFreePool(Relations);
-
-    __FdoAcquireMutex(Fdo);
+    if (LowerRelations->Count != 0)
+        FdoEnumerate(Fdo, LowerRelations);
 
     State = DriverGetFilterState();
-    Count = 0;
 
-    if (State == XENFILT_FILTER_DISABLED) {
-        for (ListEntry = Fdo->List.Flink;
-             ListEntry != &Fdo->List;
-             ListEntry = ListEntry->Flink)
-            Count++;
-    }
+    Count = (State == XENFILT_FILTER_DISABLED) ? LowerRelations->Count : 0;
 
     Size = FIELD_OFFSET(DEVICE_RELATIONS, Objects) +
            (sizeof (PDEVICE_OBJECT) * __max(Count, 1));
@@ -1169,35 +1138,26 @@ FdoQueryDeviceRelations(
         goto fail3;
 
     if (State == XENFILT_FILTER_DISABLED) {
-        for (ListEntry = Fdo->List.Flink;
-             ListEntry != &Fdo->List;
-             ListEntry = ListEntry->Flink) {
-            PXENFILT_DX     Dx = CONTAINING_RECORD(ListEntry, XENFILT_DX, ListEntry);
-            PXENFILT_PDO    Pdo = Dx->Pdo;
-
-            ASSERT3U(Dx->Type, ==, PHYSICAL_DEVICE_OBJECT);
-
-            if (PdoGetDevicePnpState(Pdo) == Present)
-                PdoSetDevicePnpState(Pdo, Enumerated);
-
-            ObReferenceObject(PdoGetPhysicalDeviceObject(Pdo));
-            Relations->Objects[Relations->Count++] = PdoGetPhysicalDeviceObject(Pdo);
-        }
-
-        ASSERT3U(Relations->Count, <=, Count);
+        ASSERT3U(Count, ==, LowerRelations->Count);
+        RtlCopyMemory(Relations, LowerRelations, Size);
 
         Trace("%s: %d PDO(s)\n",
               __FdoGetName(Fdo),
               Relations->Count);
     } else {
+        ULONG   Index;
+
         Trace("%s: FILTERED\n",
               __FdoGetName(Fdo));
 
+        for (Index = 0; Index < LowerRelations->Count; Index++)
+            ObDereferenceObject(LowerRelations->Objects[Index]);
+
         IoInvalidateDeviceRelations(__FdoGetPhysicalDeviceObject(Fdo),
                                     BusRelations);
     }
 
-    __FdoReleaseMutex(Fdo);
+    ExFreePool(LowerRelations);
 
     Irp->IoStatus.Information = (ULONG_PTR)Relations;
     status = STATUS_SUCCESS;
@@ -1211,12 +1171,16 @@ done:
     return status;
 
 fail3:
-    __FdoReleaseMutex(Fdo);
+    Error("fail3\n");
 
 fail2:
+    Error("fail2\n");
+
     IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
 
 fail1:
+    Error("fail1 (%08x)\n", status);
+
     Irp->IoStatus.Status = status;
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
diff --git a/src/xenfilt/pdo.c b/src/xenfilt/pdo.c
index 893c76d..230fdf0 100644
--- a/src/xenfilt/pdo.c
+++ b/src/xenfilt/pdo.c
@@ -62,8 +62,6 @@ struct _XENFILT_PDO {
     PIRP                            DevicePowerIrp;
 
     PXENFILT_FDO                    Fdo;
-    BOOLEAN                         Missing;
-    const CHAR                      *Reason;
 
     XENFILT_EMULATED_OBJECT_TYPE    Type;
     PXENFILT_EMULATED_OBJECT        EmulatedObject;
@@ -189,41 +187,6 @@ PdoGetPhysicalDeviceObject(
     return Pdo->PhysicalDeviceObject;
 }
 
-static FORCEINLINE VOID
-__PdoSetMissing(
-    IN  PXENFILT_PDO    Pdo,
-    IN  const CHAR      *Reason
-    )
-{
-    Pdo->Reason = Reason;
-    Pdo->Missing = TRUE;
-}
-
-VOID
-PdoSetMissing(
-    IN  PXENFILT_PDO    Pdo,
-    IN  const CHAR      *Reason
-    )
-{
-    __PdoSetMissing(Pdo, Reason);
-}
-
-static FORCEINLINE BOOLEAN
-__PdoIsMissing(
-    IN  PXENFILT_PDO    Pdo
-    )
-{
-    return Pdo->Missing;
-}
-
-BOOLEAN
-PdoIsMissing(
-    IN  PXENFILT_PDO    Pdo
-    )
-{
-    return __PdoIsMissing(Pdo);
-}
-
 static FORCEINLINE PDEVICE_OBJECT
 __PdoGetDeviceObject(
     IN  PXENFILT_PDO    Pdo
@@ -817,22 +780,18 @@ PdoRemoveDevice(
     __PdoSetDevicePowerState(Pdo, PowerDeviceD3);
 
 done:
-    if (__PdoIsMissing(Pdo)) {
-        __PdoSetDevicePnpState(Pdo, Deleted);
-        IoReleaseRemoveLockAndWait(&Pdo->Dx->RemoveLock, Irp);
-    } else {
-        __PdoSetDevicePnpState(Pdo, Enumerated);
-        IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
-    }
+    FdoAcquireMutex(Fdo);
+    __PdoSetDevicePnpState(Pdo, Deleted);
+    FdoReleaseMutex(Fdo);
+
+    IoReleaseRemoveLockAndWait(&Pdo->Dx->RemoveLock, Irp);
 
     status = PdoForwardIrpSynchronously(Pdo, Irp);
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
-    if (__PdoIsMissing(Pdo)) {
-        FdoAcquireMutex(Fdo);
-        PdoDestroy(Pdo);
-        FdoReleaseMutex(Fdo);
-    }
+    FdoAcquireMutex(Fdo);
+    PdoDestroy(Pdo);
+    FdoReleaseMutex(Fdo);
 
     return status;
 
@@ -1086,7 +1045,6 @@ PdoEject(
     PXENFILT_FDO        Fdo = __PdoGetFdo(Pdo);
     NTSTATUS            status;
 
-    __PdoSetMissing(Pdo, "Ejected");
     __PdoSetDevicePnpState(Pdo, Deleted);
 
     status = PdoForwardIrpSynchronously(Pdo, Irp);
@@ -2072,18 +2030,13 @@ PdoDestroy(
 
     ASSERT3U(__PdoGetDevicePnpState(Pdo), ==, Deleted);
 
-    ASSERT(__PdoIsMissing(Pdo));
-    Pdo->Missing = FALSE;
-
     FdoRemovePhysicalDeviceObject(Fdo, Pdo);
 
     Dx->Pdo = NULL;
 
-    Info("%p (%s) (%s)\n",
+    Info("%p (%s)\n",
          FilterDeviceObject,
-         __PdoGetName(Pdo),
-         Pdo->Reason);
-    Pdo->Reason = NULL;
+         __PdoGetName(Pdo));
 
     RtlZeroMemory(Pdo->Name, sizeof (Pdo->Name));
 
diff --git a/src/xenfilt/pdo.h b/src/xenfilt/pdo.h
index f44278e..05ca049 100644
--- a/src/xenfilt/pdo.h
+++ b/src/xenfilt/pdo.h
@@ -56,22 +56,6 @@ PdoGetPhysicalDeviceObject(
     IN  PXENFILT_PDO    Pdo
     );
 
-extern BOOLEAN
-PdoIsMissing(
-    IN  PXENFILT_PDO    Pdo
-    );
-
-extern VOID
-PdoSetMissing(
-    IN  PXENFILT_PDO    Pdo,
-    IN  const CHAR      *Reason
-    );
-
-extern BOOLEAN
-PdoIsMasked(
-    IN  PXENFILT_PDO    Pdo
-    );
-
 extern PDEVICE_OBJECT
 PdoGetDeviceObject(
     IN  PXENFILT_PDO    Pdo
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Jul 14 14:29:24 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 14 Jul 2015 14:29:24 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZF1D2-0007Gi-1d; Tue, 14 Jul 2015 14:29:24 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZF1D0-0007Gd-Ox
	for win-pv-devel@lists.xenproject.org; Tue, 14 Jul 2015 14:29:22 +0000
Received: from [85.158.139.211] by server-3.bemta-5.messagelabs.com id
	A2/DB-25757-2CC15A55; Tue, 14 Jul 2015 14:29:22 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-206.messagelabs.com!1436884131!21075509!1
X-Originating-IP: [209.85.212.178]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31146 invoked from network); 14 Jul 2015 14:28:51 -0000
Received: from mail-wi0-f178.google.com (HELO mail-wi0-f178.google.com)
	(209.85.212.178)
	by server-2.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Jul 2015 14:28:51 -0000
Received: by widic2 with SMTP id ic2so39776726wid.0
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 14 Jul 2015 07:28:51 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=tcMHtLVXguVuuASkckN5SPoZkw0LJmLGy1tZ+dU6dl8=;
	b=M0MmCPhVqxgHJ1lBieWeDD88+0mzP4Ro1Rq93P4dUMQsP8Ov8a6duThA47EjEIyX5A
	If52E9GWGC6moxoL+TErrR93phqWMfxqEz8AZvBlzMRkaZAGXsGYaj2YkCqBXWtvZ5aQ
	w2jTz6gdbQ0eDv/+cjdi1n3W3PIqkJUEQVe5Ed5aV38zo6wF/6FWaIPvUXcv1loosDSF
	N9TbInYvVasHlO6R4bIaAae9xh0pbVgpDQXwLPm1kb9buLOCmtFqH20BHvfck2FuQg7w
	CwAiRfNDR76n/u8MHhCf1mrWaVi2UM3k3doRUsYQcI0A4ThRTy4aaDbiJoahglEFxzEc
	2uKg==
X-Received: by 10.194.158.42 with SMTP id wr10mr76889452wjb.81.1436884131695; 
	Tue, 14 Jul 2015 07:28:51 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	s10sm11319901wik.6.2015.07.14.07.28.50
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 14 Jul 2015 07:28:51 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Tue, 14 Jul 2015 15:28:41 +0100
Message-Id: <1436884121-8508-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove PDO set/is-missing logic from XENFILT
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It's all completely unnecessary for a filter driver

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenfilt/fdo.c | 74 ++++++++++++++-----------------------------------------
 src/xenfilt/pdo.c | 67 ++++++++-----------------------------------------
 src/xenfilt/pdo.h | 16 ------------
 3 files changed, 29 insertions(+), 128 deletions(-)

diff --git a/src/xenfilt/fdo.c b/src/xenfilt/fdo.c
index cff179b..25b3dc2 100644
--- a/src/xenfilt/fdo.c
+++ b/src/xenfilt/fdo.c
@@ -536,43 +536,22 @@ FdoEnumerate(
         PLIST_ENTRY     Next = ListEntry->Flink;
         PXENFILT_DX     Dx = CONTAINING_RECORD(ListEntry, XENFILT_DX, ListEntry);
         PXENFILT_PDO    Pdo = Dx->Pdo;
-        BOOLEAN         Missing;
 
-        Missing = TRUE;
         for (Index = 0; Index < Count; Index++) {
             if (PdoGetPhysicalDeviceObject(Pdo) == PhysicalDeviceObject[Index]) {
-                Missing = FALSE;
-#pragma prefast(suppress:6387)  // PhysicalDeviceObject[Index] could be NULL
-                ObDereferenceObject(PhysicalDeviceObject[Index]);
                 PhysicalDeviceObject[Index] = NULL; // avoid duplication
                 break;
             }
         }
 
-        if (Missing &&
-            !PdoIsMissing(Pdo) &&
-            PdoGetDevicePnpState(Pdo) != Deleted) {
-            PdoSetMissing(Pdo, "device disappeared");
-
-            // If the PDO has not yet been enumerated then we can go ahead
-            // and mark it as deleted, otherwise we need to notify PnP manager and
-            // wait for the REMOVE_DEVICE IRP.
-            if (PdoGetDevicePnpState(Pdo) == Present) {
-                PdoSetDevicePnpState(Pdo, Deleted);
-                PdoDestroy(Pdo);
-            }
-        }
-
         ListEntry = Next;
     }
 
     // Walk the list and create PDO filters for any new devices
     for (Index = 0; Index < Count; Index++) {
 #pragma warning(suppress:6385)  // Reading invalid data from 'PhysicalDeviceObject'
-        if (PhysicalDeviceObject[Index] != NULL) {
+        if (PhysicalDeviceObject[Index] != NULL)
             (VOID) FdoAddDevice(Fdo, PhysicalDeviceObject[Index]);
-            ObDereferenceObject(PhysicalDeviceObject[Index]);
-        }
     }
     
     __FdoReleaseMutex(Fdo);
@@ -1101,8 +1080,8 @@ FdoQueryDeviceRelations(
     KEVENT                  Event;
     PIO_STACK_LOCATION      StackLocation;
     ULONG                   Size;
+    PDEVICE_RELATIONS       LowerRelations;
     PDEVICE_RELATIONS       Relations;
-    PLIST_ENTRY             ListEntry;
     XENFILT_FILTER_STATE    State;
     ULONG                   Count;
     NTSTATUS                status;
@@ -1140,24 +1119,14 @@ FdoQueryDeviceRelations(
     if (StackLocation->Parameters.QueryDeviceRelations.Type != BusRelations)
         goto done;
 
-    Relations = (PDEVICE_RELATIONS)Irp->IoStatus.Information;
-
-    if (Relations->Count != 0)
-        FdoEnumerate(Fdo, Relations);
+    LowerRelations = (PDEVICE_RELATIONS)Irp->IoStatus.Information;
 
-    ExFreePool(Relations);
-
-    __FdoAcquireMutex(Fdo);
+    if (LowerRelations->Count != 0)
+        FdoEnumerate(Fdo, LowerRelations);
 
     State = DriverGetFilterState();
-    Count = 0;
 
-    if (State == XENFILT_FILTER_DISABLED) {
-        for (ListEntry = Fdo->List.Flink;
-             ListEntry != &Fdo->List;
-             ListEntry = ListEntry->Flink)
-            Count++;
-    }
+    Count = (State == XENFILT_FILTER_DISABLED) ? LowerRelations->Count : 0;
 
     Size = FIELD_OFFSET(DEVICE_RELATIONS, Objects) +
            (sizeof (PDEVICE_OBJECT) * __max(Count, 1));
@@ -1169,35 +1138,26 @@ FdoQueryDeviceRelations(
         goto fail3;
 
     if (State == XENFILT_FILTER_DISABLED) {
-        for (ListEntry = Fdo->List.Flink;
-             ListEntry != &Fdo->List;
-             ListEntry = ListEntry->Flink) {
-            PXENFILT_DX     Dx = CONTAINING_RECORD(ListEntry, XENFILT_DX, ListEntry);
-            PXENFILT_PDO    Pdo = Dx->Pdo;
-
-            ASSERT3U(Dx->Type, ==, PHYSICAL_DEVICE_OBJECT);
-
-            if (PdoGetDevicePnpState(Pdo) == Present)
-                PdoSetDevicePnpState(Pdo, Enumerated);
-
-            ObReferenceObject(PdoGetPhysicalDeviceObject(Pdo));
-            Relations->Objects[Relations->Count++] = PdoGetPhysicalDeviceObject(Pdo);
-        }
-
-        ASSERT3U(Relations->Count, <=, Count);
+        ASSERT3U(Count, ==, LowerRelations->Count);
+        RtlCopyMemory(Relations, LowerRelations, Size);
 
         Trace("%s: %d PDO(s)\n",
               __FdoGetName(Fdo),
               Relations->Count);
     } else {
+        ULONG   Index;
+
         Trace("%s: FILTERED\n",
               __FdoGetName(Fdo));
 
+        for (Index = 0; Index < LowerRelations->Count; Index++)
+            ObDereferenceObject(LowerRelations->Objects[Index]);
+
         IoInvalidateDeviceRelations(__FdoGetPhysicalDeviceObject(Fdo),
                                     BusRelations);
     }
 
-    __FdoReleaseMutex(Fdo);
+    ExFreePool(LowerRelations);
 
     Irp->IoStatus.Information = (ULONG_PTR)Relations;
     status = STATUS_SUCCESS;
@@ -1211,12 +1171,16 @@ done:
     return status;
 
 fail3:
-    __FdoReleaseMutex(Fdo);
+    Error("fail3\n");
 
 fail2:
+    Error("fail2\n");
+
     IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
 
 fail1:
+    Error("fail1 (%08x)\n", status);
+
     Irp->IoStatus.Status = status;
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
diff --git a/src/xenfilt/pdo.c b/src/xenfilt/pdo.c
index 893c76d..230fdf0 100644
--- a/src/xenfilt/pdo.c
+++ b/src/xenfilt/pdo.c
@@ -62,8 +62,6 @@ struct _XENFILT_PDO {
     PIRP                            DevicePowerIrp;
 
     PXENFILT_FDO                    Fdo;
-    BOOLEAN                         Missing;
-    const CHAR                      *Reason;
 
     XENFILT_EMULATED_OBJECT_TYPE    Type;
     PXENFILT_EMULATED_OBJECT        EmulatedObject;
@@ -189,41 +187,6 @@ PdoGetPhysicalDeviceObject(
     return Pdo->PhysicalDeviceObject;
 }
 
-static FORCEINLINE VOID
-__PdoSetMissing(
-    IN  PXENFILT_PDO    Pdo,
-    IN  const CHAR      *Reason
-    )
-{
-    Pdo->Reason = Reason;
-    Pdo->Missing = TRUE;
-}
-
-VOID
-PdoSetMissing(
-    IN  PXENFILT_PDO    Pdo,
-    IN  const CHAR      *Reason
-    )
-{
-    __PdoSetMissing(Pdo, Reason);
-}
-
-static FORCEINLINE BOOLEAN
-__PdoIsMissing(
-    IN  PXENFILT_PDO    Pdo
-    )
-{
-    return Pdo->Missing;
-}
-
-BOOLEAN
-PdoIsMissing(
-    IN  PXENFILT_PDO    Pdo
-    )
-{
-    return __PdoIsMissing(Pdo);
-}
-
 static FORCEINLINE PDEVICE_OBJECT
 __PdoGetDeviceObject(
     IN  PXENFILT_PDO    Pdo
@@ -817,22 +780,18 @@ PdoRemoveDevice(
     __PdoSetDevicePowerState(Pdo, PowerDeviceD3);
 
 done:
-    if (__PdoIsMissing(Pdo)) {
-        __PdoSetDevicePnpState(Pdo, Deleted);
-        IoReleaseRemoveLockAndWait(&Pdo->Dx->RemoveLock, Irp);
-    } else {
-        __PdoSetDevicePnpState(Pdo, Enumerated);
-        IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
-    }
+    FdoAcquireMutex(Fdo);
+    __PdoSetDevicePnpState(Pdo, Deleted);
+    FdoReleaseMutex(Fdo);
+
+    IoReleaseRemoveLockAndWait(&Pdo->Dx->RemoveLock, Irp);
 
     status = PdoForwardIrpSynchronously(Pdo, Irp);
     IoCompleteRequest(Irp, IO_NO_INCREMENT);
 
-    if (__PdoIsMissing(Pdo)) {
-        FdoAcquireMutex(Fdo);
-        PdoDestroy(Pdo);
-        FdoReleaseMutex(Fdo);
-    }
+    FdoAcquireMutex(Fdo);
+    PdoDestroy(Pdo);
+    FdoReleaseMutex(Fdo);
 
     return status;
 
@@ -1086,7 +1045,6 @@ PdoEject(
     PXENFILT_FDO        Fdo = __PdoGetFdo(Pdo);
     NTSTATUS            status;
 
-    __PdoSetMissing(Pdo, "Ejected");
     __PdoSetDevicePnpState(Pdo, Deleted);
 
     status = PdoForwardIrpSynchronously(Pdo, Irp);
@@ -2072,18 +2030,13 @@ PdoDestroy(
 
     ASSERT3U(__PdoGetDevicePnpState(Pdo), ==, Deleted);
 
-    ASSERT(__PdoIsMissing(Pdo));
-    Pdo->Missing = FALSE;
-
     FdoRemovePhysicalDeviceObject(Fdo, Pdo);
 
     Dx->Pdo = NULL;
 
-    Info("%p (%s) (%s)\n",
+    Info("%p (%s)\n",
          FilterDeviceObject,
-         __PdoGetName(Pdo),
-         Pdo->Reason);
-    Pdo->Reason = NULL;
+         __PdoGetName(Pdo));
 
     RtlZeroMemory(Pdo->Name, sizeof (Pdo->Name));
 
diff --git a/src/xenfilt/pdo.h b/src/xenfilt/pdo.h
index f44278e..05ca049 100644
--- a/src/xenfilt/pdo.h
+++ b/src/xenfilt/pdo.h
@@ -56,22 +56,6 @@ PdoGetPhysicalDeviceObject(
     IN  PXENFILT_PDO    Pdo
     );
 
-extern BOOLEAN
-PdoIsMissing(
-    IN  PXENFILT_PDO    Pdo
-    );
-
-extern VOID
-PdoSetMissing(
-    IN  PXENFILT_PDO    Pdo,
-    IN  const CHAR      *Reason
-    );
-
-extern BOOLEAN
-PdoIsMasked(
-    IN  PXENFILT_PDO    Pdo
-    );
-
 extern PDEVICE_OBJECT
 PdoGetDeviceObject(
     IN  PXENFILT_PDO    Pdo
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Jul 14 15:06:18 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 14 Jul 2015 15:06:18 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZF1mk-0002JL-04; Tue, 14 Jul 2015 15:06:18 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1ZF1mi-0002JA-RI
	for win-pv-devel@lists.xenproject.org; Tue, 14 Jul 2015 15:06:17 +0000
Received: from [193.109.254.147] by server-4.bemta-14.messagelabs.com id
	C1/CF-27764-86525A55; Tue, 14 Jul 2015 15:06:16 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1436886375!32004072!1
X-Originating-IP: [66.111.4.25]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjUgPT4gNDQ5ODE=\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11268 invoked from network); 14 Jul 2015 15:06:15 -0000
Received: from out1-smtp.messagingengine.com (HELO
	out1-smtp.messagingengine.com) (66.111.4.25)
	by server-2.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Jul 2015 15:06:15 -0000
Received: from compute3.internal (compute3.nyi.internal [10.202.2.43])
	by mailout.nyi.internal (Postfix) with ESMTP id D5DE920724
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 14 Jul 2015 11:06:14 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute3.internal (MEProxy); Tue, 14 Jul 2015 11:06:14 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:message-id:mime-version:subject:to:x-sasl-enc
	:x-sasl-enc; s=mesmtp; bh=FApP3FPQBlwWd1PQ7pHrM5QktX8=; b=Blorzq
	YZMCLKxjX2rPj+ptji0pg+bLBQqq1p9q1aHyQKUm3mf61C3dIod+ZqHLbCPgZhY5
	dGdxJvu7NuA16wPasm7h7oJyhhtbJbi36YJhdIRwwbsQP+gyUJZdjl2HHC31NMwo
	gUCHKeQa23dEO+9B7H7Hh3DLs5hyDHHgjG290=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:message-id:mime-version:subject:to:x-sasl-enc
	:x-sasl-enc; s=smtpout; bh=FApP3FPQBlwWd1PQ7pHrM5QktX8=; b=lVbAN
	gjRnzfNFyI8D/bBmgtP5RuuA5xxwh+G4zOAicpVSDpBcxk13Q3Mlqe15oxLMFTmg
	+n1O0mg11Nj4Fjj1OCmUfMvMibOY+UFrvEaU+vOX1GpqVrxa+lFh4M05oZBI47k6
	065zMEek17lT1sk6uVhOBE8Fc1p9GjywKsvDos=
X-Sasl-enc: /2JrF630Yvpjk7U74GBCbS0ZokiTq/djOycOgA2qAO1v 1436886374
Received: from [192.168.0.3] (89-67-247-126.dynamic.chello.pl [89.67.247.126])
	by mail.messagingengine.com (Postfix) with ESMTPA id 64899680188
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 14 Jul 2015 11:06:14 -0400 (EDT)
Message-ID: <55A52565.7070205@invisiblethingslab.com>
Date: Tue, 14 Jul 2015 17:06:13 +0200
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:31.0) Gecko/20100101 Thunderbird/31.7.0
MIME-Version: 1.0
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Content-Length:1070
Subject: [win-pv-devel] Debug print levels
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

SXMgdGhlcmUgYSBzcGVjaWZpYyByZWFzb24gZm9yIHRoZSBkcml2ZXJzIGZvcmNlLXVubWFza2lu
ZyBhbGwgc3lzdGVtCmRlYnVnIHByaW50IGxldmVscyBvbiBpbml0aWFsaXphdGlvbiAoX19EYmdQ
cmludEVuYWJsZSk/IFRoaXMgb3ZlcnJpZGVzCmFueSBmaWx0ZXIgc2V0dGluZ3MgaW4gdGhlIHJl
Z2lzdHJ5IGFuZCBtYWtlcyBkZWJ1Z2dpbmcgYSBiaXQgYW5ub3lpbmcuCkknbSB1c2luZyB0aGUg
aGlnaGVzdCBsZXZlbCBmb3Igc29tZSBoaWdoLXZvbHVtZSBvdXRwdXQgYW5kIG5vcm1hbGx5Cndh
bnQgaXQgZGlzYWJsZWQuIEN1cnJlbnRseSBJIGNhbid0IGNvbmZpZ3VyZSB0aGF0IGluIHRoZSBy
ZWdpc3RyeSBhbmQKbmVlZCB0byBtYW51YWxseSBicmVhayBpbiB0aGUgZGVidWdnZXIgKmFmdGVy
KiBQViBkcml2ZXJzIGFyZSBsb2FkZWQgYW5kCmNoYW5nZSB0aGUgZmlsdGVyIG1hc2tzIGRpcmVj
dGx5LiBJIGd1ZXNzIHRoZSBpc3N1ZSBpcyB0aGF0IElIVkRSSVZFUiBpZAppcyBtZWFudCB0byBi
ZSB1c2VkIGJ5IGV2ZXJ5b25lLi4uCgotLSAKUmFmYcWCIFdvamR5xYJhClF1YmVzIFRvb2xzIGZv
ciBXaW5kb3dzIGRldmVsb3BlcgpodHRwczovL3d3dy5xdWJlcy1vcy5vcmcvCgpfX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYtZGV2ZWwgbWFpbGlu
ZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwOi8vbGlzdHMueGVu
cHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Tue Jul 14 15:06:18 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 14 Jul 2015 15:06:18 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZF1mk-0002JL-04; Tue, 14 Jul 2015 15:06:18 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1ZF1mi-0002JA-RI
	for win-pv-devel@lists.xenproject.org; Tue, 14 Jul 2015 15:06:17 +0000
Received: from [193.109.254.147] by server-4.bemta-14.messagelabs.com id
	C1/CF-27764-86525A55; Tue, 14 Jul 2015 15:06:16 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1436886375!32004072!1
X-Originating-IP: [66.111.4.25]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjUgPT4gNDQ5ODE=\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11268 invoked from network); 14 Jul 2015 15:06:15 -0000
Received: from out1-smtp.messagingengine.com (HELO
	out1-smtp.messagingengine.com) (66.111.4.25)
	by server-2.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Jul 2015 15:06:15 -0000
Received: from compute3.internal (compute3.nyi.internal [10.202.2.43])
	by mailout.nyi.internal (Postfix) with ESMTP id D5DE920724
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 14 Jul 2015 11:06:14 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute3.internal (MEProxy); Tue, 14 Jul 2015 11:06:14 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:message-id:mime-version:subject:to:x-sasl-enc
	:x-sasl-enc; s=mesmtp; bh=FApP3FPQBlwWd1PQ7pHrM5QktX8=; b=Blorzq
	YZMCLKxjX2rPj+ptji0pg+bLBQqq1p9q1aHyQKUm3mf61C3dIod+ZqHLbCPgZhY5
	dGdxJvu7NuA16wPasm7h7oJyhhtbJbi36YJhdIRwwbsQP+gyUJZdjl2HHC31NMwo
	gUCHKeQa23dEO+9B7H7Hh3DLs5hyDHHgjG290=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:message-id:mime-version:subject:to:x-sasl-enc
	:x-sasl-enc; s=smtpout; bh=FApP3FPQBlwWd1PQ7pHrM5QktX8=; b=lVbAN
	gjRnzfNFyI8D/bBmgtP5RuuA5xxwh+G4zOAicpVSDpBcxk13Q3Mlqe15oxLMFTmg
	+n1O0mg11Nj4Fjj1OCmUfMvMibOY+UFrvEaU+vOX1GpqVrxa+lFh4M05oZBI47k6
	065zMEek17lT1sk6uVhOBE8Fc1p9GjywKsvDos=
X-Sasl-enc: /2JrF630Yvpjk7U74GBCbS0ZokiTq/djOycOgA2qAO1v 1436886374
Received: from [192.168.0.3] (89-67-247-126.dynamic.chello.pl [89.67.247.126])
	by mail.messagingengine.com (Postfix) with ESMTPA id 64899680188
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 14 Jul 2015 11:06:14 -0400 (EDT)
Message-ID: <55A52565.7070205@invisiblethingslab.com>
Date: Tue, 14 Jul 2015 17:06:13 +0200
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:31.0) Gecko/20100101 Thunderbird/31.7.0
MIME-Version: 1.0
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Content-Length:1070
Subject: [win-pv-devel] Debug print levels
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

SXMgdGhlcmUgYSBzcGVjaWZpYyByZWFzb24gZm9yIHRoZSBkcml2ZXJzIGZvcmNlLXVubWFza2lu
ZyBhbGwgc3lzdGVtCmRlYnVnIHByaW50IGxldmVscyBvbiBpbml0aWFsaXphdGlvbiAoX19EYmdQ
cmludEVuYWJsZSk/IFRoaXMgb3ZlcnJpZGVzCmFueSBmaWx0ZXIgc2V0dGluZ3MgaW4gdGhlIHJl
Z2lzdHJ5IGFuZCBtYWtlcyBkZWJ1Z2dpbmcgYSBiaXQgYW5ub3lpbmcuCkknbSB1c2luZyB0aGUg
aGlnaGVzdCBsZXZlbCBmb3Igc29tZSBoaWdoLXZvbHVtZSBvdXRwdXQgYW5kIG5vcm1hbGx5Cndh
bnQgaXQgZGlzYWJsZWQuIEN1cnJlbnRseSBJIGNhbid0IGNvbmZpZ3VyZSB0aGF0IGluIHRoZSBy
ZWdpc3RyeSBhbmQKbmVlZCB0byBtYW51YWxseSBicmVhayBpbiB0aGUgZGVidWdnZXIgKmFmdGVy
KiBQViBkcml2ZXJzIGFyZSBsb2FkZWQgYW5kCmNoYW5nZSB0aGUgZmlsdGVyIG1hc2tzIGRpcmVj
dGx5LiBJIGd1ZXNzIHRoZSBpc3N1ZSBpcyB0aGF0IElIVkRSSVZFUiBpZAppcyBtZWFudCB0byBi
ZSB1c2VkIGJ5IGV2ZXJ5b25lLi4uCgotLSAKUmFmYcWCIFdvamR5xYJhClF1YmVzIFRvb2xzIGZv
ciBXaW5kb3dzIGRldmVsb3BlcgpodHRwczovL3d3dy5xdWJlcy1vcy5vcmcvCgpfX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYtZGV2ZWwgbWFpbGlu
ZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwOi8vbGlzdHMueGVu
cHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Tue Jul 14 15:11:59 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 14 Jul 2015 15:11:59 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZF1sE-0002Y3-QV; Tue, 14 Jul 2015 15:11:58 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=6306ade7a=Paul.Durrant@citrix.com>)
	id 1ZF1sD-0002Xl-Uk
	for win-pv-devel@lists.xenproject.org; Tue, 14 Jul 2015 15:11:58 +0000
Received: from [193.109.254.147] by server-13.bemta-14.messagelabs.com id
	38/4B-16813-DB625A55; Tue, 14 Jul 2015 15:11:57 +0000
X-Env-Sender: prvs=6306ade7a=Paul.Durrant@citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1436886716!32057064!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4047 invoked from network); 14 Jul 2015 15:11:56 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Jul 2015 15:11:56 -0000
X-IronPort-AV: E=Sophos;i="5.15,472,1432598400"; 
   d="scan'208";a="1331946"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Debug print levels
Thread-Index: AQHQvkcjUHp3Dl/OPEK2kZMRDQzNpZ3bEiZA
Date: Tue, 14 Jul 2015 15:11:55 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C30AF@AMSPEX01CL02.citrite.net>
References: <55A52565.7070205@invisiblethingslab.com>
In-Reply-To: <55A52565.7070205@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Debug print levels
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNl
c0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0NCj4gYm91bmNlc0Bs
aXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGENCj4gU2VudDog
MTQgSnVseSAyMDE1IDE2OjA2DQo+IFRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5v
cmcNCj4gU3ViamVjdDogW3dpbi1wdi1kZXZlbF0gRGVidWcgcHJpbnQgbGV2ZWxzDQo+IA0KPiBJ
cyB0aGVyZSBhIHNwZWNpZmljIHJlYXNvbiBmb3IgdGhlIGRyaXZlcnMgZm9yY2UtdW5tYXNraW5n
IGFsbCBzeXN0ZW0NCj4gZGVidWcgcHJpbnQgbGV2ZWxzIG9uIGluaXRpYWxpemF0aW9uIChfX0Ri
Z1ByaW50RW5hYmxlKT8gVGhpcyBvdmVycmlkZXMNCj4gYW55IGZpbHRlciBzZXR0aW5ncyBpbiB0
aGUgcmVnaXN0cnkgYW5kIG1ha2VzIGRlYnVnZ2luZyBhIGJpdCBhbm5veWluZy4NCj4gSSdtIHVz
aW5nIHRoZSBoaWdoZXN0IGxldmVsIGZvciBzb21lIGhpZ2gtdm9sdW1lIG91dHB1dCBhbmQgbm9y
bWFsbHkNCj4gd2FudCBpdCBkaXNhYmxlZC4gQ3VycmVudGx5IEkgY2FuJ3QgY29uZmlndXJlIHRo
YXQgaW4gdGhlIHJlZ2lzdHJ5IGFuZA0KPiBuZWVkIHRvIG1hbnVhbGx5IGJyZWFrIGluIHRoZSBk
ZWJ1Z2dlciAqYWZ0ZXIqIFBWIGRyaXZlcnMgYXJlIGxvYWRlZCBhbmQNCj4gY2hhbmdlIHRoZSBm
aWx0ZXIgbWFza3MgZGlyZWN0bHkuIEkgZ3Vlc3MgdGhlIGlzc3VlIGlzIHRoYXQgSUhWRFJJVkVS
IGlkDQo+IGlzIG1lYW50IHRvIGJlIHVzZWQgYnkgZXZlcnlvbmUuLi4NCg0KTm8sIHRoaXMgaXMg
bGFyZ2VseSBoaXN0b3JpYy4gSXQgY2FuIGJlIHJlbW92ZWQuDQoNCiAgUGF1bA0KDQo+IA0KPiAt
LQ0KPiBSYWZhxYIgV29qZHnFgmENCj4gUXViZXMgVG9vbHMgZm9yIFdpbmRvd3MgZGV2ZWxvcGVy
DQo+IGh0dHBzOi8vd3d3LnF1YmVzLW9zLm9yZy8NCj4gDQo+IF9fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fDQo+IHdpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QN
Cj4gd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+IGh0dHA6Ly9saXN0cy54ZW5w
cm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRldmVsDQpfX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYtZGV2ZWwgbWFp
bGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwOi8vbGlzdHMu
eGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Tue Jul 14 15:11:59 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 14 Jul 2015 15:11:59 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZF1sE-0002Y3-QV; Tue, 14 Jul 2015 15:11:58 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=6306ade7a=Paul.Durrant@citrix.com>)
	id 1ZF1sD-0002Xl-Uk
	for win-pv-devel@lists.xenproject.org; Tue, 14 Jul 2015 15:11:58 +0000
Received: from [193.109.254.147] by server-13.bemta-14.messagelabs.com id
	38/4B-16813-DB625A55; Tue, 14 Jul 2015 15:11:57 +0000
X-Env-Sender: prvs=6306ade7a=Paul.Durrant@citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1436886716!32057064!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4047 invoked from network); 14 Jul 2015 15:11:56 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Jul 2015 15:11:56 -0000
X-IronPort-AV: E=Sophos;i="5.15,472,1432598400"; 
   d="scan'208";a="1331946"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Debug print levels
Thread-Index: AQHQvkcjUHp3Dl/OPEK2kZMRDQzNpZ3bEiZA
Date: Tue, 14 Jul 2015 15:11:55 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C30AF@AMSPEX01CL02.citrite.net>
References: <55A52565.7070205@invisiblethingslab.com>
In-Reply-To: <55A52565.7070205@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Debug print levels
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNl
c0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0NCj4gYm91bmNlc0Bs
aXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGENCj4gU2VudDog
MTQgSnVseSAyMDE1IDE2OjA2DQo+IFRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5v
cmcNCj4gU3ViamVjdDogW3dpbi1wdi1kZXZlbF0gRGVidWcgcHJpbnQgbGV2ZWxzDQo+IA0KPiBJ
cyB0aGVyZSBhIHNwZWNpZmljIHJlYXNvbiBmb3IgdGhlIGRyaXZlcnMgZm9yY2UtdW5tYXNraW5n
IGFsbCBzeXN0ZW0NCj4gZGVidWcgcHJpbnQgbGV2ZWxzIG9uIGluaXRpYWxpemF0aW9uIChfX0Ri
Z1ByaW50RW5hYmxlKT8gVGhpcyBvdmVycmlkZXMNCj4gYW55IGZpbHRlciBzZXR0aW5ncyBpbiB0
aGUgcmVnaXN0cnkgYW5kIG1ha2VzIGRlYnVnZ2luZyBhIGJpdCBhbm5veWluZy4NCj4gSSdtIHVz
aW5nIHRoZSBoaWdoZXN0IGxldmVsIGZvciBzb21lIGhpZ2gtdm9sdW1lIG91dHB1dCBhbmQgbm9y
bWFsbHkNCj4gd2FudCBpdCBkaXNhYmxlZC4gQ3VycmVudGx5IEkgY2FuJ3QgY29uZmlndXJlIHRo
YXQgaW4gdGhlIHJlZ2lzdHJ5IGFuZA0KPiBuZWVkIHRvIG1hbnVhbGx5IGJyZWFrIGluIHRoZSBk
ZWJ1Z2dlciAqYWZ0ZXIqIFBWIGRyaXZlcnMgYXJlIGxvYWRlZCBhbmQNCj4gY2hhbmdlIHRoZSBm
aWx0ZXIgbWFza3MgZGlyZWN0bHkuIEkgZ3Vlc3MgdGhlIGlzc3VlIGlzIHRoYXQgSUhWRFJJVkVS
IGlkDQo+IGlzIG1lYW50IHRvIGJlIHVzZWQgYnkgZXZlcnlvbmUuLi4NCg0KTm8sIHRoaXMgaXMg
bGFyZ2VseSBoaXN0b3JpYy4gSXQgY2FuIGJlIHJlbW92ZWQuDQoNCiAgUGF1bA0KDQo+IA0KPiAt
LQ0KPiBSYWZhxYIgV29qZHnFgmENCj4gUXViZXMgVG9vbHMgZm9yIFdpbmRvd3MgZGV2ZWxvcGVy
DQo+IGh0dHBzOi8vd3d3LnF1YmVzLW9zLm9yZy8NCj4gDQo+IF9fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fDQo+IHdpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QN
Cj4gd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+IGh0dHA6Ly9saXN0cy54ZW5w
cm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRldmVsDQpfX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYtZGV2ZWwgbWFp
bGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwOi8vbGlzdHMu
eGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 15 10:09:37 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 15 Jul 2015 10:09:37 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZFJdA-0003KM-DG; Wed, 15 Jul 2015 10:09:36 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=631be2215=Paul.Durrant@citrix.com>)
	id 1ZFJd9-0003KH-1t
	for win-pv-devel@lists.xenproject.org; Wed, 15 Jul 2015 10:09:35 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	24/0D-24291-E5136A55; Wed, 15 Jul 2015 10:09:34 +0000
X-Env-Sender: prvs=631be2215=Paul.Durrant@citrix.com
X-Msg-Ref: server-13.tower-206.messagelabs.com!1436954972!21311771!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12730 invoked from network); 15 Jul 2015 10:09:32 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-13.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Jul 2015 10:09:32 -0000
X-IronPort-AV: E=Sophos;i="5.15,479,1432598400"; 
   d="scan'208";a="1352520"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: more changes to PDO revision numbering
Thread-Index: AdC+345/zgXTPENZRiSUmu7gXvrxUg==
Date: Wed, 15 Jul 2015 10:09:09 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C40C3@AMSPEX01CL02.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: [win-pv-devel] more changes to PDO revision numbering
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Hi,

  I've recently realised that the way in which PDO revisions are assigned is flawed. The nested-for-loop implementation doesn't guarantee that a particular revision corresponds to a particular combination of interface versions as was my intention, and also the combinatorial explosion that occurs whenever one interface version is incremented means we burn through PDO revisions pretty rapidly.  So, I propose a change...
  We don't really need to have a revision for *every* possible combination of interfaces. A bus driver implementing the newest  version of one interface and the oldest version of another possibly would never exist since often multiple interfaces may be updated by a single (series of) commit(s). I therefore think that we should move to an implementation that uses a table mapping a set of interface versions to a PDO revision. To do this, and maintain working combinations of drivers, we will need to follow some rules though:

1) The last line of the table should always map the latest interface versions to the highest PDO revision
2) A patch should never *modify* a line in the table, only add or remove (although I think we can allow that for patches within the same series)
3) A line should not be removed from the table until no child driver relies on binding to that PDO revision [1]. I.e. child drivers get updated to bind to the latest PDO revision and *then* old revisions are retired.

  Under this scheme, I think we can also drop the need to register individual interface versions between drivers (i.e. the current provider/subscriber scheme) since we can infer what interface versions a driver is using by looking at the MatchingDeviceId value in the device software key.

  To get from where we are to this new scheme I also propose that we just start with a single line table in each bus driver (XENBUS and XENVIF) mapping the latest interface versions to the current highest PDO revision. The latest versions of all child drivers are currently binding to the highest PDO revisions so rule 3 is adhered to.

  If anyone has any thoughts on this please let me know, otherwise I will make changes this Friday (July 15th).

    Paul

[1] It may be necessary to deliberately make incompatible changes and thus, in such exceptional circumstances, a single series may add a new line to the table and remove all existing lines but we should clearly try to avoid this where possible. In this case though, patch series to update child drivers should be simultaneously available and committed to the relevant repositories within the smallest possible time window.

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 15 10:09:37 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 15 Jul 2015 10:09:37 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZFJdA-0003KM-DG; Wed, 15 Jul 2015 10:09:36 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=631be2215=Paul.Durrant@citrix.com>)
	id 1ZFJd9-0003KH-1t
	for win-pv-devel@lists.xenproject.org; Wed, 15 Jul 2015 10:09:35 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	24/0D-24291-E5136A55; Wed, 15 Jul 2015 10:09:34 +0000
X-Env-Sender: prvs=631be2215=Paul.Durrant@citrix.com
X-Msg-Ref: server-13.tower-206.messagelabs.com!1436954972!21311771!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12730 invoked from network); 15 Jul 2015 10:09:32 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-13.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Jul 2015 10:09:32 -0000
X-IronPort-AV: E=Sophos;i="5.15,479,1432598400"; 
   d="scan'208";a="1352520"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: more changes to PDO revision numbering
Thread-Index: AdC+345/zgXTPENZRiSUmu7gXvrxUg==
Date: Wed, 15 Jul 2015 10:09:09 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C40C3@AMSPEX01CL02.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: [win-pv-devel] more changes to PDO revision numbering
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Hi,

  I've recently realised that the way in which PDO revisions are assigned is flawed. The nested-for-loop implementation doesn't guarantee that a particular revision corresponds to a particular combination of interface versions as was my intention, and also the combinatorial explosion that occurs whenever one interface version is incremented means we burn through PDO revisions pretty rapidly.  So, I propose a change...
  We don't really need to have a revision for *every* possible combination of interfaces. A bus driver implementing the newest  version of one interface and the oldest version of another possibly would never exist since often multiple interfaces may be updated by a single (series of) commit(s). I therefore think that we should move to an implementation that uses a table mapping a set of interface versions to a PDO revision. To do this, and maintain working combinations of drivers, we will need to follow some rules though:

1) The last line of the table should always map the latest interface versions to the highest PDO revision
2) A patch should never *modify* a line in the table, only add or remove (although I think we can allow that for patches within the same series)
3) A line should not be removed from the table until no child driver relies on binding to that PDO revision [1]. I.e. child drivers get updated to bind to the latest PDO revision and *then* old revisions are retired.

  Under this scheme, I think we can also drop the need to register individual interface versions between drivers (i.e. the current provider/subscriber scheme) since we can infer what interface versions a driver is using by looking at the MatchingDeviceId value in the device software key.

  To get from where we are to this new scheme I also propose that we just start with a single line table in each bus driver (XENBUS and XENVIF) mapping the latest interface versions to the current highest PDO revision. The latest versions of all child drivers are currently binding to the highest PDO revisions so rule 3 is adhered to.

  If anyone has any thoughts on this please let me know, otherwise I will make changes this Friday (July 15th).

    Paul

[1] It may be necessary to deliberately make incompatible changes and thus, in such exceptional circumstances, a single series may add a new line to the table and remove all existing lines but we should clearly try to avoid this where possible. In this case though, patch series to update child drivers should be simultaneously available and committed to the relevant repositories within the smallest possible time window.

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 15 10:17:04 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 15 Jul 2015 10:17:04 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZFJkN-0003cK-Tf; Wed, 15 Jul 2015 10:17:03 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=631be2215=Paul.Durrant@citrix.com>)
	id 1ZFJkN-0003cF-2n
	for win-pv-devel@lists.xenproject.org; Wed, 15 Jul 2015 10:17:03 +0000
Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id
	6A/B8-00913-E1336A55; Wed, 15 Jul 2015 10:17:02 +0000
X-Env-Sender: prvs=631be2215=Paul.Durrant@citrix.com
X-Msg-Ref: server-4.tower-206.messagelabs.com!1436955421!21303926!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10340 invoked from network); 15 Jul 2015 10:17:01 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-4.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Jul 2015 10:17:01 -0000
X-IronPort-AV: E=Sophos;i="5.15,479,1432598400"; 
   d="scan'208";a="1352751"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: more changes to PDO revision numbering
Thread-Index: AdC+345/zgXTPENZRiSUmu7gXvrxUgAB5fZw
Date: Wed, 15 Jul 2015 10:17:00 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C414B@AMSPEX01CL02.citrite.net>
References: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C40C3@AMSPEX01CL02.citrite.net>
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C40C3@AMSPEX01CL02.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] more changes to PDO revision numbering
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Paul Durrant
> Sent: 15 July 2015 11:09
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] more changes to PDO revision numbering
> 
> Hi,
> 
>   I've recently realised that the way in which PDO revisions are assigned is
> flawed. The nested-for-loop implementation doesn't guarantee that a
> particular revision corresponds to a particular combination of interface
> versions as was my intention, and also the combinatorial explosion that
> occurs whenever one interface version is incremented means we burn
> through PDO revisions pretty rapidly.  So, I propose a change...
>   We don't really need to have a revision for *every* possible combination of
> interfaces. A bus driver implementing the newest  version of one interface
> and the oldest version of another possibly would never exist since often
> multiple interfaces may be updated by a single (series of) commit(s). I
> therefore think that we should move to an implementation that uses a table
> mapping a set of interface versions to a PDO revision. To do this, and
> maintain working combinations of drivers, we will need to follow some rules
> though:
> 
> 1) The last line of the table should always map the latest interface versions to
> the highest PDO revision
> 2) A patch should never *modify* a line in the table, only add or remove
> (although I think we can allow that for patches within the same series)
> 3) A line should not be removed from the table until no child driver relies on
> binding to that PDO revision [1]. I.e. child drivers get updated to bind to the
> latest PDO revision and *then* old revisions are retired.
> 

Actually there's also an implicit rule here that already applied under the old scheme, but may not have been obvious:

4) A child driver must only use interface versions that are mapped to the PDO revision to which it binds.

  Paul

>   Under this scheme, I think we can also drop the need to register individual
> interface versions between drivers (i.e. the current provider/subscriber
> scheme) since we can infer what interface versions a driver is using by
> looking at the MatchingDeviceId value in the device software key.
> 
>   To get from where we are to this new scheme I also propose that we just
> start with a single line table in each bus driver (XENBUS and XENVIF) mapping
> the latest interface versions to the current highest PDO revision. The latest
> versions of all child drivers are currently binding to the highest PDO revisions
> so rule 3 is adhered to.
> 
>   If anyone has any thoughts on this please let me know, otherwise I will
> make changes this Friday (July 15th).
> 
>     Paul
> 
> [1] It may be necessary to deliberately make incompatible changes and thus,
> in such exceptional circumstances, a single series may add a new line to the
> table and remove all existing lines but we should clearly try to avoid this
> where possible. In this case though, patch series to update child drivers
> should be simultaneously available and committed to the relevant
> repositories within the smallest possible time window.
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 15 10:17:04 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 15 Jul 2015 10:17:04 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZFJkN-0003cK-Tf; Wed, 15 Jul 2015 10:17:03 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=631be2215=Paul.Durrant@citrix.com>)
	id 1ZFJkN-0003cF-2n
	for win-pv-devel@lists.xenproject.org; Wed, 15 Jul 2015 10:17:03 +0000
Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id
	6A/B8-00913-E1336A55; Wed, 15 Jul 2015 10:17:02 +0000
X-Env-Sender: prvs=631be2215=Paul.Durrant@citrix.com
X-Msg-Ref: server-4.tower-206.messagelabs.com!1436955421!21303926!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10340 invoked from network); 15 Jul 2015 10:17:01 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-4.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Jul 2015 10:17:01 -0000
X-IronPort-AV: E=Sophos;i="5.15,479,1432598400"; 
   d="scan'208";a="1352751"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: more changes to PDO revision numbering
Thread-Index: AdC+345/zgXTPENZRiSUmu7gXvrxUgAB5fZw
Date: Wed, 15 Jul 2015 10:17:00 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C414B@AMSPEX01CL02.citrite.net>
References: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C40C3@AMSPEX01CL02.citrite.net>
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C40C3@AMSPEX01CL02.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] more changes to PDO revision numbering
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Paul Durrant
> Sent: 15 July 2015 11:09
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] more changes to PDO revision numbering
> 
> Hi,
> 
>   I've recently realised that the way in which PDO revisions are assigned is
> flawed. The nested-for-loop implementation doesn't guarantee that a
> particular revision corresponds to a particular combination of interface
> versions as was my intention, and also the combinatorial explosion that
> occurs whenever one interface version is incremented means we burn
> through PDO revisions pretty rapidly.  So, I propose a change...
>   We don't really need to have a revision for *every* possible combination of
> interfaces. A bus driver implementing the newest  version of one interface
> and the oldest version of another possibly would never exist since often
> multiple interfaces may be updated by a single (series of) commit(s). I
> therefore think that we should move to an implementation that uses a table
> mapping a set of interface versions to a PDO revision. To do this, and
> maintain working combinations of drivers, we will need to follow some rules
> though:
> 
> 1) The last line of the table should always map the latest interface versions to
> the highest PDO revision
> 2) A patch should never *modify* a line in the table, only add or remove
> (although I think we can allow that for patches within the same series)
> 3) A line should not be removed from the table until no child driver relies on
> binding to that PDO revision [1]. I.e. child drivers get updated to bind to the
> latest PDO revision and *then* old revisions are retired.
> 

Actually there's also an implicit rule here that already applied under the old scheme, but may not have been obvious:

4) A child driver must only use interface versions that are mapped to the PDO revision to which it binds.

  Paul

>   Under this scheme, I think we can also drop the need to register individual
> interface versions between drivers (i.e. the current provider/subscriber
> scheme) since we can infer what interface versions a driver is using by
> looking at the MatchingDeviceId value in the device software key.
> 
>   To get from where we are to this new scheme I also propose that we just
> start with a single line table in each bus driver (XENBUS and XENVIF) mapping
> the latest interface versions to the current highest PDO revision. The latest
> versions of all child drivers are currently binding to the highest PDO revisions
> so rule 3 is adhered to.
> 
>   If anyone has any thoughts on this please let me know, otherwise I will
> make changes this Friday (July 15th).
> 
>     Paul
> 
> [1] It may be necessary to deliberately make incompatible changes and thus,
> in such exceptional circumstances, a single series may add a new line to the
> table and remove all existing lines but we should clearly try to avoid this
> where possible. In this case though, patch series to update child drivers
> should be simultaneously available and committed to the relevant
> repositories within the smallest possible time window.
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 15 13:13:17 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 15 Jul 2015 13:13:17 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZFMUv-0003p4-9u; Wed, 15 Jul 2015 13:13:17 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1ZFMUu-0003ol-2M
	for win-pv-devel@lists.xenproject.org; Wed, 15 Jul 2015 13:13:16 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	2B/81-01469-B6C56A55; Wed, 15 Jul 2015 13:13:15 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1436965993!32363576!1
X-Originating-IP: [66.111.4.25]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjUgPT4gNDQ5ODE=\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25179 invoked from network); 15 Jul 2015 13:13:14 -0000
Received: from out1-smtp.messagingengine.com (HELO
	out1-smtp.messagingengine.com) (66.111.4.25)
	by server-12.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 15 Jul 2015 13:13:14 -0000
Received: from compute1.internal (compute1.nyi.internal [10.202.2.41])
	by mailout.nyi.internal (Postfix) with ESMTP id A78F92076D
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 15 Jul 2015 09:13:13 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute1.internal (MEProxy); Wed, 15 Jul 2015 09:13:13 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=v1fYz7qhyhn5cxej
	eSZO1ixYbJM=; b=MQ6Bu9D2fQmBgNUU7gnMpMjV7oMn4Rbn3z0jvj07oXcKNS4Y
	x6s4Jv7BBNog3Ltc5p/xEiqRRUa529LyWqQ8cPoMETMkdhcCfgFaqFNQIkOWXGZS
	5ngGLtynjfiKXr7NQ4TxAlM1KuvSOMYusFMiGCe3y9Zsiw6MRqQJfoggYSo=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=v1fYz7qhyhn5cxe
	jeSZO1ixYbJM=; b=hLHgmolzRy7Wdfn1jYFeqsyl4m21aScegOW0k3yehGZvo1L
	Ph/D6LrBQRKLSlsqH822e2pSwTS26cgXiGa8JF8Onr4IAFjMMsfqKuq8MZo34jA+
	UIEqOZBMl7fcsfKQD8z1RrYyEtJqLOUx8cG9ork+MupZSAlxHG8EwFAfHd+A=
X-Sasl-enc: jXzglr+HdlJBbVI/0XaaKDEnaiujKAkpLnLlc5ISvsiZ 1436965993
Received: from [192.168.0.3] (89-67-247-126.dynamic.chello.pl [89.67.247.126])
	by mail.messagingengine.com (Postfix) with ESMTPA id F1B9D6800C6;
	Wed, 15 Jul 2015 09:13:12 -0400 (EDT)
Message-ID: <55A65C69.4050402@invisiblethingslab.com>
Date: Wed, 15 Jul 2015 15:13:13 +0200
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:31.0) Gecko/20100101 Thunderbird/31.7.0
MIME-Version: 1.0
To: Paul Durrant <Paul.Durrant@citrix.com>, 
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C40C3@AMSPEX01CL02.citrite.net>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F4C414B@AMSPEX01CL02.citrite.net>
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C414B@AMSPEX01CL02.citrite.net>
Content-Length: 4981
Subject: Re: [win-pv-devel] more changes to PDO revision numbering
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

T24gMjAxNS0wNy0xNSAxMjoxNywgUGF1bCBEdXJyYW50IHdyb3RlOgo+PiAtLS0tLU9yaWdpbmFs
IE1lc3NhZ2UtLS0tLQo+PiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9q
ZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0KPj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0
Lm9yZ10gT24gQmVoYWxmIE9mIFBhdWwgRHVycmFudAo+PiBTZW50OiAxNSBKdWx5IDIwMTUgMTE6
MDkKPj4gVG86IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwo+PiBTdWJqZWN0OiBb
d2luLXB2LWRldmVsXSBtb3JlIGNoYW5nZXMgdG8gUERPIHJldmlzaW9uIG51bWJlcmluZwo+Pgo+
PiBIaSwKPj4KPj4gICBJJ3ZlIHJlY2VudGx5IHJlYWxpc2VkIHRoYXQgdGhlIHdheSBpbiB3aGlj
aCBQRE8gcmV2aXNpb25zIGFyZSBhc3NpZ25lZCBpcwo+PiBmbGF3ZWQuIFRoZSBuZXN0ZWQtZm9y
LWxvb3AgaW1wbGVtZW50YXRpb24gZG9lc24ndCBndWFyYW50ZWUgdGhhdCBhCj4+IHBhcnRpY3Vs
YXIgcmV2aXNpb24gY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGNvbWJpbmF0aW9uIG9mIGlu
dGVyZmFjZQo+PiB2ZXJzaW9ucyBhcyB3YXMgbXkgaW50ZW50aW9uLCBhbmQgYWxzbyB0aGUgY29t
YmluYXRvcmlhbCBleHBsb3Npb24gdGhhdAo+PiBvY2N1cnMgd2hlbmV2ZXIgb25lIGludGVyZmFj
ZSB2ZXJzaW9uIGlzIGluY3JlbWVudGVkIG1lYW5zIHdlIGJ1cm4KPj4gdGhyb3VnaCBQRE8gcmV2
aXNpb25zIHByZXR0eSByYXBpZGx5LiAgU28sIEkgcHJvcG9zZSBhIGNoYW5nZS4uLgo+PiAgIFdl
IGRvbid0IHJlYWxseSBuZWVkIHRvIGhhdmUgYSByZXZpc2lvbiBmb3IgKmV2ZXJ5KiBwb3NzaWJs
ZSBjb21iaW5hdGlvbiBvZgo+PiBpbnRlcmZhY2VzLiBBIGJ1cyBkcml2ZXIgaW1wbGVtZW50aW5n
IHRoZSBuZXdlc3QgIHZlcnNpb24gb2Ygb25lIGludGVyZmFjZQo+PiBhbmQgdGhlIG9sZGVzdCB2
ZXJzaW9uIG9mIGFub3RoZXIgcG9zc2libHkgd291bGQgbmV2ZXIgZXhpc3Qgc2luY2Ugb2Z0ZW4K
Pj4gbXVsdGlwbGUgaW50ZXJmYWNlcyBtYXkgYmUgdXBkYXRlZCBieSBhIHNpbmdsZSAoc2VyaWVz
IG9mKSBjb21taXQocykuIEkKPj4gdGhlcmVmb3JlIHRoaW5rIHRoYXQgd2Ugc2hvdWxkIG1vdmUg
dG8gYW4gaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIGEgdGFibGUKPj4gbWFwcGluZyBhIHNldCBv
ZiBpbnRlcmZhY2UgdmVyc2lvbnMgdG8gYSBQRE8gcmV2aXNpb24uIFRvIGRvIHRoaXMsIGFuZAo+
PiBtYWludGFpbiB3b3JraW5nIGNvbWJpbmF0aW9ucyBvZiBkcml2ZXJzLCB3ZSB3aWxsIG5lZWQg
dG8gZm9sbG93IHNvbWUgcnVsZXMKPj4gdGhvdWdoOgo+Pgo+PiAxKSBUaGUgbGFzdCBsaW5lIG9m
IHRoZSB0YWJsZSBzaG91bGQgYWx3YXlzIG1hcCB0aGUgbGF0ZXN0IGludGVyZmFjZSB2ZXJzaW9u
cyB0bwo+PiB0aGUgaGlnaGVzdCBQRE8gcmV2aXNpb24KPj4gMikgQSBwYXRjaCBzaG91bGQgbmV2
ZXIgKm1vZGlmeSogYSBsaW5lIGluIHRoZSB0YWJsZSwgb25seSBhZGQgb3IgcmVtb3ZlCj4+IChh
bHRob3VnaCBJIHRoaW5rIHdlIGNhbiBhbGxvdyB0aGF0IGZvciBwYXRjaGVzIHdpdGhpbiB0aGUg
c2FtZSBzZXJpZXMpCj4+IDMpIEEgbGluZSBzaG91bGQgbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUg
dGFibGUgdW50aWwgbm8gY2hpbGQgZHJpdmVyIHJlbGllcyBvbgo+PiBiaW5kaW5nIHRvIHRoYXQg
UERPIHJldmlzaW9uIFsxXS4gSS5lLiBjaGlsZCBkcml2ZXJzIGdldCB1cGRhdGVkIHRvIGJpbmQg
dG8gdGhlCj4+IGxhdGVzdCBQRE8gcmV2aXNpb24gYW5kICp0aGVuKiBvbGQgcmV2aXNpb25zIGFy
ZSByZXRpcmVkLgo+Pgo+IAo+IEFjdHVhbGx5IHRoZXJlJ3MgYWxzbyBhbiBpbXBsaWNpdCBydWxl
IGhlcmUgdGhhdCBhbHJlYWR5IGFwcGxpZWQgdW5kZXIgdGhlIG9sZCBzY2hlbWUsIGJ1dCBtYXkg
bm90IGhhdmUgYmVlbiBvYnZpb3VzOgo+IAo+IDQpIEEgY2hpbGQgZHJpdmVyIG11c3Qgb25seSB1
c2UgaW50ZXJmYWNlIHZlcnNpb25zIHRoYXQgYXJlIG1hcHBlZCB0byB0aGUgUERPIHJldmlzaW9u
IHRvIHdoaWNoIGl0IGJpbmRzLgo+IAo+ICAgUGF1bAo+IAo+PiAgIFVuZGVyIHRoaXMgc2NoZW1l
LCBJIHRoaW5rIHdlIGNhbiBhbHNvIGRyb3AgdGhlIG5lZWQgdG8gcmVnaXN0ZXIgaW5kaXZpZHVh
bAo+PiBpbnRlcmZhY2UgdmVyc2lvbnMgYmV0d2VlbiBkcml2ZXJzIChpLmUuIHRoZSBjdXJyZW50
IHByb3ZpZGVyL3N1YnNjcmliZXIKPj4gc2NoZW1lKSBzaW5jZSB3ZSBjYW4gaW5mZXIgd2hhdCBp
bnRlcmZhY2UgdmVyc2lvbnMgYSBkcml2ZXIgaXMgdXNpbmcgYnkKPj4gbG9va2luZyBhdCB0aGUg
TWF0Y2hpbmdEZXZpY2VJZCB2YWx1ZSBpbiB0aGUgZGV2aWNlIHNvZnR3YXJlIGtleS4KPj4KPj4g
ICBUbyBnZXQgZnJvbSB3aGVyZSB3ZSBhcmUgdG8gdGhpcyBuZXcgc2NoZW1lIEkgYWxzbyBwcm9w
b3NlIHRoYXQgd2UganVzdAo+PiBzdGFydCB3aXRoIGEgc2luZ2xlIGxpbmUgdGFibGUgaW4gZWFj
aCBidXMgZHJpdmVyIChYRU5CVVMgYW5kIFhFTlZJRikgbWFwcGluZwo+PiB0aGUgbGF0ZXN0IGlu
dGVyZmFjZSB2ZXJzaW9ucyB0byB0aGUgY3VycmVudCBoaWdoZXN0IFBETyByZXZpc2lvbi4gVGhl
IGxhdGVzdAo+PiB2ZXJzaW9ucyBvZiBhbGwgY2hpbGQgZHJpdmVycyBhcmUgY3VycmVudGx5IGJp
bmRpbmcgdG8gdGhlIGhpZ2hlc3QgUERPIHJldmlzaW9ucwo+PiBzbyBydWxlIDMgaXMgYWRoZXJl
ZCB0by4KPj4KPj4gICBJZiBhbnlvbmUgaGFzIGFueSB0aG91Z2h0cyBvbiB0aGlzIHBsZWFzZSBs
ZXQgbWUga25vdywgb3RoZXJ3aXNlIEkgd2lsbAo+PiBtYWtlIGNoYW5nZXMgdGhpcyBGcmlkYXkg
KEp1bHkgMTV0aCkuCj4+Cj4+ICAgICBQYXVsCj4+Cj4+IFsxXSBJdCBtYXkgYmUgbmVjZXNzYXJ5
IHRvIGRlbGliZXJhdGVseSBtYWtlIGluY29tcGF0aWJsZSBjaGFuZ2VzIGFuZCB0aHVzLAo+PiBp
biBzdWNoIGV4Y2VwdGlvbmFsIGNpcmN1bXN0YW5jZXMsIGEgc2luZ2xlIHNlcmllcyBtYXkgYWRk
IGEgbmV3IGxpbmUgdG8gdGhlCj4+IHRhYmxlIGFuZCByZW1vdmUgYWxsIGV4aXN0aW5nIGxpbmVz
IGJ1dCB3ZSBzaG91bGQgY2xlYXJseSB0cnkgdG8gYXZvaWQgdGhpcwo+PiB3aGVyZSBwb3NzaWJs
ZS4gSW4gdGhpcyBjYXNlIHRob3VnaCwgcGF0Y2ggc2VyaWVzIHRvIHVwZGF0ZSBjaGlsZCBkcml2
ZXJzCj4+IHNob3VsZCBiZSBzaW11bHRhbmVvdXNseSBhdmFpbGFibGUgYW5kIGNvbW1pdHRlZCB0
byB0aGUgcmVsZXZhbnQKPj4gcmVwb3NpdG9yaWVzIHdpdGhpbiB0aGUgc21hbGxlc3QgcG9zc2li
bGUgdGltZSB3aW5kb3cuCj4+CkknbSBhbGwgZm9yIGl0LiBUaGUgY3VycmVudCBjb21iaW5hdG9y
aWFsIGFwcHJvYWNoIGlzIG5vdCB2ZXJ5Cm1haW50YWluYWJsZSBpbiB0aGUgbG9uZyBydW4gYXMg
eW91IHNhaWQuCgotLSAKUmFmYcWCIFdvamR5xYJhClF1YmVzIFRvb2xzIGZvciBXaW5kb3dzIGRl
dmVsb3BlcgpodHRwczovL3d3dy5xdWJlcy1vcy5vcmcvCgpfX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1w
di1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcv
Y2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 15 13:13:17 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 15 Jul 2015 13:13:17 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZFMUv-0003p4-9u; Wed, 15 Jul 2015 13:13:17 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1ZFMUu-0003ol-2M
	for win-pv-devel@lists.xenproject.org; Wed, 15 Jul 2015 13:13:16 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	2B/81-01469-B6C56A55; Wed, 15 Jul 2015 13:13:15 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1436965993!32363576!1
X-Originating-IP: [66.111.4.25]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjUgPT4gNDQ5ODE=\n
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25179 invoked from network); 15 Jul 2015 13:13:14 -0000
Received: from out1-smtp.messagingengine.com (HELO
	out1-smtp.messagingengine.com) (66.111.4.25)
	by server-12.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 15 Jul 2015 13:13:14 -0000
Received: from compute1.internal (compute1.nyi.internal [10.202.2.41])
	by mailout.nyi.internal (Postfix) with ESMTP id A78F92076D
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 15 Jul 2015 09:13:13 -0400 (EDT)
Received: from frontend2 ([10.202.2.161])
	by compute1.internal (MEProxy); Wed, 15 Jul 2015 09:13:13 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=v1fYz7qhyhn5cxej
	eSZO1ixYbJM=; b=MQ6Bu9D2fQmBgNUU7gnMpMjV7oMn4Rbn3z0jvj07oXcKNS4Y
	x6s4Jv7BBNog3Ltc5p/xEiqRRUa529LyWqQ8cPoMETMkdhcCfgFaqFNQIkOWXGZS
	5ngGLtynjfiKXr7NQ4TxAlM1KuvSOMYusFMiGCe3y9Zsiw6MRqQJfoggYSo=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=v1fYz7qhyhn5cxe
	jeSZO1ixYbJM=; b=hLHgmolzRy7Wdfn1jYFeqsyl4m21aScegOW0k3yehGZvo1L
	Ph/D6LrBQRKLSlsqH822e2pSwTS26cgXiGa8JF8Onr4IAFjMMsfqKuq8MZo34jA+
	UIEqOZBMl7fcsfKQD8z1RrYyEtJqLOUx8cG9ork+MupZSAlxHG8EwFAfHd+A=
X-Sasl-enc: jXzglr+HdlJBbVI/0XaaKDEnaiujKAkpLnLlc5ISvsiZ 1436965993
Received: from [192.168.0.3] (89-67-247-126.dynamic.chello.pl [89.67.247.126])
	by mail.messagingengine.com (Postfix) with ESMTPA id F1B9D6800C6;
	Wed, 15 Jul 2015 09:13:12 -0400 (EDT)
Message-ID: <55A65C69.4050402@invisiblethingslab.com>
Date: Wed, 15 Jul 2015 15:13:13 +0200
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:31.0) Gecko/20100101 Thunderbird/31.7.0
MIME-Version: 1.0
To: Paul Durrant <Paul.Durrant@citrix.com>, 
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C40C3@AMSPEX01CL02.citrite.net>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F4C414B@AMSPEX01CL02.citrite.net>
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C414B@AMSPEX01CL02.citrite.net>
Content-Length: 4981
Subject: Re: [win-pv-devel] more changes to PDO revision numbering
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

T24gMjAxNS0wNy0xNSAxMjoxNywgUGF1bCBEdXJyYW50IHdyb3RlOgo+PiAtLS0tLU9yaWdpbmFs
IE1lc3NhZ2UtLS0tLQo+PiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9q
ZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0KPj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0
Lm9yZ10gT24gQmVoYWxmIE9mIFBhdWwgRHVycmFudAo+PiBTZW50OiAxNSBKdWx5IDIwMTUgMTE6
MDkKPj4gVG86IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwo+PiBTdWJqZWN0OiBb
d2luLXB2LWRldmVsXSBtb3JlIGNoYW5nZXMgdG8gUERPIHJldmlzaW9uIG51bWJlcmluZwo+Pgo+
PiBIaSwKPj4KPj4gICBJJ3ZlIHJlY2VudGx5IHJlYWxpc2VkIHRoYXQgdGhlIHdheSBpbiB3aGlj
aCBQRE8gcmV2aXNpb25zIGFyZSBhc3NpZ25lZCBpcwo+PiBmbGF3ZWQuIFRoZSBuZXN0ZWQtZm9y
LWxvb3AgaW1wbGVtZW50YXRpb24gZG9lc24ndCBndWFyYW50ZWUgdGhhdCBhCj4+IHBhcnRpY3Vs
YXIgcmV2aXNpb24gY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGNvbWJpbmF0aW9uIG9mIGlu
dGVyZmFjZQo+PiB2ZXJzaW9ucyBhcyB3YXMgbXkgaW50ZW50aW9uLCBhbmQgYWxzbyB0aGUgY29t
YmluYXRvcmlhbCBleHBsb3Npb24gdGhhdAo+PiBvY2N1cnMgd2hlbmV2ZXIgb25lIGludGVyZmFj
ZSB2ZXJzaW9uIGlzIGluY3JlbWVudGVkIG1lYW5zIHdlIGJ1cm4KPj4gdGhyb3VnaCBQRE8gcmV2
aXNpb25zIHByZXR0eSByYXBpZGx5LiAgU28sIEkgcHJvcG9zZSBhIGNoYW5nZS4uLgo+PiAgIFdl
IGRvbid0IHJlYWxseSBuZWVkIHRvIGhhdmUgYSByZXZpc2lvbiBmb3IgKmV2ZXJ5KiBwb3NzaWJs
ZSBjb21iaW5hdGlvbiBvZgo+PiBpbnRlcmZhY2VzLiBBIGJ1cyBkcml2ZXIgaW1wbGVtZW50aW5n
IHRoZSBuZXdlc3QgIHZlcnNpb24gb2Ygb25lIGludGVyZmFjZQo+PiBhbmQgdGhlIG9sZGVzdCB2
ZXJzaW9uIG9mIGFub3RoZXIgcG9zc2libHkgd291bGQgbmV2ZXIgZXhpc3Qgc2luY2Ugb2Z0ZW4K
Pj4gbXVsdGlwbGUgaW50ZXJmYWNlcyBtYXkgYmUgdXBkYXRlZCBieSBhIHNpbmdsZSAoc2VyaWVz
IG9mKSBjb21taXQocykuIEkKPj4gdGhlcmVmb3JlIHRoaW5rIHRoYXQgd2Ugc2hvdWxkIG1vdmUg
dG8gYW4gaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIGEgdGFibGUKPj4gbWFwcGluZyBhIHNldCBv
ZiBpbnRlcmZhY2UgdmVyc2lvbnMgdG8gYSBQRE8gcmV2aXNpb24uIFRvIGRvIHRoaXMsIGFuZAo+
PiBtYWludGFpbiB3b3JraW5nIGNvbWJpbmF0aW9ucyBvZiBkcml2ZXJzLCB3ZSB3aWxsIG5lZWQg
dG8gZm9sbG93IHNvbWUgcnVsZXMKPj4gdGhvdWdoOgo+Pgo+PiAxKSBUaGUgbGFzdCBsaW5lIG9m
IHRoZSB0YWJsZSBzaG91bGQgYWx3YXlzIG1hcCB0aGUgbGF0ZXN0IGludGVyZmFjZSB2ZXJzaW9u
cyB0bwo+PiB0aGUgaGlnaGVzdCBQRE8gcmV2aXNpb24KPj4gMikgQSBwYXRjaCBzaG91bGQgbmV2
ZXIgKm1vZGlmeSogYSBsaW5lIGluIHRoZSB0YWJsZSwgb25seSBhZGQgb3IgcmVtb3ZlCj4+IChh
bHRob3VnaCBJIHRoaW5rIHdlIGNhbiBhbGxvdyB0aGF0IGZvciBwYXRjaGVzIHdpdGhpbiB0aGUg
c2FtZSBzZXJpZXMpCj4+IDMpIEEgbGluZSBzaG91bGQgbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUg
dGFibGUgdW50aWwgbm8gY2hpbGQgZHJpdmVyIHJlbGllcyBvbgo+PiBiaW5kaW5nIHRvIHRoYXQg
UERPIHJldmlzaW9uIFsxXS4gSS5lLiBjaGlsZCBkcml2ZXJzIGdldCB1cGRhdGVkIHRvIGJpbmQg
dG8gdGhlCj4+IGxhdGVzdCBQRE8gcmV2aXNpb24gYW5kICp0aGVuKiBvbGQgcmV2aXNpb25zIGFy
ZSByZXRpcmVkLgo+Pgo+IAo+IEFjdHVhbGx5IHRoZXJlJ3MgYWxzbyBhbiBpbXBsaWNpdCBydWxl
IGhlcmUgdGhhdCBhbHJlYWR5IGFwcGxpZWQgdW5kZXIgdGhlIG9sZCBzY2hlbWUsIGJ1dCBtYXkg
bm90IGhhdmUgYmVlbiBvYnZpb3VzOgo+IAo+IDQpIEEgY2hpbGQgZHJpdmVyIG11c3Qgb25seSB1
c2UgaW50ZXJmYWNlIHZlcnNpb25zIHRoYXQgYXJlIG1hcHBlZCB0byB0aGUgUERPIHJldmlzaW9u
IHRvIHdoaWNoIGl0IGJpbmRzLgo+IAo+ICAgUGF1bAo+IAo+PiAgIFVuZGVyIHRoaXMgc2NoZW1l
LCBJIHRoaW5rIHdlIGNhbiBhbHNvIGRyb3AgdGhlIG5lZWQgdG8gcmVnaXN0ZXIgaW5kaXZpZHVh
bAo+PiBpbnRlcmZhY2UgdmVyc2lvbnMgYmV0d2VlbiBkcml2ZXJzIChpLmUuIHRoZSBjdXJyZW50
IHByb3ZpZGVyL3N1YnNjcmliZXIKPj4gc2NoZW1lKSBzaW5jZSB3ZSBjYW4gaW5mZXIgd2hhdCBp
bnRlcmZhY2UgdmVyc2lvbnMgYSBkcml2ZXIgaXMgdXNpbmcgYnkKPj4gbG9va2luZyBhdCB0aGUg
TWF0Y2hpbmdEZXZpY2VJZCB2YWx1ZSBpbiB0aGUgZGV2aWNlIHNvZnR3YXJlIGtleS4KPj4KPj4g
ICBUbyBnZXQgZnJvbSB3aGVyZSB3ZSBhcmUgdG8gdGhpcyBuZXcgc2NoZW1lIEkgYWxzbyBwcm9w
b3NlIHRoYXQgd2UganVzdAo+PiBzdGFydCB3aXRoIGEgc2luZ2xlIGxpbmUgdGFibGUgaW4gZWFj
aCBidXMgZHJpdmVyIChYRU5CVVMgYW5kIFhFTlZJRikgbWFwcGluZwo+PiB0aGUgbGF0ZXN0IGlu
dGVyZmFjZSB2ZXJzaW9ucyB0byB0aGUgY3VycmVudCBoaWdoZXN0IFBETyByZXZpc2lvbi4gVGhl
IGxhdGVzdAo+PiB2ZXJzaW9ucyBvZiBhbGwgY2hpbGQgZHJpdmVycyBhcmUgY3VycmVudGx5IGJp
bmRpbmcgdG8gdGhlIGhpZ2hlc3QgUERPIHJldmlzaW9ucwo+PiBzbyBydWxlIDMgaXMgYWRoZXJl
ZCB0by4KPj4KPj4gICBJZiBhbnlvbmUgaGFzIGFueSB0aG91Z2h0cyBvbiB0aGlzIHBsZWFzZSBs
ZXQgbWUga25vdywgb3RoZXJ3aXNlIEkgd2lsbAo+PiBtYWtlIGNoYW5nZXMgdGhpcyBGcmlkYXkg
KEp1bHkgMTV0aCkuCj4+Cj4+ICAgICBQYXVsCj4+Cj4+IFsxXSBJdCBtYXkgYmUgbmVjZXNzYXJ5
IHRvIGRlbGliZXJhdGVseSBtYWtlIGluY29tcGF0aWJsZSBjaGFuZ2VzIGFuZCB0aHVzLAo+PiBp
biBzdWNoIGV4Y2VwdGlvbmFsIGNpcmN1bXN0YW5jZXMsIGEgc2luZ2xlIHNlcmllcyBtYXkgYWRk
IGEgbmV3IGxpbmUgdG8gdGhlCj4+IHRhYmxlIGFuZCByZW1vdmUgYWxsIGV4aXN0aW5nIGxpbmVz
IGJ1dCB3ZSBzaG91bGQgY2xlYXJseSB0cnkgdG8gYXZvaWQgdGhpcwo+PiB3aGVyZSBwb3NzaWJs
ZS4gSW4gdGhpcyBjYXNlIHRob3VnaCwgcGF0Y2ggc2VyaWVzIHRvIHVwZGF0ZSBjaGlsZCBkcml2
ZXJzCj4+IHNob3VsZCBiZSBzaW11bHRhbmVvdXNseSBhdmFpbGFibGUgYW5kIGNvbW1pdHRlZCB0
byB0aGUgcmVsZXZhbnQKPj4gcmVwb3NpdG9yaWVzIHdpdGhpbiB0aGUgc21hbGxlc3QgcG9zc2li
bGUgdGltZSB3aW5kb3cuCj4+CkknbSBhbGwgZm9yIGl0LiBUaGUgY3VycmVudCBjb21iaW5hdG9y
aWFsIGFwcHJvYWNoIGlzIG5vdCB2ZXJ5Cm1haW50YWluYWJsZSBpbiB0aGUgbG9uZyBydW4gYXMg
eW91IHNhaWQuCgotLSAKUmFmYcWCIFdvamR5xYJhClF1YmVzIFRvb2xzIGZvciBXaW5kb3dzIGRl
dmVsb3BlcgpodHRwczovL3d3dy5xdWJlcy1vcy5vcmcvCgpfX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1w
di1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcv
Y2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 15 13:16:01 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 15 Jul 2015 13:16:01 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZFMXZ-0004Cg-8m; Wed, 15 Jul 2015 13:16:01 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=631be2215=Paul.Durrant@citrix.com>)
	id 1ZFMXX-0004CF-C5
	for win-pv-devel@lists.xenproject.org; Wed, 15 Jul 2015 13:15:59 +0000
Received: from [193.109.254.147] by server-11.bemta-14.messagelabs.com id
	7B/FD-30658-E0D56A55; Wed, 15 Jul 2015 13:15:58 +0000
X-Env-Sender: prvs=631be2215=Paul.Durrant@citrix.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1436966153!26218802!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5745 invoked from network); 15 Jul 2015 13:15:53 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Jul 2015 13:15:53 -0000
X-IronPort-AV: E=Sophos;i="5.15,480,1432598400"; 
   d="scan'208";a="1357723"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] more changes to PDO revision numbering
Thread-Index: AdC+345/zgXTPENZRiSUmu7gXvrxUgAB5fZwAAIFwoAABD1MkA==
Date: Wed, 15 Jul 2015 13:15:50 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C872D@AMSPEX01CL02.citrite.net>
References: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C40C3@AMSPEX01CL02.citrite.net>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F4C414B@AMSPEX01CL02.citrite.net>
	<55A65C69.4050402@invisiblethingslab.com>
In-Reply-To: <55A65C69.4050402@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] more changes to PDO revision numbering
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBSYWZhxYIgV29qZHnFgmEgW21h
aWx0bzpvbWVnQGludmlzaWJsZXRoaW5nc2xhYi5jb21dDQo+IFNlbnQ6IDE1IEp1bHkgMjAxNSAx
NDoxMw0KPiBUbzogUGF1bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5v
cmcNCj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxdIG1vcmUgY2hhbmdlcyB0byBQRE8gcmV2
aXNpb24gbnVtYmVyaW5nDQo+IA0KPiBPbiAyMDE1LTA3LTE1IDEyOjE3LCBQYXVsIER1cnJhbnQg
d3JvdGU6DQo+ID4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ID4+IEZyb206IHdpbi1w
di1kZXZlbC1ib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2LWRldmVs
LQ0KPiA+PiBib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnXSBPbiBCZWhhbGYgT2YgUGF1bCBE
dXJyYW50DQo+ID4+IFNlbnQ6IDE1IEp1bHkgMjAxNSAxMTowOQ0KPiA+PiBUbzogd2luLXB2LWRl
dmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+ID4+IFN1YmplY3Q6IFt3aW4tcHYtZGV2ZWxdIG1v
cmUgY2hhbmdlcyB0byBQRE8gcmV2aXNpb24gbnVtYmVyaW5nDQo+ID4+DQo+ID4+IEhpLA0KPiA+
Pg0KPiA+PiAgIEkndmUgcmVjZW50bHkgcmVhbGlzZWQgdGhhdCB0aGUgd2F5IGluIHdoaWNoIFBE
TyByZXZpc2lvbnMgYXJlIGFzc2lnbmVkIGlzDQo+ID4+IGZsYXdlZC4gVGhlIG5lc3RlZC1mb3It
bG9vcCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IGENCj4gPj4gcGFydGlj
dWxhciByZXZpc2lvbiBjb3JyZXNwb25kcyB0byBhIHBhcnRpY3VsYXIgY29tYmluYXRpb24gb2Yg
aW50ZXJmYWNlDQo+ID4+IHZlcnNpb25zIGFzIHdhcyBteSBpbnRlbnRpb24sIGFuZCBhbHNvIHRo
ZSBjb21iaW5hdG9yaWFsIGV4cGxvc2lvbiB0aGF0DQo+ID4+IG9jY3VycyB3aGVuZXZlciBvbmUg
aW50ZXJmYWNlIHZlcnNpb24gaXMgaW5jcmVtZW50ZWQgbWVhbnMgd2UgYnVybg0KPiA+PiB0aHJv
dWdoIFBETyByZXZpc2lvbnMgcHJldHR5IHJhcGlkbHkuICBTbywgSSBwcm9wb3NlIGEgY2hhbmdl
Li4uDQo+ID4+ICAgV2UgZG9uJ3QgcmVhbGx5IG5lZWQgdG8gaGF2ZSBhIHJldmlzaW9uIGZvciAq
ZXZlcnkqIHBvc3NpYmxlIGNvbWJpbmF0aW9uDQo+IG9mDQo+ID4+IGludGVyZmFjZXMuIEEgYnVz
IGRyaXZlciBpbXBsZW1lbnRpbmcgdGhlIG5ld2VzdCAgdmVyc2lvbiBvZiBvbmUNCj4gaW50ZXJm
YWNlDQo+ID4+IGFuZCB0aGUgb2xkZXN0IHZlcnNpb24gb2YgYW5vdGhlciBwb3NzaWJseSB3b3Vs
ZCBuZXZlciBleGlzdCBzaW5jZSBvZnRlbg0KPiA+PiBtdWx0aXBsZSBpbnRlcmZhY2VzIG1heSBi
ZSB1cGRhdGVkIGJ5IGEgc2luZ2xlIChzZXJpZXMgb2YpIGNvbW1pdChzKS4gSQ0KPiA+PiB0aGVy
ZWZvcmUgdGhpbmsgdGhhdCB3ZSBzaG91bGQgbW92ZSB0byBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0
IHVzZXMgYQ0KPiB0YWJsZQ0KPiA+PiBtYXBwaW5nIGEgc2V0IG9mIGludGVyZmFjZSB2ZXJzaW9u
cyB0byBhIFBETyByZXZpc2lvbi4gVG8gZG8gdGhpcywgYW5kDQo+ID4+IG1haW50YWluIHdvcmtp
bmcgY29tYmluYXRpb25zIG9mIGRyaXZlcnMsIHdlIHdpbGwgbmVlZCB0byBmb2xsb3cgc29tZQ0K
PiBydWxlcw0KPiA+PiB0aG91Z2g6DQo+ID4+DQo+ID4+IDEpIFRoZSBsYXN0IGxpbmUgb2YgdGhl
IHRhYmxlIHNob3VsZCBhbHdheXMgbWFwIHRoZSBsYXRlc3QgaW50ZXJmYWNlDQo+IHZlcnNpb25z
IHRvDQo+ID4+IHRoZSBoaWdoZXN0IFBETyByZXZpc2lvbg0KPiA+PiAyKSBBIHBhdGNoIHNob3Vs
ZCBuZXZlciAqbW9kaWZ5KiBhIGxpbmUgaW4gdGhlIHRhYmxlLCBvbmx5IGFkZCBvciByZW1vdmUN
Cj4gPj4gKGFsdGhvdWdoIEkgdGhpbmsgd2UgY2FuIGFsbG93IHRoYXQgZm9yIHBhdGNoZXMgd2l0
aGluIHRoZSBzYW1lIHNlcmllcykNCj4gPj4gMykgQSBsaW5lIHNob3VsZCBub3QgYmUgcmVtb3Zl
ZCBmcm9tIHRoZSB0YWJsZSB1bnRpbCBubyBjaGlsZCBkcml2ZXIgcmVsaWVzDQo+IG9uDQo+ID4+
IGJpbmRpbmcgdG8gdGhhdCBQRE8gcmV2aXNpb24gWzFdLiBJLmUuIGNoaWxkIGRyaXZlcnMgZ2V0
IHVwZGF0ZWQgdG8gYmluZCB0bw0KPiB0aGUNCj4gPj4gbGF0ZXN0IFBETyByZXZpc2lvbiBhbmQg
KnRoZW4qIG9sZCByZXZpc2lvbnMgYXJlIHJldGlyZWQuDQo+ID4+DQo+ID4NCj4gPiBBY3R1YWxs
eSB0aGVyZSdzIGFsc28gYW4gaW1wbGljaXQgcnVsZSBoZXJlIHRoYXQgYWxyZWFkeSBhcHBsaWVk
IHVuZGVyIHRoZSBvbGQNCj4gc2NoZW1lLCBidXQgbWF5IG5vdCBoYXZlIGJlZW4gb2J2aW91czoN
Cj4gPg0KPiA+IDQpIEEgY2hpbGQgZHJpdmVyIG11c3Qgb25seSB1c2UgaW50ZXJmYWNlIHZlcnNp
b25zIHRoYXQgYXJlIG1hcHBlZCB0byB0aGUNCj4gUERPIHJldmlzaW9uIHRvIHdoaWNoIGl0IGJp
bmRzLg0KPiA+DQo+ID4gICBQYXVsDQo+ID4NCj4gPj4gICBVbmRlciB0aGlzIHNjaGVtZSwgSSB0
aGluayB3ZSBjYW4gYWxzbyBkcm9wIHRoZSBuZWVkIHRvIHJlZ2lzdGVyDQo+IGluZGl2aWR1YWwN
Cj4gPj4gaW50ZXJmYWNlIHZlcnNpb25zIGJldHdlZW4gZHJpdmVycyAoaS5lLiB0aGUgY3VycmVu
dCBwcm92aWRlci9zdWJzY3JpYmVyDQo+ID4+IHNjaGVtZSkgc2luY2Ugd2UgY2FuIGluZmVyIHdo
YXQgaW50ZXJmYWNlIHZlcnNpb25zIGEgZHJpdmVyIGlzIHVzaW5nIGJ5DQo+ID4+IGxvb2tpbmcg
YXQgdGhlIE1hdGNoaW5nRGV2aWNlSWQgdmFsdWUgaW4gdGhlIGRldmljZSBzb2Z0d2FyZSBrZXku
DQo+ID4+DQo+ID4+ICAgVG8gZ2V0IGZyb20gd2hlcmUgd2UgYXJlIHRvIHRoaXMgbmV3IHNjaGVt
ZSBJIGFsc28gcHJvcG9zZSB0aGF0IHdlIGp1c3QNCj4gPj4gc3RhcnQgd2l0aCBhIHNpbmdsZSBs
aW5lIHRhYmxlIGluIGVhY2ggYnVzIGRyaXZlciAoWEVOQlVTIGFuZCBYRU5WSUYpDQo+IG1hcHBp
bmcNCj4gPj4gdGhlIGxhdGVzdCBpbnRlcmZhY2UgdmVyc2lvbnMgdG8gdGhlIGN1cnJlbnQgaGln
aGVzdCBQRE8gcmV2aXNpb24uIFRoZQ0KPiBsYXRlc3QNCj4gPj4gdmVyc2lvbnMgb2YgYWxsIGNo
aWxkIGRyaXZlcnMgYXJlIGN1cnJlbnRseSBiaW5kaW5nIHRvIHRoZSBoaWdoZXN0IFBETw0KPiBy
ZXZpc2lvbnMNCj4gPj4gc28gcnVsZSAzIGlzIGFkaGVyZWQgdG8uDQo+ID4+DQo+ID4+ICAgSWYg
YW55b25lIGhhcyBhbnkgdGhvdWdodHMgb24gdGhpcyBwbGVhc2UgbGV0IG1lIGtub3csIG90aGVy
d2lzZSBJIHdpbGwNCj4gPj4gbWFrZSBjaGFuZ2VzIHRoaXMgRnJpZGF5IChKdWx5IDE1dGgpLg0K
PiA+Pg0KPiA+PiAgICAgUGF1bA0KPiA+Pg0KPiA+PiBbMV0gSXQgbWF5IGJlIG5lY2Vzc2FyeSB0
byBkZWxpYmVyYXRlbHkgbWFrZSBpbmNvbXBhdGlibGUgY2hhbmdlcyBhbmQNCj4gdGh1cywNCj4g
Pj4gaW4gc3VjaCBleGNlcHRpb25hbCBjaXJjdW1zdGFuY2VzLCBhIHNpbmdsZSBzZXJpZXMgbWF5
IGFkZCBhIG5ldyBsaW5lIHRvDQo+IHRoZQ0KPiA+PiB0YWJsZSBhbmQgcmVtb3ZlIGFsbCBleGlz
dGluZyBsaW5lcyBidXQgd2Ugc2hvdWxkIGNsZWFybHkgdHJ5IHRvIGF2b2lkIHRoaXMNCj4gPj4g
d2hlcmUgcG9zc2libGUuIEluIHRoaXMgY2FzZSB0aG91Z2gsIHBhdGNoIHNlcmllcyB0byB1cGRh
dGUgY2hpbGQgZHJpdmVycw0KPiA+PiBzaG91bGQgYmUgc2ltdWx0YW5lb3VzbHkgYXZhaWxhYmxl
IGFuZCBjb21taXR0ZWQgdG8gdGhlIHJlbGV2YW50DQo+ID4+IHJlcG9zaXRvcmllcyB3aXRoaW4g
dGhlIHNtYWxsZXN0IHBvc3NpYmxlIHRpbWUgd2luZG93Lg0KPiA+Pg0KPiBJJ20gYWxsIGZvciBp
dC4gVGhlIGN1cnJlbnQgY29tYmluYXRvcmlhbCBhcHByb2FjaCBpcyBub3QgdmVyeQ0KPiBtYWlu
dGFpbmFibGUgaW4gdGhlIGxvbmcgcnVuIGFzIHlvdSBzYWlkLg0KPiANCg0KQ29vbC4gVGhhdCdz
IGdvb2QuIFRoYW5rcywNCg0KICBQYXVsDQoNCj4gLS0NCj4gUmFmYcWCIFdvamR5xYJhDQo+IFF1
YmVzIFRvb2xzIGZvciBXaW5kb3dzIGRldmVsb3Blcg0KPiBodHRwczovL3d3dy5xdWJlcy1vcy5v
cmcvDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4t
cHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpo
dHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1w
di1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 15 13:16:01 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 15 Jul 2015 13:16:01 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZFMXZ-0004Cg-8m; Wed, 15 Jul 2015 13:16:01 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=631be2215=Paul.Durrant@citrix.com>)
	id 1ZFMXX-0004CF-C5
	for win-pv-devel@lists.xenproject.org; Wed, 15 Jul 2015 13:15:59 +0000
Received: from [193.109.254.147] by server-11.bemta-14.messagelabs.com id
	7B/FD-30658-E0D56A55; Wed, 15 Jul 2015 13:15:58 +0000
X-Env-Sender: prvs=631be2215=Paul.Durrant@citrix.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1436966153!26218802!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5745 invoked from network); 15 Jul 2015 13:15:53 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Jul 2015 13:15:53 -0000
X-IronPort-AV: E=Sophos;i="5.15,480,1432598400"; 
   d="scan'208";a="1357723"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] more changes to PDO revision numbering
Thread-Index: AdC+345/zgXTPENZRiSUmu7gXvrxUgAB5fZwAAIFwoAABD1MkA==
Date: Wed, 15 Jul 2015 13:15:50 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C872D@AMSPEX01CL02.citrite.net>
References: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4C40C3@AMSPEX01CL02.citrite.net>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F4C414B@AMSPEX01CL02.citrite.net>
	<55A65C69.4050402@invisiblethingslab.com>
In-Reply-To: <55A65C69.4050402@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] more changes to PDO revision numbering
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBSYWZhxYIgV29qZHnFgmEgW21h
aWx0bzpvbWVnQGludmlzaWJsZXRoaW5nc2xhYi5jb21dDQo+IFNlbnQ6IDE1IEp1bHkgMjAxNSAx
NDoxMw0KPiBUbzogUGF1bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5v
cmcNCj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxdIG1vcmUgY2hhbmdlcyB0byBQRE8gcmV2
aXNpb24gbnVtYmVyaW5nDQo+IA0KPiBPbiAyMDE1LTA3LTE1IDEyOjE3LCBQYXVsIER1cnJhbnQg
d3JvdGU6DQo+ID4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ID4+IEZyb206IHdpbi1w
di1kZXZlbC1ib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2LWRldmVs
LQ0KPiA+PiBib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnXSBPbiBCZWhhbGYgT2YgUGF1bCBE
dXJyYW50DQo+ID4+IFNlbnQ6IDE1IEp1bHkgMjAxNSAxMTowOQ0KPiA+PiBUbzogd2luLXB2LWRl
dmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+ID4+IFN1YmplY3Q6IFt3aW4tcHYtZGV2ZWxdIG1v
cmUgY2hhbmdlcyB0byBQRE8gcmV2aXNpb24gbnVtYmVyaW5nDQo+ID4+DQo+ID4+IEhpLA0KPiA+
Pg0KPiA+PiAgIEkndmUgcmVjZW50bHkgcmVhbGlzZWQgdGhhdCB0aGUgd2F5IGluIHdoaWNoIFBE
TyByZXZpc2lvbnMgYXJlIGFzc2lnbmVkIGlzDQo+ID4+IGZsYXdlZC4gVGhlIG5lc3RlZC1mb3It
bG9vcCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IGENCj4gPj4gcGFydGlj
dWxhciByZXZpc2lvbiBjb3JyZXNwb25kcyB0byBhIHBhcnRpY3VsYXIgY29tYmluYXRpb24gb2Yg
aW50ZXJmYWNlDQo+ID4+IHZlcnNpb25zIGFzIHdhcyBteSBpbnRlbnRpb24sIGFuZCBhbHNvIHRo
ZSBjb21iaW5hdG9yaWFsIGV4cGxvc2lvbiB0aGF0DQo+ID4+IG9jY3VycyB3aGVuZXZlciBvbmUg
aW50ZXJmYWNlIHZlcnNpb24gaXMgaW5jcmVtZW50ZWQgbWVhbnMgd2UgYnVybg0KPiA+PiB0aHJv
dWdoIFBETyByZXZpc2lvbnMgcHJldHR5IHJhcGlkbHkuICBTbywgSSBwcm9wb3NlIGEgY2hhbmdl
Li4uDQo+ID4+ICAgV2UgZG9uJ3QgcmVhbGx5IG5lZWQgdG8gaGF2ZSBhIHJldmlzaW9uIGZvciAq
ZXZlcnkqIHBvc3NpYmxlIGNvbWJpbmF0aW9uDQo+IG9mDQo+ID4+IGludGVyZmFjZXMuIEEgYnVz
IGRyaXZlciBpbXBsZW1lbnRpbmcgdGhlIG5ld2VzdCAgdmVyc2lvbiBvZiBvbmUNCj4gaW50ZXJm
YWNlDQo+ID4+IGFuZCB0aGUgb2xkZXN0IHZlcnNpb24gb2YgYW5vdGhlciBwb3NzaWJseSB3b3Vs
ZCBuZXZlciBleGlzdCBzaW5jZSBvZnRlbg0KPiA+PiBtdWx0aXBsZSBpbnRlcmZhY2VzIG1heSBi
ZSB1cGRhdGVkIGJ5IGEgc2luZ2xlIChzZXJpZXMgb2YpIGNvbW1pdChzKS4gSQ0KPiA+PiB0aGVy
ZWZvcmUgdGhpbmsgdGhhdCB3ZSBzaG91bGQgbW92ZSB0byBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0
IHVzZXMgYQ0KPiB0YWJsZQ0KPiA+PiBtYXBwaW5nIGEgc2V0IG9mIGludGVyZmFjZSB2ZXJzaW9u
cyB0byBhIFBETyByZXZpc2lvbi4gVG8gZG8gdGhpcywgYW5kDQo+ID4+IG1haW50YWluIHdvcmtp
bmcgY29tYmluYXRpb25zIG9mIGRyaXZlcnMsIHdlIHdpbGwgbmVlZCB0byBmb2xsb3cgc29tZQ0K
PiBydWxlcw0KPiA+PiB0aG91Z2g6DQo+ID4+DQo+ID4+IDEpIFRoZSBsYXN0IGxpbmUgb2YgdGhl
IHRhYmxlIHNob3VsZCBhbHdheXMgbWFwIHRoZSBsYXRlc3QgaW50ZXJmYWNlDQo+IHZlcnNpb25z
IHRvDQo+ID4+IHRoZSBoaWdoZXN0IFBETyByZXZpc2lvbg0KPiA+PiAyKSBBIHBhdGNoIHNob3Vs
ZCBuZXZlciAqbW9kaWZ5KiBhIGxpbmUgaW4gdGhlIHRhYmxlLCBvbmx5IGFkZCBvciByZW1vdmUN
Cj4gPj4gKGFsdGhvdWdoIEkgdGhpbmsgd2UgY2FuIGFsbG93IHRoYXQgZm9yIHBhdGNoZXMgd2l0
aGluIHRoZSBzYW1lIHNlcmllcykNCj4gPj4gMykgQSBsaW5lIHNob3VsZCBub3QgYmUgcmVtb3Zl
ZCBmcm9tIHRoZSB0YWJsZSB1bnRpbCBubyBjaGlsZCBkcml2ZXIgcmVsaWVzDQo+IG9uDQo+ID4+
IGJpbmRpbmcgdG8gdGhhdCBQRE8gcmV2aXNpb24gWzFdLiBJLmUuIGNoaWxkIGRyaXZlcnMgZ2V0
IHVwZGF0ZWQgdG8gYmluZCB0bw0KPiB0aGUNCj4gPj4gbGF0ZXN0IFBETyByZXZpc2lvbiBhbmQg
KnRoZW4qIG9sZCByZXZpc2lvbnMgYXJlIHJldGlyZWQuDQo+ID4+DQo+ID4NCj4gPiBBY3R1YWxs
eSB0aGVyZSdzIGFsc28gYW4gaW1wbGljaXQgcnVsZSBoZXJlIHRoYXQgYWxyZWFkeSBhcHBsaWVk
IHVuZGVyIHRoZSBvbGQNCj4gc2NoZW1lLCBidXQgbWF5IG5vdCBoYXZlIGJlZW4gb2J2aW91czoN
Cj4gPg0KPiA+IDQpIEEgY2hpbGQgZHJpdmVyIG11c3Qgb25seSB1c2UgaW50ZXJmYWNlIHZlcnNp
b25zIHRoYXQgYXJlIG1hcHBlZCB0byB0aGUNCj4gUERPIHJldmlzaW9uIHRvIHdoaWNoIGl0IGJp
bmRzLg0KPiA+DQo+ID4gICBQYXVsDQo+ID4NCj4gPj4gICBVbmRlciB0aGlzIHNjaGVtZSwgSSB0
aGluayB3ZSBjYW4gYWxzbyBkcm9wIHRoZSBuZWVkIHRvIHJlZ2lzdGVyDQo+IGluZGl2aWR1YWwN
Cj4gPj4gaW50ZXJmYWNlIHZlcnNpb25zIGJldHdlZW4gZHJpdmVycyAoaS5lLiB0aGUgY3VycmVu
dCBwcm92aWRlci9zdWJzY3JpYmVyDQo+ID4+IHNjaGVtZSkgc2luY2Ugd2UgY2FuIGluZmVyIHdo
YXQgaW50ZXJmYWNlIHZlcnNpb25zIGEgZHJpdmVyIGlzIHVzaW5nIGJ5DQo+ID4+IGxvb2tpbmcg
YXQgdGhlIE1hdGNoaW5nRGV2aWNlSWQgdmFsdWUgaW4gdGhlIGRldmljZSBzb2Z0d2FyZSBrZXku
DQo+ID4+DQo+ID4+ICAgVG8gZ2V0IGZyb20gd2hlcmUgd2UgYXJlIHRvIHRoaXMgbmV3IHNjaGVt
ZSBJIGFsc28gcHJvcG9zZSB0aGF0IHdlIGp1c3QNCj4gPj4gc3RhcnQgd2l0aCBhIHNpbmdsZSBs
aW5lIHRhYmxlIGluIGVhY2ggYnVzIGRyaXZlciAoWEVOQlVTIGFuZCBYRU5WSUYpDQo+IG1hcHBp
bmcNCj4gPj4gdGhlIGxhdGVzdCBpbnRlcmZhY2UgdmVyc2lvbnMgdG8gdGhlIGN1cnJlbnQgaGln
aGVzdCBQRE8gcmV2aXNpb24uIFRoZQ0KPiBsYXRlc3QNCj4gPj4gdmVyc2lvbnMgb2YgYWxsIGNo
aWxkIGRyaXZlcnMgYXJlIGN1cnJlbnRseSBiaW5kaW5nIHRvIHRoZSBoaWdoZXN0IFBETw0KPiBy
ZXZpc2lvbnMNCj4gPj4gc28gcnVsZSAzIGlzIGFkaGVyZWQgdG8uDQo+ID4+DQo+ID4+ICAgSWYg
YW55b25lIGhhcyBhbnkgdGhvdWdodHMgb24gdGhpcyBwbGVhc2UgbGV0IG1lIGtub3csIG90aGVy
d2lzZSBJIHdpbGwNCj4gPj4gbWFrZSBjaGFuZ2VzIHRoaXMgRnJpZGF5IChKdWx5IDE1dGgpLg0K
PiA+Pg0KPiA+PiAgICAgUGF1bA0KPiA+Pg0KPiA+PiBbMV0gSXQgbWF5IGJlIG5lY2Vzc2FyeSB0
byBkZWxpYmVyYXRlbHkgbWFrZSBpbmNvbXBhdGlibGUgY2hhbmdlcyBhbmQNCj4gdGh1cywNCj4g
Pj4gaW4gc3VjaCBleGNlcHRpb25hbCBjaXJjdW1zdGFuY2VzLCBhIHNpbmdsZSBzZXJpZXMgbWF5
IGFkZCBhIG5ldyBsaW5lIHRvDQo+IHRoZQ0KPiA+PiB0YWJsZSBhbmQgcmVtb3ZlIGFsbCBleGlz
dGluZyBsaW5lcyBidXQgd2Ugc2hvdWxkIGNsZWFybHkgdHJ5IHRvIGF2b2lkIHRoaXMNCj4gPj4g
d2hlcmUgcG9zc2libGUuIEluIHRoaXMgY2FzZSB0aG91Z2gsIHBhdGNoIHNlcmllcyB0byB1cGRh
dGUgY2hpbGQgZHJpdmVycw0KPiA+PiBzaG91bGQgYmUgc2ltdWx0YW5lb3VzbHkgYXZhaWxhYmxl
IGFuZCBjb21taXR0ZWQgdG8gdGhlIHJlbGV2YW50DQo+ID4+IHJlcG9zaXRvcmllcyB3aXRoaW4g
dGhlIHNtYWxsZXN0IHBvc3NpYmxlIHRpbWUgd2luZG93Lg0KPiA+Pg0KPiBJJ20gYWxsIGZvciBp
dC4gVGhlIGN1cnJlbnQgY29tYmluYXRvcmlhbCBhcHByb2FjaCBpcyBub3QgdmVyeQ0KPiBtYWlu
dGFpbmFibGUgaW4gdGhlIGxvbmcgcnVuIGFzIHlvdSBzYWlkLg0KPiANCg0KQ29vbC4gVGhhdCdz
IGdvb2QuIFRoYW5rcywNCg0KICBQYXVsDQoNCj4gLS0NCj4gUmFmYcWCIFdvamR5xYJhDQo+IFF1
YmVzIFRvb2xzIGZvciBXaW5kb3dzIGRldmVsb3Blcg0KPiBodHRwczovL3d3dy5xdWJlcy1vcy5v
cmcvDQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4t
cHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpo
dHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1w
di1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:20:10 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:20:10 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7F4-0001v3-2P; Mon, 20 Jul 2015 09:20:10 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7F2-0001ux-DG
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:20:08 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	67/7C-01469-74DBCA55; Mon, 20 Jul 2015 09:20:07 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1437384007!33551486!1
X-Originating-IP: [209.85.212.178]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16526 invoked from network); 20 Jul 2015 09:20:07 -0000
Received: from mail-wi0-f178.google.com (HELO mail-wi0-f178.google.com)
	(209.85.212.178)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:20:07 -0000
Received: by wibud3 with SMTP id ud3so90995900wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:20:06 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=+BbcdVuZRh+9PvcoIi3Z7jJfkCzPhCxdWFORI7m4GNc=;
	b=AJSswhUrj8PgDmTqBd+fKyXihIgqmmFXW8bwm3woAowbPTvXzxtJCKh8/4oxzBjDlj
	9NfssEGMT7lpdvJHGFUYU2RloDlZKr3IREQx1diSgGfp8HqDnbVqOh9Ffan/k2a12+PS
	6uuQAEcK7J3nyf989MqdBKbuuId7/bVBCtYufbwNQ7WCCWdqqKEP0q0Sg4VL0nzL8ej9
	FfBmWy8RjyHT35WiKCClGD5+9O8lomegT+O+ZC8JLrPy3CPqjB+P6DVuvQ4KSd9KbQdP
	gQ8iGeyvxbA0BVQXsP4cUiw0ZidHkSrwVZb5Mxtff2LwfWskVS8ONELoP9sKSxBTDp3X
	Jljg==
X-Received: by 10.194.133.73 with SMTP id pa9mr53830010wjb.148.1437384006750; 
	Mon, 20 Jul 2015 02:20:06 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	l6sm10833795wib.18.2015.07.20.02.20.04
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:20:05 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:19:52 +0100
Message-Id: <1437383995-6240-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 0/3] New PDO revision numbering policy and
	unplug mechanism
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The first patch in this series changes XENBUS to use the new PDO revision
numbering policy, without breaking compatibility. The second then follows
up with co-installer changes to use PDO revision for compatibility checks
rather then individual interface version numbers.

The last patch, however, does make an incompatible change (and so
simultaneously adds a new PDO revision and removes all others) as it
introduces a new interfaces for doing driver (rather than co-installer)
initiated unplug of emulated devices. Subsequent series will bring the
child drivers up to date.

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:20:10 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:20:10 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7F4-0001v3-2P; Mon, 20 Jul 2015 09:20:10 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7F2-0001ux-DG
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:20:08 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	67/7C-01469-74DBCA55; Mon, 20 Jul 2015 09:20:07 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1437384007!33551486!1
X-Originating-IP: [209.85.212.178]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16526 invoked from network); 20 Jul 2015 09:20:07 -0000
Received: from mail-wi0-f178.google.com (HELO mail-wi0-f178.google.com)
	(209.85.212.178)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:20:07 -0000
Received: by wibud3 with SMTP id ud3so90995900wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:20:06 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=+BbcdVuZRh+9PvcoIi3Z7jJfkCzPhCxdWFORI7m4GNc=;
	b=AJSswhUrj8PgDmTqBd+fKyXihIgqmmFXW8bwm3woAowbPTvXzxtJCKh8/4oxzBjDlj
	9NfssEGMT7lpdvJHGFUYU2RloDlZKr3IREQx1diSgGfp8HqDnbVqOh9Ffan/k2a12+PS
	6uuQAEcK7J3nyf989MqdBKbuuId7/bVBCtYufbwNQ7WCCWdqqKEP0q0Sg4VL0nzL8ej9
	FfBmWy8RjyHT35WiKCClGD5+9O8lomegT+O+ZC8JLrPy3CPqjB+P6DVuvQ4KSd9KbQdP
	gQ8iGeyvxbA0BVQXsP4cUiw0ZidHkSrwVZb5Mxtff2LwfWskVS8ONELoP9sKSxBTDp3X
	Jljg==
X-Received: by 10.194.133.73 with SMTP id pa9mr53830010wjb.148.1437384006750; 
	Mon, 20 Jul 2015 02:20:06 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	l6sm10833795wib.18.2015.07.20.02.20.04
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:20:05 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:19:52 +0100
Message-Id: <1437383995-6240-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 0/3] New PDO revision numbering policy and
	unplug mechanism
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The first patch in this series changes XENBUS to use the new PDO revision
numbering policy, without breaking compatibility. The second then follows
up with co-installer changes to use PDO revision for compatibility checks
rather then individual interface version numbers.

The last patch, however, does make an incompatible change (and so
simultaneously adds a new PDO revision and removes all others) as it
introduces a new interfaces for doing driver (rather than co-installer)
initiated unplug of emulated devices. Subsequent series will bring the
child drivers up to date.

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:20:12 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:20:12 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7F6-0001vY-3Z; Mon, 20 Jul 2015 09:20:12 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7F4-0001v7-OZ
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:20:11 +0000
Received: from [85.158.139.211] by server-1.bemta-5.messagelabs.com id
	97/4F-04112-A4DBCA55; Mon, 20 Jul 2015 09:20:10 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-15.tower-206.messagelabs.com!1437384008!18912833!1
X-Originating-IP: [74.125.82.51]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9928 invoked from network); 20 Jul 2015 09:20:08 -0000
Received: from mail-wg0-f51.google.com (HELO mail-wg0-f51.google.com)
	(74.125.82.51)
	by server-15.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:20:08 -0000
Received: by wgkl9 with SMTP id l9so125411170wgk.1
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:20:08 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=9LgUhLMb5BGu+G9Ut2RNygXOVVoN+UF7KD4XwVOI3O0=;
	b=bVv0VcXa8cX9w7dThBTQ5BV/GmFpizutetHyHOJvpoQ6a8RevYEPf6W8INq/2JjZKk
	QwDNPGnofv0szGzh+minubrBXyXE6CRMsjG0dh9NMOoHGTjCe3E7ohrqqTAgIDKeB387
	TB+wAhZ5bEfyR5Aju+98cZrFg2p7kki9nlcv2zpzKTSm09KQJ7OoTTIOOt+1pE91ax6/
	Y6+yyDIIJv6nW5o0hcpZ29vWUYNHR19uuEqzPWEGbYn/+QEytuVMDM9oIbRJbDoQuY4N
	xcyWkNOqnxO3Jxn4QJQywS0fGCUjvFqrNScB4snj0UAGlEVs51ZlRwWcXyB34sB14axN
	2GAA==
X-Received: by 10.180.90.81 with SMTP id bu17mr19740965wib.35.1437384008554;
	Mon, 20 Jul 2015 02:20:08 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	l6sm10833795wib.18.2015.07.20.02.20.06
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:20:07 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:19:53 +0100
Message-Id: <1437383995-6240-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437383995-6240-1-git-send-email-paul.durrant@citrix.com>
References: <1437383995-6240-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/3] Apply new PDO revision numbering policy
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This patch also removes XENFILT_UNPLUG_INTERFACE from the set that can
be queried by a child driver. No child driver ever used it.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/revision.h |  50 +++++++++
 src/xenbus/pdo.c   | 294 +++++++++++++++++++++--------------------------------
 2 files changed, 167 insertions(+), 177 deletions(-)
 create mode 100644 include/revision.h

diff --git a/include/revision.h b/include/revision.h
new file mode 100644
index 0000000..9a91a33
--- /dev/null
+++ b/include/revision.h
@@ -0,0 +1,50 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _REVISION_H
+#define _REVISION_H
+
+// Key:
+// S  - XENBUS_SUSPEND_INTERFACE
+// SI - XENBUS_SHARED_INFO_INTERFACE
+// E  - XENBUS_EVTCHN_INTERFACE
+// D  - XENBUS_DEBUG_INTEFACE
+// ST - XENBUS_STORE_INTERFACE
+// R  - XENBUS_RANGE_SET_INTERFACE
+// C  - XENBUS_CACHE_INTERFACE
+// G  - XENBUS_GNTTAB_INTERFACE
+// EM - XENFILT_EMULATED_INTERFACE
+
+//                    REVISION   S  SI   E   D  ST   R   C   G  EM
+#define DEFINE_REVISION_TABLE                                      \
+    DEFINE_REVISION(0x08000008,  1,  2,  4,  1,  1,  1,  1,  1,  1)
+
+#endif  // _REVISION_H
diff --git a/src/xenbus/pdo.c b/src/xenbus/pdo.c
index 58150d0..f305bb7 100644
--- a/src/xenbus/pdo.c
+++ b/src/xenbus/pdo.c
@@ -36,7 +36,6 @@
 #include <ntstrsafe.h>
 
 #include <emulated_interface.h>
-#include <unplug_interface.h>
 
 #include "names.h"
 #include "fdo.h"
@@ -49,6 +48,7 @@
 #include "assert.h"
 #include "util.h"
 #include "version.h"
+#include "revision.h"
 
 #define PDO_TAG 'ODP'
 
@@ -69,9 +69,6 @@ struct _XENBUS_PDO {
     BOOLEAN                     Removable;
     BOOLEAN                     Ejectable;
 
-    PULONG                      Revision;
-    ULONG                       Count;
-
     BUS_INTERFACE_STANDARD      BusInterface;
 
     XENBUS_SUSPEND_INTERFACE    SuspendInterface;
@@ -355,155 +352,108 @@ PdoGetFdo(
     return __PdoGetFdo(Pdo);
 }
 
-static NTSTATUS
-PdoAddRevision(
-    IN  PXENBUS_PDO Pdo,
-    IN  ULONG       Revision
-    )
-{
-    PVOID           Buffer;
-    ULONG           Count;
-    NTSTATUS        status;
-
-    Count = Pdo->Count + 1;
-
-    Buffer = __PdoAllocate(sizeof (ULONG) * Count);
-
-    status = STATUS_NO_MEMORY;
-    if (Buffer == NULL)
-        goto fail1;
-
-    if (Pdo->Revision != NULL) {
-        RtlCopyMemory(Buffer,
-                      Pdo->Revision,
-                      sizeof (ULONG) * Pdo->Count);
-        __PdoFree(Pdo->Revision);
-    }
-
-    Pdo->Revision = Buffer;
-    Pdo->Revision[Pdo->Count] = Revision;
-
-    Pdo->Count++;
-    ASSERT3U(Pdo->Count, <=, 64);
-
-    return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
+typedef struct _XENBUS_PDO_REVISION {
+    ULONG   Number;
+    ULONG   SuspendInterfaceVersion;
+    ULONG   SharedInfoInterfaceVersion;
+    ULONG   EvtchnInterfaceVersion;
+    ULONG   DebugInterfaceVersion;
+    ULONG   StoreInterfaceVersion;
+    ULONG   RangeSetInterfaceVersion;
+    ULONG   CacheInterfaceVersion;
+    ULONG   GnttabInterfaceVersion;
+    ULONG   EmulatedInterfaceVersion;
+} XENBUS_PDO_REVISION, *PXENBUS_PDO_REVISION;
+
+#define DEFINE_REVISION(_N, _S, _SI, _E, _D, _ST, _R, _C, _G, _EM) \
+    { (_N), (_S), (_SI), (_E), (_D), (_ST), (_R), (_C), (_G), (_EM) }
+
+static XENBUS_PDO_REVISION PdoRevision[] = {
+    DEFINE_REVISION_TABLE
+};
 
-    return status;
-}
+#undef DEFINE_REVISION
 
-static NTSTATUS
-PdoSetRevisions(
+static VOID
+PdoDumpRevisions(
     IN  PXENBUS_PDO Pdo
     )
 {
-    ULONG           Suspend;
-    ULONG           Revision;
-    NTSTATUS        status;
-
-    Revision = MAJOR_VERSION << 24;
+    ULONG           Index;
 
-    // Enumerate all possible combinations of exported interface versions since v1
-    // and add a PDO revsion for each combination that's currently supported. Note that
-    // the exported interfaces include any interface queries we pass through.
-    // We must enumerate from v1 to ensure that revision numbers don't change
-    // even when a particular combination of interface versions becomes
-    // unsupported. (See README.md for API versioning policy).
-
-    for (Suspend = 1; Suspend <= XENBUS_SUSPEND_INTERFACE_VERSION_MAX; Suspend++) {
-        ULONG   SharedInfo;
-        
-        for (SharedInfo = 1; SharedInfo <= XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX; SharedInfo++) {
-            ULONG   Evtchn;
-            
-            for (Evtchn = 1; Evtchn <= XENBUS_EVTCHN_INTERFACE_VERSION_MAX; Evtchn++) {
-                ULONG   Debug;
-
-                for (Debug = 1; Debug <= XENBUS_DEBUG_INTERFACE_VERSION_MAX; Debug++) {
-                    ULONG   Store;
-
-                    for (Store = 1; Store <= XENBUS_STORE_INTERFACE_VERSION_MAX; Store++) {
-                        ULONG   RangeSet;
-
-                        for (RangeSet = 1; RangeSet <= XENBUS_RANGE_SET_INTERFACE_VERSION_MAX; RangeSet++) {
-                            ULONG   Cache;
-                            
-                            for (Cache = 1; Cache <= XENBUS_CACHE_INTERFACE_VERSION_MAX; Cache++) {
-                                ULONG   Gnttab;
-                            
-                                for (Gnttab = 1; Gnttab <= XENBUS_GNTTAB_INTERFACE_VERSION_MAX; Gnttab++) {
-                                    ULONG   Emulated;
-                                
-                                    for (Emulated = 1; Emulated <= XENFILT_EMULATED_INTERFACE_VERSION_MAX; Emulated++) {
-                                        ULONG   Unplug;
-
-                                        for (Unplug = 1; Unplug <= XENFILT_UNPLUG_INTERFACE_VERSION_MAX; Unplug++) {
-                                            Revision++;
-
-                                            if (Suspend >= XENBUS_SUSPEND_INTERFACE_VERSION_MIN &&
-                                                SharedInfo >= XENBUS_SHARED_INFO_INTERFACE_VERSION_MIN &&
-                                                Evtchn >= XENBUS_EVTCHN_INTERFACE_VERSION_MIN &&
-                                                Debug >= XENBUS_DEBUG_INTERFACE_VERSION_MIN &&
-                                                Store >= XENBUS_STORE_INTERFACE_VERSION_MIN &&
-                                                RangeSet >= XENBUS_RANGE_SET_INTERFACE_VERSION_MIN &&
-                                                Cache >= XENBUS_CACHE_INTERFACE_VERSION_MIN &&
-                                                Gnttab >= XENBUS_GNTTAB_INTERFACE_VERSION_MIN &&
-                                                Emulated >= XENFILT_EMULATED_INTERFACE_VERSION_MIN &&
-                                                Unplug >= XENFILT_UNPLUG_INTERFACE_VERSION_MIN) {
-                                                Info("%08X -> "
-                                                     "SUSPEND v%u "
-                                                     "SHARED_INFO v%u "
-                                                     "EVTCHN v%u "
-                                                     "DEBUG v%u "
-                                                     "STORE v%u "
-                                                     "RANGE_SET v%u "
-                                                     "CACHE v%u "
-                                                     "GNTTAB v%u "
-                                                     "EMULATED v%u "
-                                                     "UNPLUG v%u\n",
-                                                     Revision,
-                                                     Suspend,
-                                                     SharedInfo,
-                                                     Evtchn,
-                                                     Debug,
-                                                     Store,
-                                                     RangeSet,
-                                                     Cache,
-                                                     Gnttab,
-                                                     Emulated,
-                                                     Unplug);
-
-                                                status = PdoAddRevision(Pdo, Revision);
-                                                if (!NT_SUCCESS(status))
-                                                    goto fail1;
-                                            }   
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }   
-        }
-    }                             
-
-    ASSERT(Pdo->Count > 0);
-    return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
+    UNREFERENCED_PARAMETER(Pdo);
 
-    if (Pdo->Revision != NULL) {
-        __PdoFree(Pdo->Revision);
-        Pdo->Revision = NULL;
+    for (Index = 0; Index < ARRAYSIZE(PdoRevision); Index++) {
+        PXENBUS_PDO_REVISION Revision = &PdoRevision[Index];
+
+        ASSERT3U(Revision->SuspendInterfaceVersion, >=, XENBUS_SUSPEND_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->SuspendInterfaceVersion, <=, XENBUS_SUSPEND_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->SuspendInterfaceVersion == XENBUS_SUSPEND_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->SharedInfoInterfaceVersion, >=, XENBUS_SHARED_INFO_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->SharedInfoInterfaceVersion, <=, XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->SharedInfoInterfaceVersion == XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->EvtchnInterfaceVersion, >=, XENBUS_EVTCHN_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->EvtchnInterfaceVersion, <=, XENBUS_EVTCHN_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->EvtchnInterfaceVersion == XENBUS_EVTCHN_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->DebugInterfaceVersion, >=, XENBUS_DEBUG_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->DebugInterfaceVersion, <=, XENBUS_DEBUG_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->DebugInterfaceVersion == XENBUS_DEBUG_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->StoreInterfaceVersion, >=, XENBUS_STORE_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->StoreInterfaceVersion, <=, XENBUS_STORE_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->StoreInterfaceVersion == XENBUS_STORE_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->RangeSetInterfaceVersion, >=, XENBUS_RANGE_SET_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->RangeSetInterfaceVersion, <=, XENBUS_RANGE_SET_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->RangeSetInterfaceVersion == XENBUS_RANGE_SET_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->CacheInterfaceVersion, >=, XENBUS_CACHE_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->CacheInterfaceVersion, <=, XENBUS_CACHE_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->CacheInterfaceVersion == XENBUS_CACHE_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->GnttabInterfaceVersion, >=, XENBUS_GNTTAB_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->GnttabInterfaceVersion, <=, XENBUS_GNTTAB_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->GnttabInterfaceVersion == XENBUS_GNTTAB_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->EmulatedInterfaceVersion, >=, XENFILT_EMULATED_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->EmulatedInterfaceVersion, <=, XENFILT_EMULATED_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->EmulatedInterfaceVersion == XENFILT_EMULATED_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->Number >> 24, ==, MAJOR_VERSION);
+
+        Info("%08X -> "
+             "SUSPEND v%u "
+             "SHARED_INFO v%u "
+             "EVTCHN v%u "
+             "DEBUG v%u "
+             "STORE v%u "
+             "RANGE_SET v%u "
+             "CACHE v%u "
+             "GNTTAB v%u "
+             "EMULATED v%u\n",
+             Revision->Number,
+             Revision->SuspendInterfaceVersion,
+             Revision->SharedInfoInterfaceVersion,
+             Revision->EvtchnInterfaceVersion,
+             Revision->DebugInterfaceVersion,
+             Revision->StoreInterfaceVersion,
+             Revision->RangeSetInterfaceVersion,
+             Revision->CacheInterfaceVersion,
+             Revision->GnttabInterfaceVersion,
+             Revision->EmulatedInterfaceVersion);
     }
-
-    Pdo->Count = 0;
-
-    return status;
 }
 
 static FORCEINLINE PDEVICE_OBJECT
@@ -1078,7 +1028,6 @@ static struct _INTERFACE_ENTRY PdoInterfaceTable[] = {
     { &GUID_XENBUS_CACHE_INTERFACE, "CACHE_INTERFACE", PdoQueryCacheInterface },
     { &GUID_XENBUS_GNTTAB_INTERFACE, "GNTTAB_INTERFACE", PdoQueryGnttabInterface },
     { &GUID_XENFILT_EMULATED_INTERFACE, "EMULATED_INTERFACE", PdoDelegateIrp },
-    { &GUID_XENFILT_UNPLUG_INTERFACE, "UNPLUG_INTERFACE", PdoDelegateIrp },
     { NULL, NULL, NULL }
 };
 
@@ -1405,12 +1354,12 @@ PdoQueryId(
 
     case BusQueryHardwareIDs:
         Trace("BusQueryHardwareIDs\n");
-        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * Pdo->Count) * sizeof (WCHAR);
+        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * ARRAYSIZE(PdoRevision)) * sizeof (WCHAR);
         break;
 
     case BusQueryCompatibleIDs:
         Trace("BusQueryCompatibleIDs\n");
-        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * Pdo->Count) * sizeof (WCHAR);
+        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * ARRAYSIZE(PdoRevision)) * sizeof (WCHAR);
         break;
 
     default:
@@ -1440,17 +1389,19 @@ PdoQueryId(
         break;
 
     case BusQueryDeviceID: {
-        ULONG   Index;
+        ULONG                   Index;
+        PXENBUS_PDO_REVISION    Revision;
 
         Type = REG_SZ;
-        Index = Pdo->Count - 1;
+        Index = ARRAYSIZE(PdoRevision) - 1;
+        Revision = &PdoRevision[Index];
 
         status = RtlStringCbPrintfW(Buffer,
                                     Id.MaximumLength,
                                     L"XENBUS\\VEN_%hs&DEV_%hs&REV_%08X",
                                     __PdoGetVendorName(Pdo),
                                     __PdoGetName(Pdo),
-                                    Pdo->Revision[Index]);
+                                    Revision->Number);
         ASSERT(NT_SUCCESS(status));
 
         Buffer += wcslen(Buffer);
@@ -1465,13 +1416,15 @@ PdoQueryId(
         Type = REG_MULTI_SZ;
         Length = Id.MaximumLength;
 
-        for (Index = 0; Index < Pdo->Count; Index++) {
-            status = RtlStringCbPrintfW(Buffer,
-                                        Length,
-                                        L"XENBUS\\VEN_%hs&DEV_%hs&REV_%08X",
-                                        __PdoGetVendorName(Pdo),
-                                        __PdoGetName(Pdo),
-                                        Pdo->Revision[Index]);
+        for (Index = 0; Index < ARRAYSIZE(PdoRevision); Index++) {
+            PXENBUS_PDO_REVISION Revision = &PdoRevision[Index];
+
+           status = RtlStringCbPrintfW(Buffer,
+                                       Length,
+                                       L"XENBUS\\VEN_%hs&DEV_%hs&REV_%08X",
+                                       __PdoGetVendorName(Pdo),
+                                       __PdoGetName(Pdo),
+                                       Revision->Number);
             ASSERT(NT_SUCCESS(status));
 
             Buffer += wcslen(Buffer);
@@ -2126,13 +2079,9 @@ PdoCreate(
     __PdoSetRemovable(Pdo);
     __PdoSetEjectable(Pdo);
 
-    status = PdoSetRevisions(Pdo);
-    if (!NT_SUCCESS(status))
-        goto fail5;
-
     status = BusInitialize(Pdo, &Pdo->BusInterface);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail5;
 
     status = SuspendGetInterface(FdoGetSuspendContext(Fdo),
                                  XENBUS_SUSPEND_INTERFACE_VERSION_MAX,
@@ -2141,10 +2090,11 @@ PdoCreate(
     ASSERT(NT_SUCCESS(status));
     ASSERT(Pdo->SuspendInterface.Interface.Context != NULL);
 
-    Info("%p (%s: Highest Revision = %08X)\n",
+    Info("%p (%s)\n",
          PhysicalDeviceObject,
-         __PdoGetName(Pdo),
-         Pdo->Revision[Pdo->Count - 1]);
+         __PdoGetName(Pdo));
+
+    PdoDumpRevisions(Pdo);
 
     Dx->Pdo = Pdo;
     PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
@@ -2153,16 +2103,10 @@ PdoCreate(
 
     return STATUS_SUCCESS;
 
-fail6:
-    Error("fail6\n");
-
-    __PdoFree(Pdo->Revision);
-    Pdo->Revision = NULL;
-    Pdo->Count = 0;
-
 fail5:
     Error("fail5\n");
 
+    Pdo->Ejectable = FALSE;
     Pdo->Removable = FALSE;
 
     ThreadAlert(Pdo->DevicePowerThread);
@@ -2225,10 +2169,6 @@ PdoDestroy(
 
     BusTeardown(&Pdo->BusInterface);
 
-    __PdoFree(Pdo->Revision);
-    Pdo->Revision = NULL;
-    Pdo->Count = 0;
-
     Pdo->Ejectable = FALSE;
     Pdo->Removable = FALSE;
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:20:12 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:20:12 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7F6-0001vY-3Z; Mon, 20 Jul 2015 09:20:12 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7F4-0001v7-OZ
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:20:11 +0000
Received: from [85.158.139.211] by server-1.bemta-5.messagelabs.com id
	97/4F-04112-A4DBCA55; Mon, 20 Jul 2015 09:20:10 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-15.tower-206.messagelabs.com!1437384008!18912833!1
X-Originating-IP: [74.125.82.51]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9928 invoked from network); 20 Jul 2015 09:20:08 -0000
Received: from mail-wg0-f51.google.com (HELO mail-wg0-f51.google.com)
	(74.125.82.51)
	by server-15.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:20:08 -0000
Received: by wgkl9 with SMTP id l9so125411170wgk.1
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:20:08 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=9LgUhLMb5BGu+G9Ut2RNygXOVVoN+UF7KD4XwVOI3O0=;
	b=bVv0VcXa8cX9w7dThBTQ5BV/GmFpizutetHyHOJvpoQ6a8RevYEPf6W8INq/2JjZKk
	QwDNPGnofv0szGzh+minubrBXyXE6CRMsjG0dh9NMOoHGTjCe3E7ohrqqTAgIDKeB387
	TB+wAhZ5bEfyR5Aju+98cZrFg2p7kki9nlcv2zpzKTSm09KQJ7OoTTIOOt+1pE91ax6/
	Y6+yyDIIJv6nW5o0hcpZ29vWUYNHR19uuEqzPWEGbYn/+QEytuVMDM9oIbRJbDoQuY4N
	xcyWkNOqnxO3Jxn4QJQywS0fGCUjvFqrNScB4snj0UAGlEVs51ZlRwWcXyB34sB14axN
	2GAA==
X-Received: by 10.180.90.81 with SMTP id bu17mr19740965wib.35.1437384008554;
	Mon, 20 Jul 2015 02:20:08 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	l6sm10833795wib.18.2015.07.20.02.20.06
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:20:07 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:19:53 +0100
Message-Id: <1437383995-6240-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437383995-6240-1-git-send-email-paul.durrant@citrix.com>
References: <1437383995-6240-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/3] Apply new PDO revision numbering policy
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This patch also removes XENFILT_UNPLUG_INTERFACE from the set that can
be queried by a child driver. No child driver ever used it.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/revision.h |  50 +++++++++
 src/xenbus/pdo.c   | 294 +++++++++++++++++++++--------------------------------
 2 files changed, 167 insertions(+), 177 deletions(-)
 create mode 100644 include/revision.h

diff --git a/include/revision.h b/include/revision.h
new file mode 100644
index 0000000..9a91a33
--- /dev/null
+++ b/include/revision.h
@@ -0,0 +1,50 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _REVISION_H
+#define _REVISION_H
+
+// Key:
+// S  - XENBUS_SUSPEND_INTERFACE
+// SI - XENBUS_SHARED_INFO_INTERFACE
+// E  - XENBUS_EVTCHN_INTERFACE
+// D  - XENBUS_DEBUG_INTEFACE
+// ST - XENBUS_STORE_INTERFACE
+// R  - XENBUS_RANGE_SET_INTERFACE
+// C  - XENBUS_CACHE_INTERFACE
+// G  - XENBUS_GNTTAB_INTERFACE
+// EM - XENFILT_EMULATED_INTERFACE
+
+//                    REVISION   S  SI   E   D  ST   R   C   G  EM
+#define DEFINE_REVISION_TABLE                                      \
+    DEFINE_REVISION(0x08000008,  1,  2,  4,  1,  1,  1,  1,  1,  1)
+
+#endif  // _REVISION_H
diff --git a/src/xenbus/pdo.c b/src/xenbus/pdo.c
index 58150d0..f305bb7 100644
--- a/src/xenbus/pdo.c
+++ b/src/xenbus/pdo.c
@@ -36,7 +36,6 @@
 #include <ntstrsafe.h>
 
 #include <emulated_interface.h>
-#include <unplug_interface.h>
 
 #include "names.h"
 #include "fdo.h"
@@ -49,6 +48,7 @@
 #include "assert.h"
 #include "util.h"
 #include "version.h"
+#include "revision.h"
 
 #define PDO_TAG 'ODP'
 
@@ -69,9 +69,6 @@ struct _XENBUS_PDO {
     BOOLEAN                     Removable;
     BOOLEAN                     Ejectable;
 
-    PULONG                      Revision;
-    ULONG                       Count;
-
     BUS_INTERFACE_STANDARD      BusInterface;
 
     XENBUS_SUSPEND_INTERFACE    SuspendInterface;
@@ -355,155 +352,108 @@ PdoGetFdo(
     return __PdoGetFdo(Pdo);
 }
 
-static NTSTATUS
-PdoAddRevision(
-    IN  PXENBUS_PDO Pdo,
-    IN  ULONG       Revision
-    )
-{
-    PVOID           Buffer;
-    ULONG           Count;
-    NTSTATUS        status;
-
-    Count = Pdo->Count + 1;
-
-    Buffer = __PdoAllocate(sizeof (ULONG) * Count);
-
-    status = STATUS_NO_MEMORY;
-    if (Buffer == NULL)
-        goto fail1;
-
-    if (Pdo->Revision != NULL) {
-        RtlCopyMemory(Buffer,
-                      Pdo->Revision,
-                      sizeof (ULONG) * Pdo->Count);
-        __PdoFree(Pdo->Revision);
-    }
-
-    Pdo->Revision = Buffer;
-    Pdo->Revision[Pdo->Count] = Revision;
-
-    Pdo->Count++;
-    ASSERT3U(Pdo->Count, <=, 64);
-
-    return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
+typedef struct _XENBUS_PDO_REVISION {
+    ULONG   Number;
+    ULONG   SuspendInterfaceVersion;
+    ULONG   SharedInfoInterfaceVersion;
+    ULONG   EvtchnInterfaceVersion;
+    ULONG   DebugInterfaceVersion;
+    ULONG   StoreInterfaceVersion;
+    ULONG   RangeSetInterfaceVersion;
+    ULONG   CacheInterfaceVersion;
+    ULONG   GnttabInterfaceVersion;
+    ULONG   EmulatedInterfaceVersion;
+} XENBUS_PDO_REVISION, *PXENBUS_PDO_REVISION;
+
+#define DEFINE_REVISION(_N, _S, _SI, _E, _D, _ST, _R, _C, _G, _EM) \
+    { (_N), (_S), (_SI), (_E), (_D), (_ST), (_R), (_C), (_G), (_EM) }
+
+static XENBUS_PDO_REVISION PdoRevision[] = {
+    DEFINE_REVISION_TABLE
+};
 
-    return status;
-}
+#undef DEFINE_REVISION
 
-static NTSTATUS
-PdoSetRevisions(
+static VOID
+PdoDumpRevisions(
     IN  PXENBUS_PDO Pdo
     )
 {
-    ULONG           Suspend;
-    ULONG           Revision;
-    NTSTATUS        status;
-
-    Revision = MAJOR_VERSION << 24;
+    ULONG           Index;
 
-    // Enumerate all possible combinations of exported interface versions since v1
-    // and add a PDO revsion for each combination that's currently supported. Note that
-    // the exported interfaces include any interface queries we pass through.
-    // We must enumerate from v1 to ensure that revision numbers don't change
-    // even when a particular combination of interface versions becomes
-    // unsupported. (See README.md for API versioning policy).
-
-    for (Suspend = 1; Suspend <= XENBUS_SUSPEND_INTERFACE_VERSION_MAX; Suspend++) {
-        ULONG   SharedInfo;
-        
-        for (SharedInfo = 1; SharedInfo <= XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX; SharedInfo++) {
-            ULONG   Evtchn;
-            
-            for (Evtchn = 1; Evtchn <= XENBUS_EVTCHN_INTERFACE_VERSION_MAX; Evtchn++) {
-                ULONG   Debug;
-
-                for (Debug = 1; Debug <= XENBUS_DEBUG_INTERFACE_VERSION_MAX; Debug++) {
-                    ULONG   Store;
-
-                    for (Store = 1; Store <= XENBUS_STORE_INTERFACE_VERSION_MAX; Store++) {
-                        ULONG   RangeSet;
-
-                        for (RangeSet = 1; RangeSet <= XENBUS_RANGE_SET_INTERFACE_VERSION_MAX; RangeSet++) {
-                            ULONG   Cache;
-                            
-                            for (Cache = 1; Cache <= XENBUS_CACHE_INTERFACE_VERSION_MAX; Cache++) {
-                                ULONG   Gnttab;
-                            
-                                for (Gnttab = 1; Gnttab <= XENBUS_GNTTAB_INTERFACE_VERSION_MAX; Gnttab++) {
-                                    ULONG   Emulated;
-                                
-                                    for (Emulated = 1; Emulated <= XENFILT_EMULATED_INTERFACE_VERSION_MAX; Emulated++) {
-                                        ULONG   Unplug;
-
-                                        for (Unplug = 1; Unplug <= XENFILT_UNPLUG_INTERFACE_VERSION_MAX; Unplug++) {
-                                            Revision++;
-
-                                            if (Suspend >= XENBUS_SUSPEND_INTERFACE_VERSION_MIN &&
-                                                SharedInfo >= XENBUS_SHARED_INFO_INTERFACE_VERSION_MIN &&
-                                                Evtchn >= XENBUS_EVTCHN_INTERFACE_VERSION_MIN &&
-                                                Debug >= XENBUS_DEBUG_INTERFACE_VERSION_MIN &&
-                                                Store >= XENBUS_STORE_INTERFACE_VERSION_MIN &&
-                                                RangeSet >= XENBUS_RANGE_SET_INTERFACE_VERSION_MIN &&
-                                                Cache >= XENBUS_CACHE_INTERFACE_VERSION_MIN &&
-                                                Gnttab >= XENBUS_GNTTAB_INTERFACE_VERSION_MIN &&
-                                                Emulated >= XENFILT_EMULATED_INTERFACE_VERSION_MIN &&
-                                                Unplug >= XENFILT_UNPLUG_INTERFACE_VERSION_MIN) {
-                                                Info("%08X -> "
-                                                     "SUSPEND v%u "
-                                                     "SHARED_INFO v%u "
-                                                     "EVTCHN v%u "
-                                                     "DEBUG v%u "
-                                                     "STORE v%u "
-                                                     "RANGE_SET v%u "
-                                                     "CACHE v%u "
-                                                     "GNTTAB v%u "
-                                                     "EMULATED v%u "
-                                                     "UNPLUG v%u\n",
-                                                     Revision,
-                                                     Suspend,
-                                                     SharedInfo,
-                                                     Evtchn,
-                                                     Debug,
-                                                     Store,
-                                                     RangeSet,
-                                                     Cache,
-                                                     Gnttab,
-                                                     Emulated,
-                                                     Unplug);
-
-                                                status = PdoAddRevision(Pdo, Revision);
-                                                if (!NT_SUCCESS(status))
-                                                    goto fail1;
-                                            }   
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }   
-        }
-    }                             
-
-    ASSERT(Pdo->Count > 0);
-    return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
+    UNREFERENCED_PARAMETER(Pdo);
 
-    if (Pdo->Revision != NULL) {
-        __PdoFree(Pdo->Revision);
-        Pdo->Revision = NULL;
+    for (Index = 0; Index < ARRAYSIZE(PdoRevision); Index++) {
+        PXENBUS_PDO_REVISION Revision = &PdoRevision[Index];
+
+        ASSERT3U(Revision->SuspendInterfaceVersion, >=, XENBUS_SUSPEND_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->SuspendInterfaceVersion, <=, XENBUS_SUSPEND_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->SuspendInterfaceVersion == XENBUS_SUSPEND_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->SharedInfoInterfaceVersion, >=, XENBUS_SHARED_INFO_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->SharedInfoInterfaceVersion, <=, XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->SharedInfoInterfaceVersion == XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->EvtchnInterfaceVersion, >=, XENBUS_EVTCHN_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->EvtchnInterfaceVersion, <=, XENBUS_EVTCHN_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->EvtchnInterfaceVersion == XENBUS_EVTCHN_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->DebugInterfaceVersion, >=, XENBUS_DEBUG_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->DebugInterfaceVersion, <=, XENBUS_DEBUG_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->DebugInterfaceVersion == XENBUS_DEBUG_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->StoreInterfaceVersion, >=, XENBUS_STORE_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->StoreInterfaceVersion, <=, XENBUS_STORE_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->StoreInterfaceVersion == XENBUS_STORE_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->RangeSetInterfaceVersion, >=, XENBUS_RANGE_SET_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->RangeSetInterfaceVersion, <=, XENBUS_RANGE_SET_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->RangeSetInterfaceVersion == XENBUS_RANGE_SET_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->CacheInterfaceVersion, >=, XENBUS_CACHE_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->CacheInterfaceVersion, <=, XENBUS_CACHE_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->CacheInterfaceVersion == XENBUS_CACHE_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->GnttabInterfaceVersion, >=, XENBUS_GNTTAB_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->GnttabInterfaceVersion, <=, XENBUS_GNTTAB_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->GnttabInterfaceVersion == XENBUS_GNTTAB_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->EmulatedInterfaceVersion, >=, XENFILT_EMULATED_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->EmulatedInterfaceVersion, <=, XENFILT_EMULATED_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->EmulatedInterfaceVersion == XENFILT_EMULATED_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->Number >> 24, ==, MAJOR_VERSION);
+
+        Info("%08X -> "
+             "SUSPEND v%u "
+             "SHARED_INFO v%u "
+             "EVTCHN v%u "
+             "DEBUG v%u "
+             "STORE v%u "
+             "RANGE_SET v%u "
+             "CACHE v%u "
+             "GNTTAB v%u "
+             "EMULATED v%u\n",
+             Revision->Number,
+             Revision->SuspendInterfaceVersion,
+             Revision->SharedInfoInterfaceVersion,
+             Revision->EvtchnInterfaceVersion,
+             Revision->DebugInterfaceVersion,
+             Revision->StoreInterfaceVersion,
+             Revision->RangeSetInterfaceVersion,
+             Revision->CacheInterfaceVersion,
+             Revision->GnttabInterfaceVersion,
+             Revision->EmulatedInterfaceVersion);
     }
-
-    Pdo->Count = 0;
-
-    return status;
 }
 
 static FORCEINLINE PDEVICE_OBJECT
@@ -1078,7 +1028,6 @@ static struct _INTERFACE_ENTRY PdoInterfaceTable[] = {
     { &GUID_XENBUS_CACHE_INTERFACE, "CACHE_INTERFACE", PdoQueryCacheInterface },
     { &GUID_XENBUS_GNTTAB_INTERFACE, "GNTTAB_INTERFACE", PdoQueryGnttabInterface },
     { &GUID_XENFILT_EMULATED_INTERFACE, "EMULATED_INTERFACE", PdoDelegateIrp },
-    { &GUID_XENFILT_UNPLUG_INTERFACE, "UNPLUG_INTERFACE", PdoDelegateIrp },
     { NULL, NULL, NULL }
 };
 
@@ -1405,12 +1354,12 @@ PdoQueryId(
 
     case BusQueryHardwareIDs:
         Trace("BusQueryHardwareIDs\n");
-        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * Pdo->Count) * sizeof (WCHAR);
+        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * ARRAYSIZE(PdoRevision)) * sizeof (WCHAR);
         break;
 
     case BusQueryCompatibleIDs:
         Trace("BusQueryCompatibleIDs\n");
-        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * Pdo->Count) * sizeof (WCHAR);
+        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * ARRAYSIZE(PdoRevision)) * sizeof (WCHAR);
         break;
 
     default:
@@ -1440,17 +1389,19 @@ PdoQueryId(
         break;
 
     case BusQueryDeviceID: {
-        ULONG   Index;
+        ULONG                   Index;
+        PXENBUS_PDO_REVISION    Revision;
 
         Type = REG_SZ;
-        Index = Pdo->Count - 1;
+        Index = ARRAYSIZE(PdoRevision) - 1;
+        Revision = &PdoRevision[Index];
 
         status = RtlStringCbPrintfW(Buffer,
                                     Id.MaximumLength,
                                     L"XENBUS\\VEN_%hs&DEV_%hs&REV_%08X",
                                     __PdoGetVendorName(Pdo),
                                     __PdoGetName(Pdo),
-                                    Pdo->Revision[Index]);
+                                    Revision->Number);
         ASSERT(NT_SUCCESS(status));
 
         Buffer += wcslen(Buffer);
@@ -1465,13 +1416,15 @@ PdoQueryId(
         Type = REG_MULTI_SZ;
         Length = Id.MaximumLength;
 
-        for (Index = 0; Index < Pdo->Count; Index++) {
-            status = RtlStringCbPrintfW(Buffer,
-                                        Length,
-                                        L"XENBUS\\VEN_%hs&DEV_%hs&REV_%08X",
-                                        __PdoGetVendorName(Pdo),
-                                        __PdoGetName(Pdo),
-                                        Pdo->Revision[Index]);
+        for (Index = 0; Index < ARRAYSIZE(PdoRevision); Index++) {
+            PXENBUS_PDO_REVISION Revision = &PdoRevision[Index];
+
+           status = RtlStringCbPrintfW(Buffer,
+                                       Length,
+                                       L"XENBUS\\VEN_%hs&DEV_%hs&REV_%08X",
+                                       __PdoGetVendorName(Pdo),
+                                       __PdoGetName(Pdo),
+                                       Revision->Number);
             ASSERT(NT_SUCCESS(status));
 
             Buffer += wcslen(Buffer);
@@ -2126,13 +2079,9 @@ PdoCreate(
     __PdoSetRemovable(Pdo);
     __PdoSetEjectable(Pdo);
 
-    status = PdoSetRevisions(Pdo);
-    if (!NT_SUCCESS(status))
-        goto fail5;
-
     status = BusInitialize(Pdo, &Pdo->BusInterface);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail5;
 
     status = SuspendGetInterface(FdoGetSuspendContext(Fdo),
                                  XENBUS_SUSPEND_INTERFACE_VERSION_MAX,
@@ -2141,10 +2090,11 @@ PdoCreate(
     ASSERT(NT_SUCCESS(status));
     ASSERT(Pdo->SuspendInterface.Interface.Context != NULL);
 
-    Info("%p (%s: Highest Revision = %08X)\n",
+    Info("%p (%s)\n",
          PhysicalDeviceObject,
-         __PdoGetName(Pdo),
-         Pdo->Revision[Pdo->Count - 1]);
+         __PdoGetName(Pdo));
+
+    PdoDumpRevisions(Pdo);
 
     Dx->Pdo = Pdo;
     PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
@@ -2153,16 +2103,10 @@ PdoCreate(
 
     return STATUS_SUCCESS;
 
-fail6:
-    Error("fail6\n");
-
-    __PdoFree(Pdo->Revision);
-    Pdo->Revision = NULL;
-    Pdo->Count = 0;
-
 fail5:
     Error("fail5\n");
 
+    Pdo->Ejectable = FALSE;
     Pdo->Removable = FALSE;
 
     ThreadAlert(Pdo->DevicePowerThread);
@@ -2225,10 +2169,6 @@ PdoDestroy(
 
     BusTeardown(&Pdo->BusInterface);
 
-    __PdoFree(Pdo->Revision);
-    Pdo->Revision = NULL;
-    Pdo->Count = 0;
-
     Pdo->Ejectable = FALSE;
     Pdo->Removable = FALSE;
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:20:14 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:20:14 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7F8-0001w9-4t; Mon, 20 Jul 2015 09:20:14 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7F6-0001vW-4c
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:20:12 +0000
Received: from [85.158.139.211] by server-2.bemta-5.messagelabs.com id
	65/DC-07711-B4DBCA55; Mon, 20 Jul 2015 09:20:11 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1437384010!22265588!1
X-Originating-IP: [74.125.82.45]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22707 invoked from network); 20 Jul 2015 09:20:10 -0000
Received: from mail-wg0-f45.google.com (HELO mail-wg0-f45.google.com)
	(74.125.82.45)
	by server-6.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:20:10 -0000
Received: by wgav7 with SMTP id v7so60060863wga.2
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:20:10 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=qe2d7/QeG6HxebgTa7ZQHUeAy5gotADfCbdam8csC+g=;
	b=eRq5dlQHP2VsAuWegGOD/kDCcdZRXd7EUfbfhpH5bS0nXZQTj0BdYqkR7eHNPdf99g
	4+Ht1JjoQfD1jd1mQdJBZOph1GY2G+44UAP9zXE2/SoMSNAdOmzhJbUyrGY5G6FN4i3q
	9P0i0nyODSdxHJPKrL+uzYgoRpilNtlzsKPM3MA8mDI1f9ae47FCIeBaWPBSSjegeNC6
	SZfAgbDDdPWIUX3R8yvrB/uksW4xWX3Bil61Pk6HiKxbqVUlT4B1psTKOaURLoOCttrP
	WU9Zl3xRsypas+DGn2gSF16CgnNVY4RMPpcGtZYcU2zJko7cFJ48gBAP0pvdBcTzUUnv
	nnIw==
X-Received: by 10.194.235.169 with SMTP id un9mr53431160wjc.136.1437384010084; 
	Mon, 20 Jul 2015 02:20:10 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	l6sm10833795wib.18.2015.07.20.02.20.08
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:20:09 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:19:54 +0100
Message-Id: <1437383995-6240-3-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437383995-6240-1-git-send-email-paul.durrant@citrix.com>
References: <1437383995-6240-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/3] Remove interface subscriber checks from
	the co-installer...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...and replace with a scan of child driver software keys to check that
the revision number in the MatchingDeviceId value is supported.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 616 ++++++++++++++++++----------------------------------
 1 file changed, 216 insertions(+), 400 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index c06bc3f..0b8c306 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -40,18 +40,8 @@
 #include <malloc.h>
 #include <assert.h>
 
-#include <debug_interface.h>
-#include <suspend_interface.h>
-#include <shared_info_interface.h>
-#include <evtchn_interface.h>
-#include <store_interface.h>
-#include <range_set_interface.h>
-#include <cache_interface.h>
-#include <gnttab_interface.h>
-#include <unplug_interface.h>
-#include <emulated_interface.h>
-
 #include <version.h>
+#include <revision.h>
 
 __user_code;
 
@@ -202,7 +192,7 @@ __FunctionName(
 
 static BOOLEAN
 OpenEnumKey(
-    OUT PHKEY   Key
+    OUT PHKEY   EnumKey
     )
 {
     HRESULT     Error;
@@ -211,7 +201,7 @@ OpenEnumKey(
                          ENUM_KEY,
                          0,
                          KEY_READ,
-                         Key);
+                         EnumKey);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
         goto fail1;
@@ -233,8 +223,9 @@ fail1:
 }
 
 static BOOLEAN
-OpenPciKey(
-    OUT PHKEY   Key
+OpenBusKey(
+    IN  PTCHAR  BusKeyName,
+    OUT PHKEY   BusKey
     )
 {
     BOOLEAN     Success;
@@ -246,10 +237,10 @@ OpenPciKey(
         goto fail1;
 
     Error = RegOpenKeyEx(EnumKey,
-                         "PCI",
+                         BusKeyName,
                          0,
                          KEY_READ,
-                         Key);
+                         BusKey);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
         goto fail2;
@@ -280,12 +271,13 @@ fail1:
 
 static BOOLEAN
 GetDeviceKeyName(
-    IN  PTCHAR  Prefix,
-    OUT PTCHAR  *Name
+    IN  PTCHAR  BusKeyName,
+    IN  PTCHAR  DeviceKeyPrefix,
+    OUT PTCHAR  *DeviceKeyName
     )
 {
     BOOLEAN     Success;
-    HKEY        PciKey;
+    HKEY        BusKey;
     HRESULT     Error;
     DWORD       SubKeys;
     DWORD       MaxSubKeyLength;
@@ -293,11 +285,11 @@ GetDeviceKeyName(
     PTCHAR      SubKeyName;
     DWORD       Index;
 
-    Success = OpenPciKey(&PciKey);
+    Success = OpenBusKey(BusKeyName, &BusKey);
     if (!Success)
         goto fail1;
 
-    Error = RegQueryInfoKey(PciKey,
+    Error = RegQueryInfoKey(BusKey,
                             NULL,
                             NULL,
                             NULL,
@@ -324,7 +316,7 @@ GetDeviceKeyName(
         SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
         memset(SubKeyName, 0, SubKeyLength);
 
-        Error = RegEnumKeyEx(PciKey,
+        Error = RegEnumKeyEx(BusKey,
                              Index,
                              (LPTSTR)SubKeyName,
                              &SubKeyLength,
@@ -337,7 +329,7 @@ GetDeviceKeyName(
             goto fail4;
         }
 
-        if (strncmp(SubKeyName, Prefix, strlen(Prefix)) == 0)
+        if (strncmp(SubKeyName, DeviceKeyPrefix, strlen(DeviceKeyPrefix)) == 0)
             goto found;
     }
 
@@ -345,11 +337,11 @@ GetDeviceKeyName(
     SubKeyName = NULL;
 
 found:
-    RegCloseKey(PciKey);
+    RegCloseKey(BusKey);
 
     Log("%s", (SubKeyName != NULL) ? SubKeyName : "none found");
 
-    *Name = SubKeyName;
+    *DeviceKeyName = SubKeyName;
     return TRUE;
 
 fail4:
@@ -363,7 +355,7 @@ fail3:
 fail2:
     Log("fail2");
 
-    RegCloseKey(PciKey);
+    RegCloseKey(BusKey);
 
 fail1:
     Error = GetLastError();
@@ -386,36 +378,37 @@ fail1:
 
 static BOOLEAN
 OpenDeviceKey(
-    IN  PTCHAR  Name,           
-    OUT PHKEY   Key
+    IN  PTCHAR  BusKeyName,
+    IN  PTCHAR  DeviceKeyName,
+    OUT PHKEY   DeviceKey
     )
 {
     BOOLEAN     Success;
-    HKEY        PciKey;
+    HKEY        BusKey;
     HRESULT     Error;
 
-    Success = OpenPciKey(&PciKey);
+    Success = OpenBusKey(BusKeyName, &BusKey);
     if (!Success)
         goto fail1;
 
-    Error = RegOpenKeyEx(PciKey,
-                         Name,
+    Error = RegOpenKeyEx(BusKey,
+                         DeviceKeyName,
                          0,
                          KEY_READ,
-                         Key);
+                         DeviceKey);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
         goto fail2;
     }
 
-    RegCloseKey(PciKey);
+    RegCloseKey(BusKey);
 
     return TRUE;
 
 fail2:
     Log("fail2");
 
-    RegCloseKey(PciKey);
+    RegCloseKey(BusKey);
 
 fail1:
     Error = GetLastError();
@@ -431,7 +424,6 @@ fail1:
     return FALSE;
 }
 
-
 static BOOLEAN
 GetDriverKeyName(
     IN  HKEY    DeviceKey,
@@ -585,7 +577,7 @@ fail1:
 
 static BOOLEAN
 OpenClassKey(
-    OUT PHKEY   Key
+    OUT PHKEY   ClassKey
     )
 {
     HRESULT     Error;
@@ -594,7 +586,7 @@ OpenClassKey(
                          CLASS_KEY,
                          0,
                          KEY_READ,
-                         Key);
+                         ClassKey);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
         goto fail1;
@@ -617,8 +609,8 @@ fail1:
 
 static BOOLEAN
 OpenDriverKey(
-    IN  PTCHAR  Name,           
-    OUT PHKEY   Key
+    IN  PTCHAR  DriverKeyName,
+    OUT PHKEY   DriverKey
     )
 {
     BOOLEAN     Success;
@@ -630,10 +622,10 @@ OpenDriverKey(
         goto fail1;
 
     Error = RegOpenKeyEx(ClassKey,
-                         Name,
+                         DriverKeyName,
                          0,
                          KEY_READ,
-                         Key);
+                         DriverKey);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
         goto fail2;
@@ -909,7 +901,8 @@ SetActiveDeviceInstanceID(
 
         // We are binding to a legacy platform device so only make it
         // active if there is no XenServer vendor device
-        Success = GetDeviceKeyName(XENSERVER_VENDOR_DEVICE_NAME,
+        Success = GetDeviceKeyName("PCI",
+                                   XENSERVER_VENDOR_DEVICE_NAME,
                                    &DeviceKeyName);
         if (!Success)
             goto fail1;
@@ -1135,8 +1128,11 @@ MatchExistingDriver(
     DWORD   ProductNameLength;
     DWORD   Type;
 
+    Log("====>");
+
     // Look for a legacy platform device
-    Success = GetDeviceKeyName(PLATFORM_DEVICE_0001_NAME,
+    Success = GetDeviceKeyName("PCI",
+                               PLATFORM_DEVICE_0001_NAME,
                                &DeviceKeyName);
     if (!Success)
         goto fail1;
@@ -1144,7 +1140,8 @@ MatchExistingDriver(
     if (DeviceKeyName != NULL)
         goto found;
 
-    Success = GetDeviceKeyName(PLATFORM_DEVICE_0002_NAME,
+    Success = GetDeviceKeyName("PCI",
+                               PLATFORM_DEVICE_0002_NAME,
                                &DeviceKeyName);
     if (!Success)
         goto fail2;
@@ -1156,7 +1153,7 @@ MatchExistingDriver(
     goto done;
 
 found:
-    Success = OpenDeviceKey(DeviceKeyName, &DeviceKey);
+    Success = OpenDeviceKey("PCI", DeviceKeyName, &DeviceKey);
     if (!Success)
         goto fail3;
 
@@ -1243,6 +1240,8 @@ done:
     if (DeviceKeyName != NULL)
         free(DeviceKeyName);
 
+    Log("<====");
+
     return TRUE;
 
 fail11:
@@ -1299,89 +1298,89 @@ fail1:
     return FALSE;
 }
 
-struct _INTERFACE_ENTRY {
-    const TCHAR *ProviderName;
-    const TCHAR *InterfaceName;
-    DWORD       VersionMin;
-    DWORD       VersionMax;       
-};
+#define DEFINE_REVISION(_N, _S, _SI, _E, _D, _ST, _R, _C, _G, _EM) \
+    (_N)
 
-#define DEFINE_INTERFACE_ENTRY(_ProviderName, _InterfaceName)           \
-    { #_ProviderName,                                                   \
-      #_InterfaceName,                                                  \
-      _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MIN,   \
-      _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MAX    \
-    }
-
-static struct _INTERFACE_ENTRY InterfaceTable[] = {
-    DEFINE_INTERFACE_ENTRY(XENBUS, DEBUG),
-    DEFINE_INTERFACE_ENTRY(XENBUS, SUSPEND),
-    DEFINE_INTERFACE_ENTRY(XENBUS, SHARED_INFO),
-    DEFINE_INTERFACE_ENTRY(XENBUS, EVTCHN),
-    DEFINE_INTERFACE_ENTRY(XENBUS, STORE),
-    DEFINE_INTERFACE_ENTRY(XENBUS, RANGE_SET),
-    DEFINE_INTERFACE_ENTRY(XENBUS, CACHE),
-    DEFINE_INTERFACE_ENTRY(XENBUS, GNTTAB),
-    DEFINE_INTERFACE_ENTRY(XENFILT, EMULATED),
-    DEFINE_INTERFACE_ENTRY(XENFILT, UNPLUG),
-    { NULL, NULL, 0, 0 }
+static DWORD    DeviceRevision[] = {
+    DEFINE_REVISION_TABLE
 };
 
+#undef DEFINE_REVISION
+
 static BOOLEAN
-SupportInterfaceVersion(
-    IN  PTCHAR              ProviderName,
-    IN  PTCHAR              InterfaceName,
-    IN  DWORD               Version
+SupportDeviceID(
+    IN  PTCHAR      DeviceID
     )
 {
-    BOOLEAN                 Supported;
-    struct _INTERFACE_ENTRY *Entry;
-
-    Supported = FALSE;
-    SetLastError(ERROR_REVISION_MISMATCH);
-
-    for (Entry = InterfaceTable; Entry->ProviderName != NULL; Entry++) {
-        if (_stricmp(ProviderName, Entry->ProviderName) == 0 &&
-            _stricmp(InterfaceName, Entry->InterfaceName) == 0 &&
-            Version >= Entry->VersionMin &&
-            Version <= Entry->VersionMax) {
-            Supported = TRUE;
-            break;
-        }
+    unsigned int    Revision;
+    int             Count;
+    DWORD           Index;
+    HRESULT         Error;
+
+    DeviceID = strrchr(DeviceID, '&');
+    assert(DeviceID != NULL);
+    DeviceID++;
+
+    Count = sscanf_s(DeviceID,
+                     "REV_%8x",
+                     &Revision);
+    if (Count != 1) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail1;
+    }
+
+    for (Index = 0; Index < ARRAYSIZE(DeviceRevision); Index++) {
+        if (Revision == DeviceRevision[Index])
+            goto found;
     }
 
-    Log("%s_%s_INTERFACE VERSION %d %s",
-        ProviderName,
-        InterfaceName,
-        Version,
-        (Supported) ? "SUPPORTED" : "NOT SUPPORTED");
+    SetLastError(ERROR_FILE_NOT_FOUND);
+    goto fail2;
+
+found:
+    Log("%x", Revision);
+
+    return TRUE;
+
+fail2:
+    Log("fail2");
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
 
-    return Supported;
+    return FALSE;
 }
 
 static BOOLEAN
-SupportSubscriberInterfaces(
-    IN  PTCHAR  ProviderName,
-    IN  HKEY    SubscriberKey
+GetMatchingDeviceID(
+    IN  HKEY    DriverKey,
+    OUT PTCHAR  *MatchingDeviceID
     )
 {
-    DWORD       Values;
-    DWORD       MaxInterfaceNameLength;
-    DWORD       InterfaceNameLength;
-    PTCHAR      InterfaceName;
-    DWORD       Index;
     HRESULT     Error;
+    DWORD       MaxValueLength;
+    DWORD       MatchingDeviceIDLength;
+    DWORD       Type;
+    DWORD       Index;
 
-    Error = RegQueryInfoKey(SubscriberKey,
+    Error = RegQueryInfoKey(DriverKey,
+                            NULL,
                             NULL,
                             NULL,
                             NULL,
                             NULL,
                             NULL,
                             NULL,
-                            &Values,
-                            &MaxInterfaceNameLength,
                             NULL,
+                            &MaxValueLength,
                             NULL,
                             NULL);
     if (Error != ERROR_SUCCESS) {
@@ -1389,59 +1388,34 @@ SupportSubscriberInterfaces(
         goto fail1;
     }
 
-    if (Values == 0)
-        goto done;
-
-    MaxInterfaceNameLength += sizeof (TCHAR);
+    MatchingDeviceIDLength = MaxValueLength + sizeof (TCHAR);
 
-    InterfaceNameLength = MaxInterfaceNameLength;
-
-    InterfaceName = malloc(InterfaceNameLength);
-    if (InterfaceName == NULL)
+    *MatchingDeviceID = calloc(1, MatchingDeviceIDLength);
+    if (*MatchingDeviceID == NULL)
         goto fail2;
 
-    for (Index = 0; Index < Values; Index++) {
-        DWORD   InterfaceNameLength;
-        DWORD   Type;
-        DWORD   Value;
-        DWORD   ValueLength;
-
-        InterfaceNameLength = MaxInterfaceNameLength;
-        memset(InterfaceName, 0, InterfaceNameLength);
-
-        ValueLength = sizeof (DWORD);
-
-        Error = RegEnumValue(SubscriberKey,
-                             Index,
-                             (LPTSTR)InterfaceName,
-                             &InterfaceNameLength,
-                             NULL,
-                             &Type,
-                             (LPBYTE)&Value,
-                             &ValueLength);
-        if (Error != ERROR_SUCCESS) {
-            SetLastError(Error);
-            goto fail3;
-        }
-
-        if (Type != REG_DWORD) {
-            SetLastError(ERROR_BAD_FORMAT);
-            goto fail4;
-        }
+    Error = RegQueryValueEx(DriverKey,
+                            "MatchingDeviceId",
+                            NULL,
+                            &Type,
+                            (LPBYTE)*MatchingDeviceID,
+                            &MatchingDeviceIDLength);
+    if (Error != ERROR_SUCCESS) {
+        SetLastError(Error);
+        goto fail3;
+    }
 
-        if (!SupportInterfaceVersion(ProviderName,
-                                     InterfaceName,
-                                     Value))
-            goto fail5;
+    if (Type != REG_SZ) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail4;
     }
 
-    free(InterfaceName);
+    for (Index = 0; Index < strlen(*MatchingDeviceID); Index++)
+        (*MatchingDeviceID)[Index] = (CHAR)toupper((*MatchingDeviceID)[Index]);
 
-done:
-    return TRUE;
+    Log("%s", *MatchingDeviceID);
 
-fail5:
-    Log("fail5");
+    return TRUE;
 
 fail4:
     Log("fail4");
@@ -1449,8 +1423,8 @@ fail4:
 fail3:
     Log("fail3");
 
-    free(InterfaceName);
-    
+    free(*MatchingDeviceID);
+
 fail2:
     Log("fail2");
 
@@ -1469,51 +1443,40 @@ fail1:
 }
 
 static BOOLEAN
-SupportRegisteredSubscribers(
-    IN  PTCHAR  ProviderName
+SupportChildDrivers(
+    VOID
     )
 {
-    TCHAR       InterfacesKeyName[MAX_PATH];
-    HKEY        InterfacesKey;
+    BOOLEAN     Success;
+    HKEY        XenbusKey;
+    HRESULT     Error;
     DWORD       SubKeys;
-    DWORD       MaxSubKeyNameLength;
-    DWORD       Index;
-    DWORD       SubKeyNameLength;
+    DWORD       MaxSubKeyLength;
+    DWORD       SubKeyLength;
     PTCHAR      SubKeyName;
-    HKEY        SubKey;
-    HRESULT     Result;
-    HRESULT     Error;
+    HKEY        DeviceKey;
+    PTCHAR      DriverKeyName;
+    HKEY        DriverKey;
+    PTCHAR      MatchingDeviceID;
+    DWORD       Index;
 
-    Result = StringCbPrintf(InterfacesKeyName,
-                            MAX_PATH,
-                            "%s\\%s\\Interfaces",
-                            SERVICES_KEY,
-                            ProviderName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail1;
-    }
+    Log("====>");
 
-    Error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
-                           InterfacesKeyName,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &InterfacesKey,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
+    Success = OpenBusKey("XENBUS", &XenbusKey);
+    if (!Success) {
+        // If there is no key then this must be a fresh installation
+        if (GetLastError() == ERROR_FILE_NOT_FOUND)
+            goto done;
+
+        goto fail1;
     }
 
-    Error = RegQueryInfoKey(InterfacesKey,
+    Error = RegQueryInfoKey(XenbusKey,
                             NULL,
                             NULL,
                             NULL,
                             &SubKeys,
-                            &MaxSubKeyNameLength,
+                            &MaxSubKeyLength,
                             NULL,
                             NULL,
                             NULL,
@@ -1522,76 +1485,110 @@ SupportRegisteredSubscribers(
                             NULL);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
-        goto fail3;
+        goto fail2;
     }
 
-    SubKeyNameLength = MaxSubKeyNameLength + sizeof (TCHAR);
+    SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
 
-    SubKeyName = malloc(SubKeyNameLength);
+    SubKeyName = malloc(SubKeyLength);
     if (SubKeyName == NULL)
-        goto fail4;
+        goto fail3;
 
     for (Index = 0; Index < SubKeys; Index++) {
-        SubKeyNameLength = MaxSubKeyNameLength + sizeof (TCHAR);
-        memset(SubKeyName, 0, SubKeyNameLength);
+        SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
+        memset(SubKeyName, 0, SubKeyLength);
 
-        Error = RegEnumKeyEx(InterfacesKey,
+        Error = RegEnumKeyEx(XenbusKey,
                              Index,
                              (LPTSTR)SubKeyName,
-                             &SubKeyNameLength,
+                             &SubKeyLength,
                              NULL,
                              NULL,
                              NULL,
                              NULL);
         if (Error != ERROR_SUCCESS) {
             SetLastError(Error);
-            goto fail5;
+            goto fail4;
         }
 
-        Error = RegOpenKeyEx(InterfacesKey,
-                             SubKeyName,
-                             0,
-                             KEY_READ,
-                             &SubKey);
-        if (Error != ERROR_SUCCESS)
+        Success = OpenDeviceKey("XENBUS", SubKeyName, &DeviceKey);
+        if (!Success)
+            goto fail5;
+
+        Success = GetDriverKeyName(DeviceKey, &DriverKeyName);
+        if (!Success)
             goto fail6;
 
-        if (!SupportSubscriberInterfaces(ProviderName, SubKey))
+        if (DriverKeyName == NULL)
+            goto loop;
+
+        Success = OpenDriverKey(DriverKeyName, &DriverKey);
+        if (!Success)
             goto fail7;
 
-        RegCloseKey(SubKey);
+        Success = GetMatchingDeviceID(DriverKey, &MatchingDeviceID);
+        if (!Success)
+            goto fail8;
+
+        Success = SupportDeviceID(MatchingDeviceID);
+        if (!Success)
+            goto fail9;
+
+        free(MatchingDeviceID);
+
+        RegCloseKey(DriverKey);
+
+        free(DriverKeyName);
+
+    loop:
+        RegCloseKey(DeviceKey);
     }
 
     free(SubKeyName);
 
-    RegCloseKey(InterfacesKey);
+    RegCloseKey(XenbusKey);
+
+done:
+    Log("<====");
 
     return TRUE;
 
+fail9:
+    Log("fail9");
+
+    free(MatchingDeviceID);
+
+fail8:
+    Log("fail8");
+
+    RegCloseKey(DriverKey);
+
 fail7:
     Log("fail7");
 
-    RegCloseKey(SubKey);
+    free(DriverKeyName);
 
 fail6:
     Log("fail6");
 
+    RegCloseKey(DeviceKey);
+
 fail5:
     Log("fail5");
 
-    free(SubKeyName);
-
 fail4:
     Log("fail4");
-    
+
+    free(SubKeyName);
+
 fail3:
     Log("fail3");
 
-    RegCloseKey(InterfacesKey);
-
 fail2:
     Log("fail2");
-    
+
+    RegCloseKey(XenbusKey);
+
 fail1:
     Error = GetLastError();
 
@@ -1878,7 +1875,7 @@ SetFriendlyName(
     )
 {
     PTCHAR                  Description;
-    DWORD                   Value;
+    unsigned int            Value;
     TCHAR                   FriendlyName[MAX_PATH];
     DWORD                   FriendlyNameLength;
     HRESULT                 Result;
@@ -1945,176 +1942,6 @@ fail1:
     return FALSE;
 }
 
-static HKEY
-OpenInterfacesKey(
-    IN  PTCHAR  ProviderName
-    )
-{
-    HRESULT     Result;
-    TCHAR       KeyName[MAX_PATH];
-    HKEY        Key;
-    HRESULT     Error;
-
-    Result = StringCbPrintf(KeyName,
-                            MAX_PATH,
-                            "%s\\%s\\Interfaces",
-                            SERVICES_KEY,
-                            ProviderName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail1;
-    }
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         KeyName,
-                         0,
-                         KEY_ALL_ACCESS,
-                         &Key);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    return Key;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static BOOLEAN
-SubscribeInterface(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  SubscriberName,
-    IN  PTCHAR  InterfaceName,
-    IN  DWORD   InterfaceVersion
-    )
-{
-    HKEY        Key;
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL)
-        goto fail1;
-
-    Error = RegCreateKeyEx(InterfacesKey,
-                           SubscriberName,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &Key,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    Error = RegSetValueEx(Key,
-                          InterfaceName,
-                          0,
-                          REG_DWORD,
-                          (const BYTE *)&InterfaceVersion,
-                          sizeof(DWORD));
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    Log("%s: %s_%s_INTERFACE_VERSION %u",
-        SubscriberName,
-        ProviderName,
-        InterfaceName,
-        InterfaceVersion);
-
-    RegCloseKey(Key);
-    RegCloseKey(InterfacesKey);
-
-    return TRUE;
-
-fail3:
-    RegCloseKey(Key);
-
-fail2:
-    RegCloseKey(InterfacesKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-#define SUBSCRIBE_INTERFACE(_ProviderName, _SubscriberName, _InterfaceName)                        \
-    do {                                                                                           \
-        (VOID) SubscribeInterface(#_ProviderName,                                                  \
-                                  #_SubscriberName,                                                \
-                                  #_InterfaceName,                                                 \
-                                  _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MAX); \
-    } while (FALSE);
-
-static BOOLEAN
-UnsubscribeInterfaces(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  SubscriberName
-    )
-{
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    Log("%s: %s", SubscriberName, ProviderName);
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL) {
-        goto fail1;
-    }
-
-    Error = RegDeleteTree(InterfacesKey,
-                          SubscriberName);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    RegCloseKey(InterfacesKey);
-
-    return TRUE;
-
-fail2:
-    RegCloseKey(InterfacesKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
 static HRESULT
 DifInstallPreProcess(
     IN  HDEVINFO                    DeviceInfoSet,
@@ -2135,17 +1962,13 @@ DifInstallPreProcess(
     if (!Success)
         goto fail1;
 
-    Success = SupportRegisteredSubscribers("XENFILT");
+    Success = SupportChildDrivers();
     if (!Success)
         goto fail2;
 
-    Success = SupportRegisteredSubscribers("XENBUS");
-    if (!Success)
-        goto fail3;
-
     Success = GetActiveDeviceInstanceID(&DeviceID, &InstanceID);
     if (!Success)
-        goto fail4;
+        goto fail3;
 
     if (DeviceID == NULL) {
         assert(InstanceID == NULL);
@@ -2153,11 +1976,11 @@ DifInstallPreProcess(
         Success = GetDeviceInstanceID(DeviceInfoSet, DeviceInfoData,
                                       &DeviceID, &InstanceID);
         if (!Success)
-            goto fail5;
+            goto fail4;
 
         Success = SetActiveDeviceInstanceID(DeviceID, InstanceID);
         if (!Success)
-            goto fail6;
+            goto fail5;
     }
 
     free(DeviceID);
@@ -2167,15 +1990,12 @@ DifInstallPreProcess(
     
     return NO_ERROR;
 
-fail6:
-    Log("fail6");
+fail5:
+    Log("fail5");
 
     free(DeviceID);
     free(InstanceID);
 
-fail5:
-    Log("fail5");
-
 fail4:
     Log("fail4");
 
@@ -2245,8 +2065,6 @@ DifInstallPostProcess(
     }
 
     if (Active) {
-        SUBSCRIBE_INTERFACE(XENFILT, XENBUS, UNPLUG);
-
         (VOID) InstallFilter(&GUID_DEVCLASS_SYSTEM, "XENFILT");
         (VOID) InstallFilter(&GUID_DEVCLASS_HDC, "XENFILT");
         (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData);
@@ -2384,8 +2202,6 @@ DifRemovePreProcess(
 
         (VOID) RemoveFilter(&GUID_DEVCLASS_HDC, "XENFILT");
         (VOID) RemoveFilter(&GUID_DEVCLASS_SYSTEM, "XENFILT");
-
-        UnsubscribeInterfaces("XENFILT", "XENBUS");
     }
 
     free(DeviceID);
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:20:14 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:20:14 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7F8-0001w9-4t; Mon, 20 Jul 2015 09:20:14 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7F6-0001vW-4c
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:20:12 +0000
Received: from [85.158.139.211] by server-2.bemta-5.messagelabs.com id
	65/DC-07711-B4DBCA55; Mon, 20 Jul 2015 09:20:11 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1437384010!22265588!1
X-Originating-IP: [74.125.82.45]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22707 invoked from network); 20 Jul 2015 09:20:10 -0000
Received: from mail-wg0-f45.google.com (HELO mail-wg0-f45.google.com)
	(74.125.82.45)
	by server-6.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:20:10 -0000
Received: by wgav7 with SMTP id v7so60060863wga.2
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:20:10 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=qe2d7/QeG6HxebgTa7ZQHUeAy5gotADfCbdam8csC+g=;
	b=eRq5dlQHP2VsAuWegGOD/kDCcdZRXd7EUfbfhpH5bS0nXZQTj0BdYqkR7eHNPdf99g
	4+Ht1JjoQfD1jd1mQdJBZOph1GY2G+44UAP9zXE2/SoMSNAdOmzhJbUyrGY5G6FN4i3q
	9P0i0nyODSdxHJPKrL+uzYgoRpilNtlzsKPM3MA8mDI1f9ae47FCIeBaWPBSSjegeNC6
	SZfAgbDDdPWIUX3R8yvrB/uksW4xWX3Bil61Pk6HiKxbqVUlT4B1psTKOaURLoOCttrP
	WU9Zl3xRsypas+DGn2gSF16CgnNVY4RMPpcGtZYcU2zJko7cFJ48gBAP0pvdBcTzUUnv
	nnIw==
X-Received: by 10.194.235.169 with SMTP id un9mr53431160wjc.136.1437384010084; 
	Mon, 20 Jul 2015 02:20:10 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	l6sm10833795wib.18.2015.07.20.02.20.08
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:20:09 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:19:54 +0100
Message-Id: <1437383995-6240-3-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437383995-6240-1-git-send-email-paul.durrant@citrix.com>
References: <1437383995-6240-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/3] Remove interface subscriber checks from
	the co-installer...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...and replace with a scan of child driver software keys to check that
the revision number in the MatchingDeviceId value is supported.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 616 ++++++++++++++++++----------------------------------
 1 file changed, 216 insertions(+), 400 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index c06bc3f..0b8c306 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -40,18 +40,8 @@
 #include <malloc.h>
 #include <assert.h>
 
-#include <debug_interface.h>
-#include <suspend_interface.h>
-#include <shared_info_interface.h>
-#include <evtchn_interface.h>
-#include <store_interface.h>
-#include <range_set_interface.h>
-#include <cache_interface.h>
-#include <gnttab_interface.h>
-#include <unplug_interface.h>
-#include <emulated_interface.h>
-
 #include <version.h>
+#include <revision.h>
 
 __user_code;
 
@@ -202,7 +192,7 @@ __FunctionName(
 
 static BOOLEAN
 OpenEnumKey(
-    OUT PHKEY   Key
+    OUT PHKEY   EnumKey
     )
 {
     HRESULT     Error;
@@ -211,7 +201,7 @@ OpenEnumKey(
                          ENUM_KEY,
                          0,
                          KEY_READ,
-                         Key);
+                         EnumKey);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
         goto fail1;
@@ -233,8 +223,9 @@ fail1:
 }
 
 static BOOLEAN
-OpenPciKey(
-    OUT PHKEY   Key
+OpenBusKey(
+    IN  PTCHAR  BusKeyName,
+    OUT PHKEY   BusKey
     )
 {
     BOOLEAN     Success;
@@ -246,10 +237,10 @@ OpenPciKey(
         goto fail1;
 
     Error = RegOpenKeyEx(EnumKey,
-                         "PCI",
+                         BusKeyName,
                          0,
                          KEY_READ,
-                         Key);
+                         BusKey);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
         goto fail2;
@@ -280,12 +271,13 @@ fail1:
 
 static BOOLEAN
 GetDeviceKeyName(
-    IN  PTCHAR  Prefix,
-    OUT PTCHAR  *Name
+    IN  PTCHAR  BusKeyName,
+    IN  PTCHAR  DeviceKeyPrefix,
+    OUT PTCHAR  *DeviceKeyName
     )
 {
     BOOLEAN     Success;
-    HKEY        PciKey;
+    HKEY        BusKey;
     HRESULT     Error;
     DWORD       SubKeys;
     DWORD       MaxSubKeyLength;
@@ -293,11 +285,11 @@ GetDeviceKeyName(
     PTCHAR      SubKeyName;
     DWORD       Index;
 
-    Success = OpenPciKey(&PciKey);
+    Success = OpenBusKey(BusKeyName, &BusKey);
     if (!Success)
         goto fail1;
 
-    Error = RegQueryInfoKey(PciKey,
+    Error = RegQueryInfoKey(BusKey,
                             NULL,
                             NULL,
                             NULL,
@@ -324,7 +316,7 @@ GetDeviceKeyName(
         SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
         memset(SubKeyName, 0, SubKeyLength);
 
-        Error = RegEnumKeyEx(PciKey,
+        Error = RegEnumKeyEx(BusKey,
                              Index,
                              (LPTSTR)SubKeyName,
                              &SubKeyLength,
@@ -337,7 +329,7 @@ GetDeviceKeyName(
             goto fail4;
         }
 
-        if (strncmp(SubKeyName, Prefix, strlen(Prefix)) == 0)
+        if (strncmp(SubKeyName, DeviceKeyPrefix, strlen(DeviceKeyPrefix)) == 0)
             goto found;
     }
 
@@ -345,11 +337,11 @@ GetDeviceKeyName(
     SubKeyName = NULL;
 
 found:
-    RegCloseKey(PciKey);
+    RegCloseKey(BusKey);
 
     Log("%s", (SubKeyName != NULL) ? SubKeyName : "none found");
 
-    *Name = SubKeyName;
+    *DeviceKeyName = SubKeyName;
     return TRUE;
 
 fail4:
@@ -363,7 +355,7 @@ fail3:
 fail2:
     Log("fail2");
 
-    RegCloseKey(PciKey);
+    RegCloseKey(BusKey);
 
 fail1:
     Error = GetLastError();
@@ -386,36 +378,37 @@ fail1:
 
 static BOOLEAN
 OpenDeviceKey(
-    IN  PTCHAR  Name,           
-    OUT PHKEY   Key
+    IN  PTCHAR  BusKeyName,
+    IN  PTCHAR  DeviceKeyName,
+    OUT PHKEY   DeviceKey
     )
 {
     BOOLEAN     Success;
-    HKEY        PciKey;
+    HKEY        BusKey;
     HRESULT     Error;
 
-    Success = OpenPciKey(&PciKey);
+    Success = OpenBusKey(BusKeyName, &BusKey);
     if (!Success)
         goto fail1;
 
-    Error = RegOpenKeyEx(PciKey,
-                         Name,
+    Error = RegOpenKeyEx(BusKey,
+                         DeviceKeyName,
                          0,
                          KEY_READ,
-                         Key);
+                         DeviceKey);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
         goto fail2;
     }
 
-    RegCloseKey(PciKey);
+    RegCloseKey(BusKey);
 
     return TRUE;
 
 fail2:
     Log("fail2");
 
-    RegCloseKey(PciKey);
+    RegCloseKey(BusKey);
 
 fail1:
     Error = GetLastError();
@@ -431,7 +424,6 @@ fail1:
     return FALSE;
 }
 
-
 static BOOLEAN
 GetDriverKeyName(
     IN  HKEY    DeviceKey,
@@ -585,7 +577,7 @@ fail1:
 
 static BOOLEAN
 OpenClassKey(
-    OUT PHKEY   Key
+    OUT PHKEY   ClassKey
     )
 {
     HRESULT     Error;
@@ -594,7 +586,7 @@ OpenClassKey(
                          CLASS_KEY,
                          0,
                          KEY_READ,
-                         Key);
+                         ClassKey);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
         goto fail1;
@@ -617,8 +609,8 @@ fail1:
 
 static BOOLEAN
 OpenDriverKey(
-    IN  PTCHAR  Name,           
-    OUT PHKEY   Key
+    IN  PTCHAR  DriverKeyName,
+    OUT PHKEY   DriverKey
     )
 {
     BOOLEAN     Success;
@@ -630,10 +622,10 @@ OpenDriverKey(
         goto fail1;
 
     Error = RegOpenKeyEx(ClassKey,
-                         Name,
+                         DriverKeyName,
                          0,
                          KEY_READ,
-                         Key);
+                         DriverKey);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
         goto fail2;
@@ -909,7 +901,8 @@ SetActiveDeviceInstanceID(
 
         // We are binding to a legacy platform device so only make it
         // active if there is no XenServer vendor device
-        Success = GetDeviceKeyName(XENSERVER_VENDOR_DEVICE_NAME,
+        Success = GetDeviceKeyName("PCI",
+                                   XENSERVER_VENDOR_DEVICE_NAME,
                                    &DeviceKeyName);
         if (!Success)
             goto fail1;
@@ -1135,8 +1128,11 @@ MatchExistingDriver(
     DWORD   ProductNameLength;
     DWORD   Type;
 
+    Log("====>");
+
     // Look for a legacy platform device
-    Success = GetDeviceKeyName(PLATFORM_DEVICE_0001_NAME,
+    Success = GetDeviceKeyName("PCI",
+                               PLATFORM_DEVICE_0001_NAME,
                                &DeviceKeyName);
     if (!Success)
         goto fail1;
@@ -1144,7 +1140,8 @@ MatchExistingDriver(
     if (DeviceKeyName != NULL)
         goto found;
 
-    Success = GetDeviceKeyName(PLATFORM_DEVICE_0002_NAME,
+    Success = GetDeviceKeyName("PCI",
+                               PLATFORM_DEVICE_0002_NAME,
                                &DeviceKeyName);
     if (!Success)
         goto fail2;
@@ -1156,7 +1153,7 @@ MatchExistingDriver(
     goto done;
 
 found:
-    Success = OpenDeviceKey(DeviceKeyName, &DeviceKey);
+    Success = OpenDeviceKey("PCI", DeviceKeyName, &DeviceKey);
     if (!Success)
         goto fail3;
 
@@ -1243,6 +1240,8 @@ done:
     if (DeviceKeyName != NULL)
         free(DeviceKeyName);
 
+    Log("<====");
+
     return TRUE;
 
 fail11:
@@ -1299,89 +1298,89 @@ fail1:
     return FALSE;
 }
 
-struct _INTERFACE_ENTRY {
-    const TCHAR *ProviderName;
-    const TCHAR *InterfaceName;
-    DWORD       VersionMin;
-    DWORD       VersionMax;       
-};
+#define DEFINE_REVISION(_N, _S, _SI, _E, _D, _ST, _R, _C, _G, _EM) \
+    (_N)
 
-#define DEFINE_INTERFACE_ENTRY(_ProviderName, _InterfaceName)           \
-    { #_ProviderName,                                                   \
-      #_InterfaceName,                                                  \
-      _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MIN,   \
-      _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MAX    \
-    }
-
-static struct _INTERFACE_ENTRY InterfaceTable[] = {
-    DEFINE_INTERFACE_ENTRY(XENBUS, DEBUG),
-    DEFINE_INTERFACE_ENTRY(XENBUS, SUSPEND),
-    DEFINE_INTERFACE_ENTRY(XENBUS, SHARED_INFO),
-    DEFINE_INTERFACE_ENTRY(XENBUS, EVTCHN),
-    DEFINE_INTERFACE_ENTRY(XENBUS, STORE),
-    DEFINE_INTERFACE_ENTRY(XENBUS, RANGE_SET),
-    DEFINE_INTERFACE_ENTRY(XENBUS, CACHE),
-    DEFINE_INTERFACE_ENTRY(XENBUS, GNTTAB),
-    DEFINE_INTERFACE_ENTRY(XENFILT, EMULATED),
-    DEFINE_INTERFACE_ENTRY(XENFILT, UNPLUG),
-    { NULL, NULL, 0, 0 }
+static DWORD    DeviceRevision[] = {
+    DEFINE_REVISION_TABLE
 };
 
+#undef DEFINE_REVISION
+
 static BOOLEAN
-SupportInterfaceVersion(
-    IN  PTCHAR              ProviderName,
-    IN  PTCHAR              InterfaceName,
-    IN  DWORD               Version
+SupportDeviceID(
+    IN  PTCHAR      DeviceID
     )
 {
-    BOOLEAN                 Supported;
-    struct _INTERFACE_ENTRY *Entry;
-
-    Supported = FALSE;
-    SetLastError(ERROR_REVISION_MISMATCH);
-
-    for (Entry = InterfaceTable; Entry->ProviderName != NULL; Entry++) {
-        if (_stricmp(ProviderName, Entry->ProviderName) == 0 &&
-            _stricmp(InterfaceName, Entry->InterfaceName) == 0 &&
-            Version >= Entry->VersionMin &&
-            Version <= Entry->VersionMax) {
-            Supported = TRUE;
-            break;
-        }
+    unsigned int    Revision;
+    int             Count;
+    DWORD           Index;
+    HRESULT         Error;
+
+    DeviceID = strrchr(DeviceID, '&');
+    assert(DeviceID != NULL);
+    DeviceID++;
+
+    Count = sscanf_s(DeviceID,
+                     "REV_%8x",
+                     &Revision);
+    if (Count != 1) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail1;
+    }
+
+    for (Index = 0; Index < ARRAYSIZE(DeviceRevision); Index++) {
+        if (Revision == DeviceRevision[Index])
+            goto found;
     }
 
-    Log("%s_%s_INTERFACE VERSION %d %s",
-        ProviderName,
-        InterfaceName,
-        Version,
-        (Supported) ? "SUPPORTED" : "NOT SUPPORTED");
+    SetLastError(ERROR_FILE_NOT_FOUND);
+    goto fail2;
+
+found:
+    Log("%x", Revision);
+
+    return TRUE;
+
+fail2:
+    Log("fail2");
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
 
-    return Supported;
+    return FALSE;
 }
 
 static BOOLEAN
-SupportSubscriberInterfaces(
-    IN  PTCHAR  ProviderName,
-    IN  HKEY    SubscriberKey
+GetMatchingDeviceID(
+    IN  HKEY    DriverKey,
+    OUT PTCHAR  *MatchingDeviceID
     )
 {
-    DWORD       Values;
-    DWORD       MaxInterfaceNameLength;
-    DWORD       InterfaceNameLength;
-    PTCHAR      InterfaceName;
-    DWORD       Index;
     HRESULT     Error;
+    DWORD       MaxValueLength;
+    DWORD       MatchingDeviceIDLength;
+    DWORD       Type;
+    DWORD       Index;
 
-    Error = RegQueryInfoKey(SubscriberKey,
+    Error = RegQueryInfoKey(DriverKey,
+                            NULL,
                             NULL,
                             NULL,
                             NULL,
                             NULL,
                             NULL,
                             NULL,
-                            &Values,
-                            &MaxInterfaceNameLength,
                             NULL,
+                            &MaxValueLength,
                             NULL,
                             NULL);
     if (Error != ERROR_SUCCESS) {
@@ -1389,59 +1388,34 @@ SupportSubscriberInterfaces(
         goto fail1;
     }
 
-    if (Values == 0)
-        goto done;
-
-    MaxInterfaceNameLength += sizeof (TCHAR);
+    MatchingDeviceIDLength = MaxValueLength + sizeof (TCHAR);
 
-    InterfaceNameLength = MaxInterfaceNameLength;
-
-    InterfaceName = malloc(InterfaceNameLength);
-    if (InterfaceName == NULL)
+    *MatchingDeviceID = calloc(1, MatchingDeviceIDLength);
+    if (*MatchingDeviceID == NULL)
         goto fail2;
 
-    for (Index = 0; Index < Values; Index++) {
-        DWORD   InterfaceNameLength;
-        DWORD   Type;
-        DWORD   Value;
-        DWORD   ValueLength;
-
-        InterfaceNameLength = MaxInterfaceNameLength;
-        memset(InterfaceName, 0, InterfaceNameLength);
-
-        ValueLength = sizeof (DWORD);
-
-        Error = RegEnumValue(SubscriberKey,
-                             Index,
-                             (LPTSTR)InterfaceName,
-                             &InterfaceNameLength,
-                             NULL,
-                             &Type,
-                             (LPBYTE)&Value,
-                             &ValueLength);
-        if (Error != ERROR_SUCCESS) {
-            SetLastError(Error);
-            goto fail3;
-        }
-
-        if (Type != REG_DWORD) {
-            SetLastError(ERROR_BAD_FORMAT);
-            goto fail4;
-        }
+    Error = RegQueryValueEx(DriverKey,
+                            "MatchingDeviceId",
+                            NULL,
+                            &Type,
+                            (LPBYTE)*MatchingDeviceID,
+                            &MatchingDeviceIDLength);
+    if (Error != ERROR_SUCCESS) {
+        SetLastError(Error);
+        goto fail3;
+    }
 
-        if (!SupportInterfaceVersion(ProviderName,
-                                     InterfaceName,
-                                     Value))
-            goto fail5;
+    if (Type != REG_SZ) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail4;
     }
 
-    free(InterfaceName);
+    for (Index = 0; Index < strlen(*MatchingDeviceID); Index++)
+        (*MatchingDeviceID)[Index] = (CHAR)toupper((*MatchingDeviceID)[Index]);
 
-done:
-    return TRUE;
+    Log("%s", *MatchingDeviceID);
 
-fail5:
-    Log("fail5");
+    return TRUE;
 
 fail4:
     Log("fail4");
@@ -1449,8 +1423,8 @@ fail4:
 fail3:
     Log("fail3");
 
-    free(InterfaceName);
-    
+    free(*MatchingDeviceID);
+
 fail2:
     Log("fail2");
 
@@ -1469,51 +1443,40 @@ fail1:
 }
 
 static BOOLEAN
-SupportRegisteredSubscribers(
-    IN  PTCHAR  ProviderName
+SupportChildDrivers(
+    VOID
     )
 {
-    TCHAR       InterfacesKeyName[MAX_PATH];
-    HKEY        InterfacesKey;
+    BOOLEAN     Success;
+    HKEY        XenbusKey;
+    HRESULT     Error;
     DWORD       SubKeys;
-    DWORD       MaxSubKeyNameLength;
-    DWORD       Index;
-    DWORD       SubKeyNameLength;
+    DWORD       MaxSubKeyLength;
+    DWORD       SubKeyLength;
     PTCHAR      SubKeyName;
-    HKEY        SubKey;
-    HRESULT     Result;
-    HRESULT     Error;
+    HKEY        DeviceKey;
+    PTCHAR      DriverKeyName;
+    HKEY        DriverKey;
+    PTCHAR      MatchingDeviceID;
+    DWORD       Index;
 
-    Result = StringCbPrintf(InterfacesKeyName,
-                            MAX_PATH,
-                            "%s\\%s\\Interfaces",
-                            SERVICES_KEY,
-                            ProviderName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail1;
-    }
+    Log("====>");
 
-    Error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
-                           InterfacesKeyName,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &InterfacesKey,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
+    Success = OpenBusKey("XENBUS", &XenbusKey);
+    if (!Success) {
+        // If there is no key then this must be a fresh installation
+        if (GetLastError() == ERROR_FILE_NOT_FOUND)
+            goto done;
+
+        goto fail1;
     }
 
-    Error = RegQueryInfoKey(InterfacesKey,
+    Error = RegQueryInfoKey(XenbusKey,
                             NULL,
                             NULL,
                             NULL,
                             &SubKeys,
-                            &MaxSubKeyNameLength,
+                            &MaxSubKeyLength,
                             NULL,
                             NULL,
                             NULL,
@@ -1522,76 +1485,110 @@ SupportRegisteredSubscribers(
                             NULL);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
-        goto fail3;
+        goto fail2;
     }
 
-    SubKeyNameLength = MaxSubKeyNameLength + sizeof (TCHAR);
+    SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
 
-    SubKeyName = malloc(SubKeyNameLength);
+    SubKeyName = malloc(SubKeyLength);
     if (SubKeyName == NULL)
-        goto fail4;
+        goto fail3;
 
     for (Index = 0; Index < SubKeys; Index++) {
-        SubKeyNameLength = MaxSubKeyNameLength + sizeof (TCHAR);
-        memset(SubKeyName, 0, SubKeyNameLength);
+        SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
+        memset(SubKeyName, 0, SubKeyLength);
 
-        Error = RegEnumKeyEx(InterfacesKey,
+        Error = RegEnumKeyEx(XenbusKey,
                              Index,
                              (LPTSTR)SubKeyName,
-                             &SubKeyNameLength,
+                             &SubKeyLength,
                              NULL,
                              NULL,
                              NULL,
                              NULL);
         if (Error != ERROR_SUCCESS) {
             SetLastError(Error);
-            goto fail5;
+            goto fail4;
         }
 
-        Error = RegOpenKeyEx(InterfacesKey,
-                             SubKeyName,
-                             0,
-                             KEY_READ,
-                             &SubKey);
-        if (Error != ERROR_SUCCESS)
+        Success = OpenDeviceKey("XENBUS", SubKeyName, &DeviceKey);
+        if (!Success)
+            goto fail5;
+
+        Success = GetDriverKeyName(DeviceKey, &DriverKeyName);
+        if (!Success)
             goto fail6;
 
-        if (!SupportSubscriberInterfaces(ProviderName, SubKey))
+        if (DriverKeyName == NULL)
+            goto loop;
+
+        Success = OpenDriverKey(DriverKeyName, &DriverKey);
+        if (!Success)
             goto fail7;
 
-        RegCloseKey(SubKey);
+        Success = GetMatchingDeviceID(DriverKey, &MatchingDeviceID);
+        if (!Success)
+            goto fail8;
+
+        Success = SupportDeviceID(MatchingDeviceID);
+        if (!Success)
+            goto fail9;
+
+        free(MatchingDeviceID);
+
+        RegCloseKey(DriverKey);
+
+        free(DriverKeyName);
+
+    loop:
+        RegCloseKey(DeviceKey);
     }
 
     free(SubKeyName);
 
-    RegCloseKey(InterfacesKey);
+    RegCloseKey(XenbusKey);
+
+done:
+    Log("<====");
 
     return TRUE;
 
+fail9:
+    Log("fail9");
+
+    free(MatchingDeviceID);
+
+fail8:
+    Log("fail8");
+
+    RegCloseKey(DriverKey);
+
 fail7:
     Log("fail7");
 
-    RegCloseKey(SubKey);
+    free(DriverKeyName);
 
 fail6:
     Log("fail6");
 
+    RegCloseKey(DeviceKey);
+
 fail5:
     Log("fail5");
 
-    free(SubKeyName);
-
 fail4:
     Log("fail4");
-    
+
+    free(SubKeyName);
+
 fail3:
     Log("fail3");
 
-    RegCloseKey(InterfacesKey);
-
 fail2:
     Log("fail2");
-    
+
+    RegCloseKey(XenbusKey);
+
 fail1:
     Error = GetLastError();
 
@@ -1878,7 +1875,7 @@ SetFriendlyName(
     )
 {
     PTCHAR                  Description;
-    DWORD                   Value;
+    unsigned int            Value;
     TCHAR                   FriendlyName[MAX_PATH];
     DWORD                   FriendlyNameLength;
     HRESULT                 Result;
@@ -1945,176 +1942,6 @@ fail1:
     return FALSE;
 }
 
-static HKEY
-OpenInterfacesKey(
-    IN  PTCHAR  ProviderName
-    )
-{
-    HRESULT     Result;
-    TCHAR       KeyName[MAX_PATH];
-    HKEY        Key;
-    HRESULT     Error;
-
-    Result = StringCbPrintf(KeyName,
-                            MAX_PATH,
-                            "%s\\%s\\Interfaces",
-                            SERVICES_KEY,
-                            ProviderName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail1;
-    }
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         KeyName,
-                         0,
-                         KEY_ALL_ACCESS,
-                         &Key);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    return Key;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static BOOLEAN
-SubscribeInterface(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  SubscriberName,
-    IN  PTCHAR  InterfaceName,
-    IN  DWORD   InterfaceVersion
-    )
-{
-    HKEY        Key;
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL)
-        goto fail1;
-
-    Error = RegCreateKeyEx(InterfacesKey,
-                           SubscriberName,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &Key,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    Error = RegSetValueEx(Key,
-                          InterfaceName,
-                          0,
-                          REG_DWORD,
-                          (const BYTE *)&InterfaceVersion,
-                          sizeof(DWORD));
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    Log("%s: %s_%s_INTERFACE_VERSION %u",
-        SubscriberName,
-        ProviderName,
-        InterfaceName,
-        InterfaceVersion);
-
-    RegCloseKey(Key);
-    RegCloseKey(InterfacesKey);
-
-    return TRUE;
-
-fail3:
-    RegCloseKey(Key);
-
-fail2:
-    RegCloseKey(InterfacesKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-#define SUBSCRIBE_INTERFACE(_ProviderName, _SubscriberName, _InterfaceName)                        \
-    do {                                                                                           \
-        (VOID) SubscribeInterface(#_ProviderName,                                                  \
-                                  #_SubscriberName,                                                \
-                                  #_InterfaceName,                                                 \
-                                  _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MAX); \
-    } while (FALSE);
-
-static BOOLEAN
-UnsubscribeInterfaces(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  SubscriberName
-    )
-{
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    Log("%s: %s", SubscriberName, ProviderName);
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL) {
-        goto fail1;
-    }
-
-    Error = RegDeleteTree(InterfacesKey,
-                          SubscriberName);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    RegCloseKey(InterfacesKey);
-
-    return TRUE;
-
-fail2:
-    RegCloseKey(InterfacesKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
 static HRESULT
 DifInstallPreProcess(
     IN  HDEVINFO                    DeviceInfoSet,
@@ -2135,17 +1962,13 @@ DifInstallPreProcess(
     if (!Success)
         goto fail1;
 
-    Success = SupportRegisteredSubscribers("XENFILT");
+    Success = SupportChildDrivers();
     if (!Success)
         goto fail2;
 
-    Success = SupportRegisteredSubscribers("XENBUS");
-    if (!Success)
-        goto fail3;
-
     Success = GetActiveDeviceInstanceID(&DeviceID, &InstanceID);
     if (!Success)
-        goto fail4;
+        goto fail3;
 
     if (DeviceID == NULL) {
         assert(InstanceID == NULL);
@@ -2153,11 +1976,11 @@ DifInstallPreProcess(
         Success = GetDeviceInstanceID(DeviceInfoSet, DeviceInfoData,
                                       &DeviceID, &InstanceID);
         if (!Success)
-            goto fail5;
+            goto fail4;
 
         Success = SetActiveDeviceInstanceID(DeviceID, InstanceID);
         if (!Success)
-            goto fail6;
+            goto fail5;
     }
 
     free(DeviceID);
@@ -2167,15 +1990,12 @@ DifInstallPreProcess(
     
     return NO_ERROR;
 
-fail6:
-    Log("fail6");
+fail5:
+    Log("fail5");
 
     free(DeviceID);
     free(InstanceID);
 
-fail5:
-    Log("fail5");
-
 fail4:
     Log("fail4");
 
@@ -2245,8 +2065,6 @@ DifInstallPostProcess(
     }
 
     if (Active) {
-        SUBSCRIBE_INTERFACE(XENFILT, XENBUS, UNPLUG);
-
         (VOID) InstallFilter(&GUID_DEVCLASS_SYSTEM, "XENFILT");
         (VOID) InstallFilter(&GUID_DEVCLASS_HDC, "XENFILT");
         (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData);
@@ -2384,8 +2202,6 @@ DifRemovePreProcess(
 
         (VOID) RemoveFilter(&GUID_DEVCLASS_HDC, "XENFILT");
         (VOID) RemoveFilter(&GUID_DEVCLASS_SYSTEM, "XENFILT");
-
-        UnsubscribeInterfaces("XENFILT", "XENBUS");
     }
 
     free(DeviceID);
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:20:18 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:20:18 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7FC-0001wu-7B; Mon, 20 Jul 2015 09:20:18 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7FA-0001wg-45
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:20:16 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	B8/A4-24055-F4DBCA55; Mon, 20 Jul 2015 09:20:15 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-206.messagelabs.com!1437384011!16851933!1
X-Originating-IP: [74.125.82.53]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG, UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26715 invoked from network); 20 Jul 2015 09:20:11 -0000
Received: from mail-wg0-f53.google.com (HELO mail-wg0-f53.google.com)
	(74.125.82.53)
	by server-14.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:20:11 -0000
Received: by wgmn9 with SMTP id n9so125619969wgm.0
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:20:11 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=XrU6GfTHcnKt6qbkqt8E8kDIuchyimZw3FQYECjswng=;
	b=um23SkaHkn0LicKvrXf8rsuff+1AlXWrDAU/Qnf56RrHjgA7dWqb6mYuZDME8svbAJ
	c9EvRd6SV55YiZe/DsnpCXLmDHIjMgwXFiYGa9ek6U9VHx1fPtj1lrMzoK/Xz1yXQFsk
	A5mdHrQo/SQDDToW7mjQMbsHIQTly/xgdKNPPAcZ617y3gYtbwBDBzunDIJZ4nqmi6i2
	xJ8guO4ZvrtAowG9r6NkUhHT3inn7CWxCpnKpZlxNmY3z0cvX2tfG79IUI1HtzwyXNlJ
	iGadptD1wCOcoKXaQ5u5EM+83CSt1ZoPHymIyW9XKlqP2MjdGMO713Asp4O2W0VvIY4Q
	yXZQ==
X-Received: by 10.180.24.165 with SMTP id v5mr19878431wif.63.1437384011661;
	Mon, 20 Jul 2015 02:20:11 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	l6sm10833795wib.18.2015.07.20.02.20.10
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:20:11 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:19:55 +0100
Message-Id: <1437383995-6240-4-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437383995-6240-1-git-send-email-paul.durrant@citrix.com>
References: <1437383995-6240-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 3/3] Introduce new mechanism to unplug
	emulated devices
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This makes an incompatible change and so the PDO revision is bumped up
without retaining any previous revisions.

With this patch a new unplug interface is exported by XENBUS (so it is
available for query before installing XENFILT). This interface exports
a Request method which is now the one true way of requesting unplug
of emulated devices. Co-installers need not mess with registry keys
any more. Instead drivers should request unplug when they find their
PDOs blocked by aliasing emulated devices, or when they successfully
come online. The reason for the latter case is that unplug is now
single-shot. It needs to be re-requested by PV drivers each time their
PDOs come online otherwise emulated devices will be re-instated on
next reboot.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/revision.h             |   6 +-
 include/unplug_interface.h     |  70 +++---
 include/xen.h                  |  26 +++
 src/coinst/coinst.c            |   2 +-
 src/common/registry.c          |  42 ++++
 src/common/registry.h          |  16 +-
 src/xen/driver.c               | 113 ++++++++--
 src/xen/driver.h               |  40 ++++
 src/xen/unplug.c               | 421 +++++++++++++++++++++++++++++++++++++
 src/xen/unplug.h               |  48 +++++
 src/xenbus.inf                 |  17 +-
 src/xenbus/fdo.c               | 104 ++++-----
 src/xenbus/fdo.h               |  10 +-
 src/xenbus/pdo.c               |  14 +-
 src/xenbus/suspend.c           |  37 +---
 src/xenbus/unplug.c            | 241 +++++++++++++++++++++
 src/xenbus/unplug.h            |  62 ++++++
 src/xenfilt/driver.c           | 132 +++---------
 src/xenfilt/driver.h           |  12 --
 src/xenfilt/pdo.c              |   2 -
 src/xenfilt/unplug.c           | 467 -----------------------------------------
 src/xenfilt/unplug.h           |  59 ------
 vs2012/xen/xen.vcxproj         |   1 +
 vs2012/xenbus/xenbus.vcxproj   |   1 +
 vs2012/xenfilt/xenfilt.vcxproj |   1 -
 vs2013/xen/xen.vcxproj         |   1 +
 vs2013/xenbus/xenbus.vcxproj   |   1 +
 vs2013/xenfilt/xenfilt.vcxproj |   1 -
 28 files changed, 1126 insertions(+), 821 deletions(-)
 create mode 100644 src/xen/driver.h
 create mode 100644 src/xen/unplug.c
 create mode 100644 src/xen/unplug.h
 create mode 100644 src/xenbus/unplug.c
 create mode 100644 src/xenbus/unplug.h
 delete mode 100644 src/xenfilt/unplug.c
 delete mode 100644 src/xenfilt/unplug.h

diff --git a/include/revision.h b/include/revision.h
index 9a91a33..dfe4995 100644
--- a/include/revision.h
+++ b/include/revision.h
@@ -43,8 +43,8 @@
 // G  - XENBUS_GNTTAB_INTERFACE
 // EM - XENFILT_EMULATED_INTERFACE
 
-//                    REVISION   S  SI   E   D  ST   R   C   G  EM
-#define DEFINE_REVISION_TABLE                                      \
-    DEFINE_REVISION(0x08000008,  1,  2,  4,  1,  1,  1,  1,  1,  1)
+//                    REVISION   S  SI   E   D  ST   R   C   G   U  EM
+#define DEFINE_REVISION_TABLE                                           \
+    DEFINE_REVISION(0x08000009,  1,  2,  4,  1,  1,  1,  1,  1,  1,  1)
 
 #endif  // _REVISION_H
diff --git a/include/unplug_interface.h b/include/unplug_interface.h
index 8817f53..83b3dc9 100644
--- a/include/unplug_interface.h
+++ b/include/unplug_interface.h
@@ -30,75 +30,87 @@
  */
 
 /*! \file unplug_interface.h
-    \brief XENFILT UNPLUG Interface
+    \brief XENBUS UNPLUG Interface
 
-    This interface provides a primitive to re-unplug emulated devices,
-    which is required on resume-from-suspend
+    This interface provides a method to request emulated device unplug
 */
 
-#ifndef _XENFILT_UNPLUG_INTERFACE_H
-#define _XENFILT_UNPLUG_INTERFACE_H
+#ifndef _XENBUS_UNPLUG_INTERFACE_H
+#define _XENBUS_UNPLUG_INTERFACE_H
 
 #ifndef _WINDLL
 
-/*! \typedef XENFILT_UNPLUG_ACQUIRE
+/*! \typedef XENBUS_UNPLUG_ACQUIRE
     \brief Acquire a reference to the UNPLUG interface
 
     \param Interface The interface header
 */  
 typedef NTSTATUS
-(*XENFILT_UNPLUG_ACQUIRE)(
+(*XENBUS_UNPLUG_ACQUIRE)(
     IN  PINTERFACE  Interface
     );
 
-/*! \typedef XENFILT_UNPLUG_RELEASE
+/*! \typedef XENBUS_UNPLUG_RELEASE
     \brief Release a reference to the UNPLUG interface
 
     \param Interface The interface header
 */  
 typedef VOID
-(*XENFILT_UNPLUG_RELEASE)(
+(*XENBUS_UNPLUG_RELEASE)(
     IN  PINTERFACE  Interface
     );
 
-/*! \typedef XENFILT_UNPLUG_REPLAY
-    \brief Re-unplug emulated devices that were previously unplugged
-    at boot time
+/*! \enum _XENBUS_UNPLUG_DEVICE_TYPE
+    \brief Type of device to be unplugged
+*/
+typedef enum _XENBUS_UNPLUG_DEVICE_TYPE {
+    XENBUS_UNPLUG_DEVICE_TYPE_INVALID = 0,
+    XENBUS_UNPLUG_DEVICE_TYPE_NICS,     /*!< NICs */
+    XENBUS_UNPLUG_DEVICE_TYPE_DISKS,    /*!< Disks */
+} XENBUS_UNPLUG_DEVICE_TYPE, *PXENBUS_UNPLUG_DEVICE_TYPE;
+
+/*! \typedef XENBUS_UNPLUG_REQUEST
+    \brief Request unplug of a type of emulated device
 
     \param Interface The interface header
+    \param Type The type of device
+    \param Make Set to TRUE if the request is being made, FALSE if it is
+           being revoked.
 */  
 typedef VOID
-(*XENFILT_UNPLUG_REPLAY)(
-    IN  PINTERFACE  Interface
+(*XENBUS_UNPLUG_REQUEST)(
+    IN  PINTERFACE                  Interface,
+    IN  XENBUS_UNPLUG_DEVICE_TYPE   Type,
+    IN  BOOLEAN                     Make
     );
 
-// {D5657CFD-3DB5-4A23-A94F-61FD89247FE7}
-DEFINE_GUID(GUID_XENFILT_UNPLUG_INTERFACE,
-0xd5657cfd, 0x3db5, 0x4a23, 0xa9, 0x4f, 0x61, 0xfd, 0x89, 0x24, 0x7f, 0xe7);
+// {73db6517-3d06-4937-989f-199b7501e229}
+DEFINE_GUID(GUID_XENBUS_UNPLUG_INTERFACE,
+0x73db6517, 0x3d06, 0x4937, 0x98, 0x9f, 0x19, 0x9b, 0x75, 0x01, 0xe2, 0x29);
 
-/*! \struct _XENFILT_UNPLUG_INTERFACE_V1
+/*! \struct _XENBUS_UNPLUG_INTERFACE_V1
     \brief UNPLUG interface version 1
     \ingroup interfaces
 */
-struct _XENFILT_UNPLUG_INTERFACE_V1 {
+struct _XENBUS_UNPLUG_INTERFACE_V1 {
     INTERFACE               Interface;
-    XENFILT_UNPLUG_ACQUIRE  Acquire;
-    XENFILT_UNPLUG_RELEASE  Release;
-    XENFILT_UNPLUG_REPLAY   Replay;
+    XENBUS_UNPLUG_ACQUIRE   UnplugAcquire;
+    XENBUS_UNPLUG_RELEASE   UnplugRelease;
+    XENBUS_UNPLUG_REQUEST   UnplugRequest;
 };
 
-typedef struct _XENFILT_UNPLUG_INTERFACE_V1 XENFILT_UNPLUG_INTERFACE, *PXENFILT_UNPLUG_INTERFACE;
+typedef struct _XENBUS_UNPLUG_INTERFACE_V1 XENBUS_UNPLUG_INTERFACE, *PXENBUS_UNPLUG_INTERFACE;
 
-/*! \def XENFILT_UNPLUG
+/*! \def XENBUS_UNPLUG
     \brief Macro at assist in method invocation
 */
-#define XENFILT_UNPLUG(_Method, _Interface, ...)    \
-    (_Interface)-> ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+#define XENBUS_UNPLUG(_Method, _Interface, ...)    \
+    (_Interface)->Unplug ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
 
 #endif  // _WINDLL
 
-#define XENFILT_UNPLUG_INTERFACE_VERSION_MIN  1
-#define XENFILT_UNPLUG_INTERFACE_VERSION_MAX  1
+#define XENBUS_UNPLUG_INTERFACE_VERSION_MIN  1
+#define XENBUS_UNPLUG_INTERFACE_VERSION_MAX  1
 
-#endif  // _XENFILT_UNPLUG_INTERFACE_H
+#endif  // _XENBUS_UNPLUG_INTERFACE_H
 
diff --git a/include/xen.h b/include/xen.h
index cf9c2d9..6007582 100644
--- a/include/xen.h
+++ b/include/xen.h
@@ -307,6 +307,32 @@ ModuleLookup(
     OUT PULONG_PTR  Offset
     );
 
+// UNPLUG
+
+typedef enum _UNPLUG_TYPE {
+    UNPLUG_DISKS = 0,
+    UNPLUG_NICS,
+    UNPLUG_TYPE_COUNT
+} UNPLUG_TYPE, *PUNPLUG_TYPE;
+
+XEN_API
+VOID
+UnplugDevices(
+    VOID
+    );
+
+XEN_API
+NTSTATUS
+UnplugIncrementValue(
+    IN  UNPLUG_TYPE Type
+    );
+
+XEN_API
+NTSTATUS
+UnplugDecrementValue(
+    IN  UNPLUG_TYPE Type
+    );
+
 // LOG
 
 typedef enum _LOG_LEVEL {
diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 0b8c306..2b980a1 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -1298,7 +1298,7 @@ fail1:
     return FALSE;
 }
 
-#define DEFINE_REVISION(_N, _S, _SI, _E, _D, _ST, _R, _C, _G, _EM) \
+#define DEFINE_REVISION(_N, _S, _SI, _E, _D, _ST, _R, _C, _G, _U, _EM) \
     (_N)
 
 static DWORD    DeviceRevision[] = {
diff --git a/src/common/registry.c b/src/common/registry.c
index 4caeaa5..cb9e31d 100644
--- a/src/common/registry.c
+++ b/src/common/registry.c
@@ -116,6 +116,40 @@ fail1:
 }
 
 NTSTATUS
+RegistryCreateKey(
+    IN  HANDLE          Parent,
+    IN  PUNICODE_STRING Path,
+    IN  ULONG           Options,
+    OUT PHANDLE         Key
+    )
+{
+    OBJECT_ATTRIBUTES   Attributes;
+    NTSTATUS            status;
+
+    InitializeObjectAttributes(&Attributes,
+                               Path,
+                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
+                               Parent,
+                               NULL);
+
+    status = ZwCreateKey(Key,
+                         KEY_ALL_ACCESS,
+                         &Attributes,
+                         0,
+                         NULL,
+                         Options,
+                         NULL
+                         );
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    return STATUS_SUCCESS;
+
+fail1:
+    return status;
+}
+
+NTSTATUS
 RegistryOpenServiceKey(
     IN  ACCESS_MASK     DesiredAccess,
     OUT PHANDLE         Key
@@ -125,6 +159,14 @@ RegistryOpenServiceKey(
 }
 
 NTSTATUS
+RegistryCreateServiceKey(
+    OUT PHANDLE         Key
+    )
+{
+    return RegistryCreateKey(NULL, &RegistryPath, REG_OPTION_NON_VOLATILE, Key);
+}
+
+NTSTATUS
 RegistryOpenSoftwareKey(
     IN  PDEVICE_OBJECT  DeviceObject,
     IN  ACCESS_MASK     DesiredAccess,
diff --git a/src/common/registry.h b/src/common/registry.h
index 7f0fa23..3920b6d 100644
--- a/src/common/registry.h
+++ b/src/common/registry.h
@@ -53,12 +53,25 @@ RegistryOpenKey(
     );
 
 extern NTSTATUS
+RegistryCreateKey(
+    IN  HANDLE          Parent,
+    IN  PUNICODE_STRING Path,
+    IN  ULONG           Options,
+    OUT PHANDLE         Key
+    );
+
+extern NTSTATUS
 RegistryOpenServiceKey(
     IN  ACCESS_MASK DesiredAccess,
     OUT PHANDLE     Key
     );
 
 extern NTSTATUS
+RegistryCreateServiceKey(
+    OUT PHANDLE     Key
+    );
+
+extern NTSTATUS
 RegistryOpenSoftwareKey(
     IN  PDEVICE_OBJECT  DeviceObject,
     IN  ACCESS_MASK     DesiredAccess,
@@ -83,8 +96,7 @@ RegistryOpenSubKey(
 extern NTSTATUS
 RegistryCreateSubKey(
     IN  HANDLE      Key,
-    IN  PCHAR       Name,
-    IN  ULONG       Options,
+    IN  PCHAR       Name,    IN  ULONG       Options,
     OUT PHANDLE     SubKey
     );
 
diff --git a/src/xen/driver.c b/src/xen/driver.c
index 66a5e80..9662ff6 100644
--- a/src/xen/driver.c
+++ b/src/xen/driver.c
@@ -35,12 +35,15 @@
 #include <procgrp.h>
 #include <xen.h>
 
+#include "registry.h"
+#include "driver.h"
 #include "hypercall.h"
 #include "log.h"
 #include "module.h"
 #include "process.h"
 #include "system.h"
 #include "acpi.h"
+#include "unplug.h"
 #include "bug_check.h"
 #include "dbg_print.h"
 #include "assert.h"
@@ -51,6 +54,7 @@ extern PULONG   InitSafeBootMode;
 typedef struct _XEN_DRIVER {
     PLOG_DISPOSITION    TraceDisposition;
     PLOG_DISPOSITION    InfoDisposition;
+    HANDLE              UnplugKey;
 } XEN_DRIVER, *PXEN_DRIVER;
 
 static XEN_DRIVER   Driver;
@@ -102,6 +106,30 @@ fail1:
     return STATUS_INCOMPATIBLE_DRIVER_BLOCKED;
 }
 
+static FORCEINLINE VOID
+__DriverSetUnplugKey(
+    IN  HANDLE  Key
+    )
+{
+    Driver.UnplugKey = Key;
+}
+
+static FORCEINLINE HANDLE
+__DriverGetUnplugKey(
+    VOID
+    )
+{
+    return Driver.UnplugKey;
+}
+
+HANDLE
+DriverGetUnplugKey(
+    VOID
+    )
+{
+    return __DriverGetUnplugKey();
+}
+
 static VOID
 DriverOutputBuffer(
     IN  PVOID   Argument,
@@ -122,9 +150,9 @@ DllInitialize(
     IN  PUNICODE_STRING RegistryPath
     )
 {
-    NTSTATUS    status;
-
-    UNREFERENCED_PARAMETER(RegistryPath);
+    HANDLE              ServiceKey;
+    HANDLE              UnplugKey;
+    NTSTATUS            status;
 
     ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
     WdmlibProcgrpInitialize();
@@ -165,59 +193,103 @@ DllInitialize(
          MONTH,
          YEAR);
 
-    status = AcpiInitialize();
+    status = RegistryInitialize(RegistryPath);
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    status = SystemInitialize();
+    status = RegistryCreateServiceKey(&ServiceKey);
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    status = HypercallInitialize();
+    status = RegistryCreateSubKey(ServiceKey,
+                                  "Unplug",
+                                  REG_OPTION_NON_VOLATILE,
+                                  &UnplugKey);
     if (!NT_SUCCESS(status))
         goto fail4;
 
-    status = BugCheckInitialize();
+    __DriverSetUnplugKey(UnplugKey);
+
+    status = AcpiInitialize();
     if (!NT_SUCCESS(status))
         goto fail5;
 
-    status = ModuleInitialize();
+    status = SystemInitialize();
     if (!NT_SUCCESS(status))
         goto fail6;
 
-    status = ProcessInitialize();
+    status = HypercallInitialize();
     if (!NT_SUCCESS(status))
         goto fail7;
 
+    status = BugCheckInitialize();
+    if (!NT_SUCCESS(status))
+        goto fail8;
+
+    status = ModuleInitialize();
+    if (!NT_SUCCESS(status))
+        goto fail9;
+
+    status = ProcessInitialize();
+    if (!NT_SUCCESS(status))
+        goto fail10;
+
+    status = UnplugInitialize();
+    if (!NT_SUCCESS(status))
+        goto fail11;
+
+    RegistryCloseKey(ServiceKey);
+
 done:
     Trace("<====\n");
 
     return STATUS_SUCCESS;
 
+fail11:
+    Error("fail11\n");
+
+    ProcessTeardown();
+
+fail10:
+    Error("fail10\n");
+
+    ModuleTeardown();
+
+fail9:
+    Error("fail9\n");
+
+    BugCheckTeardown();
+
+fail8:
+    Error("fail8\n");
+
+    HypercallTeardown();
+
 fail7:
     Error("fail7\n");
 
-    ModuleTeardown();
+    SystemTeardown();
 
 fail6:
     Error("fail6\n");
 
-    BugCheckTeardown();
+    AcpiTeardown();
 
 fail5:
     Error("fail5\n");
 
-    HypercallTeardown();
+    RegistryCloseKey(UnplugKey);
+    __DriverSetUnplugKey(NULL);
 
 fail4:
     Error("fail4\n");
 
-    SystemTeardown();
+    RegistryCloseKey(ServiceKey);
 
 fail3:
     Error("fail3\n");
 
-    AcpiTeardown();
+    RegistryTeardown();
 
 fail2:
     Error("fail2\n");
@@ -231,7 +303,7 @@ fail2:
     LogTeardown();
 
 fail1:
-    Error("fail1 (%08x)", status);
+    Error("fail1 (%08x)\n", status);
 
     ASSERT(IsZeroMemory(&Driver, sizeof (XEN_DRIVER)));
 
@@ -243,11 +315,15 @@ DllUnload(
     VOID
     )
 {
+    HANDLE  UnplugKey;
+
     Trace("====>\n");
 
     if (*InitSafeBootMode > 0)
         goto done;
 
+    UnplugTeardown();
+
     ProcessTeardown();
 
     ModuleTeardown();
@@ -258,6 +334,13 @@ DllUnload(
 
     SystemTeardown();
 
+    UnplugKey = __DriverGetUnplugKey();
+
+    RegistryCloseKey(UnplugKey);
+    __DriverSetUnplugKey(NULL);
+
+    RegistryTeardown();
+
     Info("XEN %d.%d.%d (%d) (%02d.%02d.%04d)\n",
          MAJOR_VERSION,
          MINOR_VERSION,
diff --git a/src/xen/driver.h b/src/xen/driver.h
new file mode 100644
index 0000000..c4f7a6f
--- /dev/null
+++ b/src/xen/driver.h
@@ -0,0 +1,40 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XEN_DRIVER_H
+#define _XEN_DRIVER_H
+
+extern HANDLE
+DriverGetUnplugKey(
+    VOID
+    );
+
+#endif  // _XEN_DRIVER_H
diff --git a/src/xen/unplug.c b/src/xen/unplug.c
new file mode 100644
index 0000000..77b6b8e
--- /dev/null
+++ b/src/xen/unplug.c
@@ -0,0 +1,421 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#define XEN_API __declspec(dllexport)
+
+#include <ntddk.h>
+#include <ntstrsafe.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <xen.h>
+#include <version.h>
+
+#include "driver.h"
+#include "high.h"
+#include "registry.h"
+#include "unplug.h"
+#include "dbg_print.h"
+#include "assert.h"
+#include "util.h"
+
+#define UNPLUG_TAG  'LPNU'
+
+typedef struct _UNPLUG_CONTEXT {
+    LONG        References;
+    HIGH_LOCK   Lock;
+    BOOLEAN     BlackListed;
+    BOOLEAN     Request[UNPLUG_TYPE_COUNT];
+    BOOLEAN     BootEmulated;
+} UNPLUG_CONTEXT, *PUNPLUG_CONTEXT;
+
+static UNPLUG_CONTEXT   UnplugContext;
+
+static FORCEINLINE PVOID
+__UnplugAllocate(
+    IN  ULONG   Length
+    )
+{
+    return __AllocatePoolWithTag(NonPagedPool, Length, UNPLUG_TAG);
+}
+
+static FORCEINLINE VOID
+__UnplugFree(
+    IN  PVOID   Buffer
+    )
+{
+    ExFreePoolWithTag(Buffer, UNPLUG_TAG);
+}
+
+static VOID
+UnplugSetBootEmulated(
+    VOID
+    )
+{
+    PUNPLUG_CONTEXT Context = &UnplugContext;
+    CHAR            Key[] = "XEN:BOOT_EMULATED=";
+    PANSI_STRING    Option;
+    PCHAR           Value;
+    NTSTATUS        status;
+
+    status = RegistryQuerySystemStartOption(Key, &Option);
+    if (!NT_SUCCESS(status))
+        return;
+
+    Value = Option->Buffer + sizeof (Key) - 1;
+
+    if (strcmp(Value, "TRUE") == 0)
+        Context->BootEmulated = TRUE;
+
+    RegistryFreeSzValue(Option);
+}
+
+static VOID
+UnplugDeviceType(
+    IN  UNPLUG_TYPE Type
+    )
+{
+    PUNPLUG_CONTEXT Context = &UnplugContext;
+
+    switch (Type) {
+    case UNPLUG_DISKS:
+        if (Context->BootEmulated) {
+#pragma prefast(suppress:28138)
+            WRITE_PORT_USHORT((PUSHORT)0x10, 0x0004);
+
+            LogPrintf(LOG_LEVEL_WARNING, "UNPLUG: AUX DISKS\n");
+        } else {
+#pragma prefast(suppress:28138)
+            WRITE_PORT_USHORT((PUSHORT)0x10, 0x0001);
+
+            LogPrintf(LOG_LEVEL_WARNING, "UNPLUG: DISKS\n");
+        }
+        break;
+    case UNPLUG_NICS:
+#pragma prefast(suppress:28138)
+        WRITE_PORT_USHORT((PUSHORT)0x10, 0x0002);
+
+        LogPrintf(LOG_LEVEL_WARNING, "UNPLUG: NICS\n");
+        break;
+    default:
+        ASSERT(FALSE);
+    }
+}
+
+static NTSTATUS
+UnplugPreamble(
+    VOID
+    )
+{
+    PUNPLUG_CONTEXT Context = &UnplugContext;
+    USHORT          Magic;
+    UCHAR           Version;
+    NTSTATUS        status;
+
+    // See docs/misc/hvm-emulated-unplug.markdown for details of the
+    // protocol in use here
+
+#pragma prefast(suppress:28138)
+    Magic = READ_PORT_USHORT((PUSHORT)0x10);
+
+    if (Magic == 0xd249) {
+        Context->BlackListed = TRUE;
+        goto done;
+    }
+
+    status = STATUS_NOT_SUPPORTED;
+    if (Magic != 0x49d2)
+        goto fail1;
+
+#pragma prefast(suppress:28138)
+    Version = READ_PORT_UCHAR((PUCHAR)0x12);
+    if (Version != 0) {
+#pragma prefast(suppress:28138)
+        WRITE_PORT_USHORT((PUSHORT)0x12, 0xFFFF);   // FIXME
+
+#pragma prefast(suppress:28138)
+        WRITE_PORT_ULONG((PULONG)0x10,
+                         (MAJOR_VERSION << 16) |
+                         (MINOR_VERSION << 8) |
+                         MICRO_VERSION);
+
+#pragma prefast(suppress:28138)
+        Magic = READ_PORT_USHORT((PUSHORT)0x10);
+        if (Magic == 0xd249)
+            Context->BlackListed = TRUE;
+    }
+
+done:
+    LogPrintf(LOG_LEVEL_WARNING,
+              "UNPLUG: PRE-AMBLE (DRIVERS %s)\n",
+              (Context->BlackListed) ? "BLACKLISTED" : "NOT BLACKLISTED");
+
+    return STATUS_SUCCESS;
+
+fail1:
+    return status;
+}
+
+static VOID
+UnplugSetRequest(
+    IN  UNPLUG_TYPE     Type
+    )
+{
+    PUNPLUG_CONTEXT     Context = &UnplugContext;
+    HANDLE              UnplugKey;
+    PCHAR               ValueName;
+    ULONG               Value;
+    KIRQL               Irql;
+    NTSTATUS            status;
+
+    Trace("====>\n");
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    UnplugKey = DriverGetUnplugKey();
+
+    switch (Type) {
+    case UNPLUG_DISKS:
+        ValueName = "DISKS";
+        break;
+    case UNPLUG_NICS:
+        ValueName = "NICS";
+        break;
+    default:
+        ValueName = NULL;
+        ASSERT(FALSE);
+    }
+
+    status = RegistryQueryDwordValue(UnplugKey,
+                                     ValueName,
+                                     &Value);
+    if (!NT_SUCCESS(status))
+        goto done;
+
+    (VOID) RegistryDeleteValue(UnplugKey, ValueName);
+
+    Info("%s\n", ValueName);
+
+    AcquireHighLock(&Context->Lock, &Irql);
+    Context->Request[Type] = (Value != 0) ? TRUE : FALSE;
+    ReleaseHighLock(&Context->Lock, Irql);
+
+done:
+    Trace("<====\n");
+}
+
+XEN_API
+NTSTATUS
+UnplugIncrementValue(
+    IN  UNPLUG_TYPE     Type
+    )
+{
+    HANDLE              UnplugKey;
+    PCHAR               ValueName;
+    ULONG               Value;
+    NTSTATUS            status;
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    UnplugKey = DriverGetUnplugKey();
+
+    switch (Type) {
+    case UNPLUG_DISKS:
+        ValueName = "DISKS";
+        break;
+    case UNPLUG_NICS:
+        ValueName = "NICS";
+        break;
+    default:
+        ValueName = NULL;
+        ASSERT(FALSE);
+    }
+
+    status = RegistryQueryDwordValue(UnplugKey,
+                                     ValueName,
+                                     &Value);
+    if (!NT_SUCCESS(status))
+        Value = 0;
+
+    Value++;
+
+    status = RegistryUpdateDwordValue(UnplugKey,
+                                      ValueName,
+                                      Value);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Info("%s %u\n", ValueName, Value);
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+XEN_API
+NTSTATUS
+UnplugDecrementValue(
+    IN  UNPLUG_TYPE     Type
+    )
+{
+    HANDLE              UnplugKey;
+    PCHAR               ValueName;
+    LONG                Value;
+    NTSTATUS            status;
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    UnplugKey = DriverGetUnplugKey();
+
+    switch (Type) {
+    case UNPLUG_DISKS:
+        ValueName = "DISKS";
+        break;
+    case UNPLUG_NICS:
+        ValueName = "NICS";
+        break;
+    default:
+        ValueName = NULL;
+        ASSERT(FALSE);
+    }
+
+    status = RegistryQueryDwordValue(UnplugKey,
+                                     ValueName,
+                                     (PULONG)&Value);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (--Value < 0)
+        goto fail2;
+
+    status = RegistryUpdateDwordValue(UnplugKey,
+                                      ValueName,
+                                      (ULONG)Value);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Info("%s %u\n", ValueName, (ULONG)Value);
+
+    return STATUS_SUCCESS;
+
+fail3:
+    Error("fail3\n");
+
+fail2:
+    Error("fail2\n");
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+XEN_API
+VOID
+UnplugDevices(
+    VOID
+    )
+{
+    PUNPLUG_CONTEXT Context = &UnplugContext;
+    UNPLUG_TYPE     Type;
+    KIRQL           Irql;
+    NTSTATUS        status;
+
+    AcquireHighLock(&Context->Lock, &Irql);
+
+    status = UnplugPreamble();
+    ASSERT(NT_SUCCESS(status));
+
+    for (Type = 0; Type < UNPLUG_TYPE_COUNT; Type++) {
+        if (Context->Request[Type])
+            UnplugDeviceType(Type);
+    }
+
+    ReleaseHighLock(&Context->Lock, Irql);
+}
+
+NTSTATUS
+UnplugInitialize(
+    VOID
+    )
+{
+    PUNPLUG_CONTEXT Context = &UnplugContext;
+    LONG            References;
+    UNPLUG_TYPE     Type;
+    NTSTATUS        status;
+
+    References = InterlockedIncrement(&Context->References);
+
+    status = STATUS_OBJECTID_EXISTS;
+    if (References != 1)
+        goto fail1;
+
+    InitializeHighLock(&Context->Lock);
+
+    for (Type = 0; Type < UNPLUG_TYPE_COUNT; Type++)
+        UnplugSetRequest(Type);
+
+    UnplugSetBootEmulated();
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    (VOID) InterlockedDecrement(&Context->References);
+
+    ASSERT(IsZeroMemory(Context, sizeof (UNPLUG_CONTEXT)));
+
+    return status;
+}
+
+VOID
+UnplugTeardown(
+    VOID
+    )
+{
+    PUNPLUG_CONTEXT Context = &UnplugContext;
+    UNPLUG_TYPE     Type;
+
+    Context->BootEmulated = FALSE;
+
+    for (Type = 0; Type < UNPLUG_TYPE_COUNT; Type++)
+        Context->Request[Type] = FALSE;
+
+    RtlZeroMemory(&Context->Lock, sizeof (HIGH_LOCK));
+
+    (VOID) InterlockedDecrement(&Context->References);
+
+    ASSERT(IsZeroMemory(Context, sizeof (UNPLUG_CONTEXT)));
+}
diff --git a/src/xen/unplug.h b/src/xen/unplug.h
new file mode 100644
index 0000000..bd8e67c
--- /dev/null
+++ b/src/xen/unplug.h
@@ -0,0 +1,48 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XEN_UNPLUG_H
+#define _XEN_UNPLUG_H
+
+#include <ntddk.h>
+#include <xen.h>
+
+extern NTSTATUS
+UnplugInitialize(
+    VOID
+    );
+
+extern VOID
+UnplugTeardown(
+    VOID
+    );
+
+#endif  // _XEN_UNPLUG_H
diff --git a/src/xenbus.inf b/src/xenbus.inf
index 90dcf64..7f9370f 100644
--- a/src/xenbus.inf
+++ b/src/xenbus.inf
@@ -71,8 +71,8 @@ xenbus_coinst_@MAJOR_VERSION@_@MINOR_VERSION@_@MICRO_VERSION@_@BUILD_NUMBER@.dll
 [XenBus_Inst] 
 CopyFiles=XenBus_Copyfiles
 
-[XenBus_Inst.Services] 
-AddService=xenbus,0x02,XenBus_Service,
+[XenBus_Inst.Services]
+AddService=xenbus,0x02,XenBus_Service
 AddService=xenfilt,,XenFilt_Service,
 
 [XenBus_Service] 
@@ -82,16 +82,13 @@ StartType=%SERVICE_BOOT_START%
 ErrorControl=%SERVICE_ERROR_NORMAL% 
 ServiceBinary=%12%\xenbus.sys 
 LoadOrderGroup="Boot Bus Extender"
-AddReg = XenBus_Parameters, XenBus_Interfaces, XenBus_Interrupts
+AddReg = XenBus_Parameters, XenBus_Interrupts
 
 [XenBus_Parameters]
 HKR,"Parameters",,0x00000010
 HKR,"Parameters","SupportedClasses",0x00010000,"VIF","VBD","IFACE"
 HKR,"Parameters","SyntheticClasses",0x00010000,"IFACE"
 
-[XenBus_Interfaces]
-HKR,"Interfaces",,0x00000010
-
 [XenBus_Interrupts]
 HKR,"Interrupt Management",,0x00000010
 HKR,"Interrupt Management\MessageSignaledInterruptProperties",,0x00000010
@@ -105,19 +102,13 @@ StartType=%SERVICE_BOOT_START%
 ErrorControl=%SERVICE_ERROR_NORMAL% 
 ServiceBinary=%12%\xenfilt.sys 
 LoadOrderGroup="Boot Bus Extender"
-AddReg = XenFilt_Parameters, XenFilt_Unplug, XenFilt_Interfaces
+AddReg = XenFilt_Parameters
 
 [XenFilt_Parameters]
 HKR,"Parameters",,0x00000010
 HKR,"Parameters","ACPI\PNP0A03",0x00000000,"DEVICE"
 HKR,"Parameters","PCIIDE\IDEChannel",0x00000000,"DISK"
 
-[XenFilt_Unplug]
-HKR,"Unplug",,0x00000010
-
-[XenFilt_Interfaces]
-HKR,"Interfaces",,0x00000010
-
 [XenBus_Inst.CoInstallers]
 CopyFiles=CoInst_CopyFiles
 AddReg=CoInst_AddReg
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 8208111..e8a6f22 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -38,8 +38,6 @@
 #include <stdlib.h>
 #include <xen.h>
 
-#include <unplug_interface.h>
-
 #include "names.h"
 #include "registry.h"
 #include "fdo.h"
@@ -58,6 +56,7 @@
 #include "balloon.h"
 #include "driver.h"
 #include "range_set.h"
+#include "unplug.h"
 #include "dbg_print.h"
 #include "assert.h"
 #include "util.h"
@@ -122,6 +121,7 @@ struct _XENBUS_FDO {
     PXENBUS_RANGE_SET_CONTEXT       RangeSetContext;
     PXENBUS_CACHE_CONTEXT           CacheContext;
     PXENBUS_GNTTAB_CONTEXT          GnttabContext;
+    PXENBUS_UNPLUG_CONTEXT          UnplugContext;
     PXENBUS_BALLOON_CONTEXT         BalloonContext;
 
     XENBUS_DEBUG_INTERFACE          DebugInterface;
@@ -130,7 +130,6 @@ struct _XENBUS_FDO {
     XENBUS_STORE_INTERFACE          StoreInterface;
     XENBUS_RANGE_SET_INTERFACE      RangeSetInterface;
     XENBUS_BALLOON_INTERFACE        BalloonInterface;
-    XENFILT_UNPLUG_INTERFACE        UnplugInterface;
 
     PXENBUS_RANGE_SET               RangeSet;
     LIST_ENTRY                      List;
@@ -548,6 +547,7 @@ DEFINE_FDO_GET_CONTEXT(Store, PXENBUS_STORE_CONTEXT)
 DEFINE_FDO_GET_CONTEXT(RangeSet, PXENBUS_RANGE_SET_CONTEXT)
 DEFINE_FDO_GET_CONTEXT(Cache, PXENBUS_CACHE_CONTEXT)
 DEFINE_FDO_GET_CONTEXT(Gnttab, PXENBUS_GNTTAB_CONTEXT)
+DEFINE_FDO_GET_CONTEXT(Unplug, PXENBUS_UNPLUG_CONTEXT)
 DEFINE_FDO_GET_CONTEXT(Balloon, PXENBUS_BALLOON_CONTEXT)
 
 __drv_functionClass(IO_COMPLETION_ROUTINE)
@@ -2508,15 +2508,9 @@ FdoD3ToD0(
             goto fail7;
     }
 
-    if (Fdo->UnplugInterface.Interface.Context != NULL) {
-        status = XENFILT_UNPLUG(Acquire, &Fdo->UnplugInterface);
-        if (!NT_SUCCESS(status))
-            goto fail8;
-    }
-
     status = __FdoD3ToD0(Fdo);
     if (!NT_SUCCESS(status))
-        goto fail9;
+        goto fail8;
 
     status = XENBUS_SUSPEND(Register,
                             &Fdo->SuspendInterface,
@@ -2525,7 +2519,7 @@ FdoD3ToD0(
                             Fdo,
                             &Fdo->SuspendCallbackLate);
     if (!NT_SUCCESS(status))
-        goto fail10;
+        goto fail9;
 
     KeLowerIrql(Irql);
 
@@ -2556,16 +2550,10 @@ not_active:
 
     return STATUS_SUCCESS;
 
-fail10:
-    Error("fail10\n");
-
-    __FdoD0ToD3(Fdo);
-
 fail9:
     Error("fail9\n");
 
-    if (Fdo->UnplugInterface.Interface.Context != NULL)
-        XENFILT_UNPLUG(Release, &Fdo->UnplugInterface);
+    __FdoD0ToD3(Fdo);
 
 fail8:
     Error("fail8\n");
@@ -2692,9 +2680,6 @@ FdoD0ToD3(
 
     __FdoD0ToD3(Fdo);
 
-    if (Fdo->UnplugInterface.Interface.Context != NULL)
-        XENFILT_UNPLUG(Release, &Fdo->UnplugInterface);
-
     if (Fdo->BalloonInterface.Interface.Context != NULL)
         XENBUS_BALLOON(Release, &Fdo->BalloonInterface);
 
@@ -2733,8 +2718,7 @@ FdoS4ToS3(
 
     HypercallPopulate();
 
-    if (Fdo->UnplugInterface.Interface.Context != NULL)
-        XENFILT_UNPLUG(Replay, &Fdo->UnplugInterface);
+    UnplugDevices();
 
     KeLowerIrql(Irql);
 
@@ -4471,15 +4455,6 @@ fail1:
                       (_Size),                                                          \
                       (_Optional))
 
-VOID
-FdoGetUnplugInterface(
-    IN  PXENBUS_FDO                 Fdo,
-    OUT PXENFILT_UNPLUG_INTERFACE   UnplugInterface
-    )
-{
-    *UnplugInterface = Fdo->UnplugInterface;
-}
-
 static BOOLEAN
 FdoIsBalloonEnabled(
     IN  PXENBUS_FDO Fdo
@@ -4581,44 +4556,39 @@ FdoCreate(
     if (!__FdoIsActive(Fdo))
         goto done;
 
-    status = FDO_QUERY_INTERFACE(Fdo,
-                                 XENFILT,
-                                 UNPLUG,
-                                 (PINTERFACE)&Fdo->UnplugInterface,
-                                 sizeof (Fdo->UnplugInterface),
-                                 TRUE);
+    status = DebugInitialize(Fdo, &Fdo->DebugContext);
     if (!NT_SUCCESS(status))
         goto fail7;
 
-    status = DebugInitialize(Fdo, &Fdo->DebugContext);
+    status = SuspendInitialize(Fdo, &Fdo->SuspendContext);
     if (!NT_SUCCESS(status))
         goto fail8;
 
-    status = SuspendInitialize(Fdo, &Fdo->SuspendContext);
+    status = SharedInfoInitialize(Fdo, &Fdo->SharedInfoContext);
     if (!NT_SUCCESS(status))
         goto fail9;
 
-    status = SharedInfoInitialize(Fdo, &Fdo->SharedInfoContext);
+    status = EvtchnInitialize(Fdo, &Fdo->EvtchnContext);
     if (!NT_SUCCESS(status))
         goto fail10;
 
-    status = EvtchnInitialize(Fdo, &Fdo->EvtchnContext);
+    status = StoreInitialize(Fdo, &Fdo->StoreContext);
     if (!NT_SUCCESS(status))
         goto fail11;
 
-    status = StoreInitialize(Fdo, &Fdo->StoreContext);
+    status = RangeSetInitialize(Fdo, &Fdo->RangeSetContext);
     if (!NT_SUCCESS(status))
         goto fail12;
 
-    status = RangeSetInitialize(Fdo, &Fdo->RangeSetContext);
+    status = CacheInitialize(Fdo, &Fdo->CacheContext);
     if (!NT_SUCCESS(status))
         goto fail13;
 
-    status = CacheInitialize(Fdo, &Fdo->CacheContext);
+    status = GnttabInitialize(Fdo, &Fdo->GnttabContext);
     if (!NT_SUCCESS(status))
         goto fail14;
 
-    status = GnttabInitialize(Fdo, &Fdo->GnttabContext);
+    status = UnplugInitialize(Fdo, &Fdo->UnplugContext);
     if (!NT_SUCCESS(status))
         goto fail15;
 
@@ -4687,56 +4657,56 @@ done:
 fail16:
     Error("fail16\n");
 
-    GnttabTeardown(Fdo->GnttabContext);
-    Fdo->GnttabContext = NULL;
+    UnplugTeardown(Fdo->UnplugContext);
+    Fdo->UnplugContext = NULL;
 
 fail15:
     Error("fail15\n");
 
-    CacheTeardown(Fdo->CacheContext);
-    Fdo->CacheContext = NULL;
+    GnttabTeardown(Fdo->GnttabContext);
+    Fdo->GnttabContext = NULL;
 
 fail14:
     Error("fail14\n");
 
-    RangeSetTeardown(Fdo->RangeSetContext);
-    Fdo->RangeSetContext = NULL;
+    CacheTeardown(Fdo->CacheContext);
+    Fdo->CacheContext = NULL;
 
 fail13:
     Error("fail13\n");
 
-    StoreTeardown(Fdo->StoreContext);
-    Fdo->StoreContext = NULL;
+    RangeSetTeardown(Fdo->RangeSetContext);
+    Fdo->RangeSetContext = NULL;
 
 fail12:
     Error("fail12\n");
 
-    EvtchnTeardown(Fdo->EvtchnContext);
-    Fdo->EvtchnContext = NULL;
+    StoreTeardown(Fdo->StoreContext);
+    Fdo->StoreContext = NULL;
 
 fail11:
     Error("fail11\n");
 
-    SharedInfoTeardown(Fdo->SharedInfoContext);
-    Fdo->SharedInfoContext = NULL;
+    EvtchnTeardown(Fdo->EvtchnContext);
+    Fdo->EvtchnContext = NULL;
 
 fail10:
     Error("fail10\n");
 
-    SuspendTeardown(Fdo->SuspendContext);
-    Fdo->SuspendContext = NULL;
+    SharedInfoTeardown(Fdo->SharedInfoContext);
+    Fdo->SharedInfoContext = NULL;
 
 fail9:
     Error("fail9\n");
 
-    DebugTeardown(Fdo->DebugContext);
-    Fdo->DebugContext = NULL;
+    SuspendTeardown(Fdo->SuspendContext);
+    Fdo->SuspendContext = NULL;
 
 fail8:
     Error("fail8\n");
 
-    RtlZeroMemory(&Fdo->UnplugInterface,
-                  sizeof (XENFILT_UNPLUG_INTERFACE));
+    DebugTeardown(Fdo->DebugContext);
+    Fdo->DebugContext = NULL;
 
 fail7:
     Error("fail7\n");
@@ -4834,6 +4804,9 @@ FdoDestroy(
             Fdo->BalloonContext = NULL;
         }
 
+        UnplugTeardown(Fdo->UnplugContext);
+        Fdo->UnplugContext = NULL;
+
         GnttabTeardown(Fdo->GnttabContext);
         Fdo->GnttabContext = NULL;
 
@@ -4858,9 +4831,6 @@ FdoDestroy(
         DebugTeardown(Fdo->DebugContext);
         Fdo->DebugContext = NULL;
 
-        RtlZeroMemory(&Fdo->UnplugInterface,
-                      sizeof (XENFILT_UNPLUG_INTERFACE));
-
         __FdoSetActive(Fdo, FALSE);
     }
 
diff --git a/src/xenbus/fdo.h b/src/xenbus/fdo.h
index 4b99ba0..1feef17 100644
--- a/src/xenbus/fdo.h
+++ b/src/xenbus/fdo.h
@@ -33,7 +33,6 @@
 #define _XENBUS_FDO_H
 
 #include <ntddk.h>
-#include <unplug_interface.h>
 
 #include "driver.h"
 #include "types.h"
@@ -249,10 +248,11 @@ FdoGetGnttabContext(
     IN  PXENBUS_FDO Fdo
     );
 
-extern VOID
-FdoGetUnplugInterface(
-    IN  PXENBUS_FDO                 Fdo,
-    OUT PXENFILT_UNPLUG_INTERFACE   UnplugInterface
+#include "unplug.h"
+
+extern PXENBUS_UNPLUG_CONTEXT
+FdoGetUnplugContext(
+    IN  PXENBUS_FDO Fdo
     );
 
 extern NTSTATUS
diff --git a/src/xenbus/pdo.c b/src/xenbus/pdo.c
index f305bb7..8e7f90a 100644
--- a/src/xenbus/pdo.c
+++ b/src/xenbus/pdo.c
@@ -362,11 +362,12 @@ typedef struct _XENBUS_PDO_REVISION {
     ULONG   RangeSetInterfaceVersion;
     ULONG   CacheInterfaceVersion;
     ULONG   GnttabInterfaceVersion;
+    ULONG   UnplugInterfaceVersion;
     ULONG   EmulatedInterfaceVersion;
 } XENBUS_PDO_REVISION, *PXENBUS_PDO_REVISION;
 
-#define DEFINE_REVISION(_N, _S, _SI, _E, _D, _ST, _R, _C, _G, _EM) \
-    { (_N), (_S), (_SI), (_E), (_D), (_ST), (_R), (_C), (_G), (_EM) }
+#define DEFINE_REVISION(_N, _S, _SI, _E, _D, _ST, _R, _C, _G, _U, _EM) \
+    { (_N), (_S), (_SI), (_E), (_D), (_ST), (_R), (_C), (_G), (_U), (_EM) }
 
 static XENBUS_PDO_REVISION PdoRevision[] = {
     DEFINE_REVISION_TABLE
@@ -426,6 +427,11 @@ PdoDumpRevisions(
         ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
                      Revision->GnttabInterfaceVersion == XENBUS_GNTTAB_INTERFACE_VERSION_MAX));
 
+        ASSERT3U(Revision->UnplugInterfaceVersion, >=, XENBUS_UNPLUG_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->UnplugInterfaceVersion, <=, XENBUS_UNPLUG_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->UnplugInterfaceVersion == XENBUS_UNPLUG_INTERFACE_VERSION_MAX));
+
         ASSERT3U(Revision->EmulatedInterfaceVersion, >=, XENFILT_EMULATED_INTERFACE_VERSION_MIN);
         ASSERT3U(Revision->EmulatedInterfaceVersion, <=, XENFILT_EMULATED_INTERFACE_VERSION_MAX);
         ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
@@ -442,6 +448,7 @@ PdoDumpRevisions(
              "RANGE_SET v%u "
              "CACHE v%u "
              "GNTTAB v%u "
+             "UNPLUG v%u\n"
              "EMULATED v%u\n",
              Revision->Number,
              Revision->SuspendInterfaceVersion,
@@ -452,6 +459,7 @@ PdoDumpRevisions(
              Revision->RangeSetInterfaceVersion,
              Revision->CacheInterfaceVersion,
              Revision->GnttabInterfaceVersion,
+             Revision->UnplugInterfaceVersion,
              Revision->EmulatedInterfaceVersion);
     }
 }
@@ -1010,6 +1018,7 @@ DEFINE_PDO_QUERY_INTERFACE(Store)
 DEFINE_PDO_QUERY_INTERFACE(RangeSet)
 DEFINE_PDO_QUERY_INTERFACE(Cache)
 DEFINE_PDO_QUERY_INTERFACE(Gnttab)
+DEFINE_PDO_QUERY_INTERFACE(Unplug)
 
 struct _INTERFACE_ENTRY {
     const GUID  *Guid;
@@ -1027,6 +1036,7 @@ static struct _INTERFACE_ENTRY PdoInterfaceTable[] = {
     { &GUID_XENBUS_RANGE_SET_INTERFACE, "RANGE_SET_INTERFACE", PdoQueryRangeSetInterface },
     { &GUID_XENBUS_CACHE_INTERFACE, "CACHE_INTERFACE", PdoQueryCacheInterface },
     { &GUID_XENBUS_GNTTAB_INTERFACE, "GNTTAB_INTERFACE", PdoQueryGnttabInterface },
+    { &GUID_XENBUS_UNPLUG_INTERFACE, "UNPLUG_INTERFACE", PdoQueryUnplugInterface },
     { &GUID_XENFILT_EMULATED_INTERFACE, "EMULATED_INTERFACE", PdoDelegateIrp },
     { NULL, NULL, NULL }
 };
diff --git a/src/xenbus/suspend.c b/src/xenbus/suspend.c
index b826795..fad35e4 100644
--- a/src/xenbus/suspend.c
+++ b/src/xenbus/suspend.c
@@ -33,8 +33,6 @@
 #include <stdarg.h>
 #include <xen.h>
 
-#include <unplug_interface.h>
-
 #include "suspend.h"
 #include "thread.h"
 #include "fdo.h"
@@ -58,7 +56,6 @@ struct _XENBUS_SUSPEND_CONTEXT {
     LIST_ENTRY                  LateList;
     XENBUS_DEBUG_INTERFACE      DebugInterface;
     PXENBUS_DEBUG_CALLBACK      DebugCallback;
-    XENFILT_UNPLUG_INTERFACE    UnplugInterface;
 };
 
 #define XENBUS_SUSPEND_TAG  'PSUS'
@@ -153,10 +150,6 @@ SuspendTrigger(
     KIRQL                   Irql;
     NTSTATUS                status;
 
-    status = STATUS_NOT_SUPPORTED;
-    if (Context->UnplugInterface.Interface.Context == NULL)
-        goto fail1;
-
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
     LogPrintf(LOG_LEVEL_INFO,
@@ -179,7 +172,7 @@ SuspendTrigger(
 
         HypercallPopulate();
 
-        XENFILT_UNPLUG(Replay, &Context->UnplugInterface);
+        UnplugDevices();
 
         for (ListEntry = Context->EarlyList.Flink;
              ListEntry != &Context->EarlyList;
@@ -216,11 +209,6 @@ SuspendTrigger(
     KeLowerIrql(Irql);
 
     return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return status;
 }
 
 static ULONG
@@ -338,13 +326,6 @@ SuspendAcquire(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    if (Context->UnplugInterface.Interface.Context != NULL) {
-        status = XENFILT_UNPLUG(Acquire, &Context->UnplugInterface);
-
-        if (!NT_SUCCESS(status))
-            goto fail3;
-    }
-
     Trace("<====\n");
 
 done:
@@ -352,14 +333,6 @@ done:
 
     return STATUS_SUCCESS;
 
-fail3:
-    Error("fail3\n");
-
-    XENBUS_DEBUG(Deregister,
-                 &Context->DebugInterface,
-                 Context->DebugCallback);
-    Context->DebugCallback = NULL;
-
 fail2:
     Error("fail2\n");
 
@@ -396,9 +369,6 @@ SuspendRelease(
 
     Context->Count = 0;
 
-    if (Context->UnplugInterface.Interface.Context != NULL)
-        XENFILT_UNPLUG(Release, &Context->UnplugInterface);
-
     XENBUS_DEBUG(Deregister,
                  &Context->DebugInterface,
                  Context->DebugCallback);
@@ -444,8 +414,6 @@ SuspendInitialize(
                                sizeof ((*Context)->DebugInterface));
     ASSERT(NT_SUCCESS(status));
 
-    FdoGetUnplugInterface(Fdo, &(*Context)->UnplugInterface);
-
     InitializeListHead(&(*Context)->EarlyList);
     InitializeListHead(&(*Context)->LateList);
     KeInitializeSpinLock(&(*Context)->Lock);
@@ -509,9 +477,6 @@ SuspendTeardown(
 
     Context->Fdo = NULL;
 
-    RtlZeroMemory(&Context->UnplugInterface,
-                  sizeof (XENFILT_UNPLUG_INTERFACE));
-
     RtlZeroMemory(&Context->DebugInterface,
                   sizeof (XENBUS_DEBUG_INTERFACE));
 
diff --git a/src/xenbus/unplug.c b/src/xenbus/unplug.c
new file mode 100644
index 0000000..0a1b27a
--- /dev/null
+++ b/src/xenbus/unplug.c
@@ -0,0 +1,241 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <ntddk.h>
+#include <ntstrsafe.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <xen.h>
+
+#include "unplug.h"
+#include "fdo.h"
+#include "mutex.h"
+#include "dbg_print.h"
+#include "assert.h"
+#include "util.h"
+
+struct _XENBUS_UNPLUG_CONTEXT {
+    KSPIN_LOCK  Lock;
+    LONG        References;
+    MUTEX       Mutex;
+};
+
+#define XENBUS_UNPLUG_TAG    'LPNU'
+
+static FORCEINLINE PVOID
+__UnplugAllocate(
+    IN  ULONG   Length
+    )
+{
+    return __AllocatePoolWithTag(NonPagedPool, Length, XENBUS_UNPLUG_TAG);
+}
+
+static FORCEINLINE VOID
+__UnplugFree(
+    IN  PVOID   Buffer
+    )
+{
+    ExFreePoolWithTag(Buffer, XENBUS_UNPLUG_TAG);
+}
+
+static VOID
+UnplugRequest(
+    IN  PINTERFACE                  Interface,
+    IN  XENBUS_UNPLUG_DEVICE_TYPE   Type,
+    IN  BOOLEAN                     Make
+    )
+{
+    PXENBUS_UNPLUG_CONTEXT          Context = Interface->Context;
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    AcquireMutex(&Context->Mutex);
+
+    switch (Type) {
+    case XENBUS_UNPLUG_DEVICE_TYPE_NICS:
+        Info("NICS (%s)\n", (Make) ? "MAKE" : "REVOKE");
+
+        if (Make)
+            (VOID) UnplugIncrementValue(UNPLUG_NICS);
+        else
+            (VOID) UnplugDecrementValue(UNPLUG_NICS);
+
+        break;
+
+    case XENBUS_UNPLUG_DEVICE_TYPE_DISKS:
+        Info("DISKS (%s)\n", (Make) ? "MAKE" : "REVOKE");
+
+        if (Make)
+            (VOID) UnplugIncrementValue(UNPLUG_DISKS);
+        else
+            (VOID) UnplugDecrementValue(UNPLUG_DISKS);
+
+        break;
+
+    default:
+        ASSERT(FALSE);
+        break;
+    }
+
+    ReleaseMutex(&Context->Mutex);
+}
+
+static NTSTATUS
+UnplugAcquire(
+    IN  PINTERFACE          Interface
+    )
+{
+    PXENBUS_UNPLUG_CONTEXT  Context = Interface->Context;
+    KIRQL                   Irql;
+
+    KeAcquireSpinLock(&Context->Lock, &Irql);
+
+    if (Context->References++ != 0)
+        goto done;
+
+    Trace("<===>\n");
+
+done:
+    KeReleaseSpinLock(&Context->Lock, Irql);
+
+    return STATUS_SUCCESS;
+}
+
+static VOID
+UnplugRelease(
+    IN  PINTERFACE          Interface
+    )
+{
+    PXENBUS_UNPLUG_CONTEXT  Context = Interface->Context;
+    KIRQL                   Irql;
+
+    KeAcquireSpinLock(&Context->Lock, &Irql);
+
+    if (--Context->References > 0)
+        goto done;
+
+    Trace("<===>\n");
+
+done:
+    KeReleaseSpinLock(&Context->Lock, Irql);
+}
+
+static struct _XENBUS_UNPLUG_INTERFACE_V1 UnplugInterfaceVersion1 = {
+    { sizeof (struct _XENBUS_UNPLUG_INTERFACE_V1), 1, NULL, NULL, NULL },
+    UnplugAcquire,
+    UnplugRelease,
+    UnplugRequest
+};
+
+NTSTATUS
+UnplugInitialize(
+    IN  PXENBUS_FDO             Fdo,
+    OUT PXENBUS_UNPLUG_CONTEXT  *Context
+    )
+{
+    NTSTATUS                    status;
+
+    UNREFERENCED_PARAMETER(Fdo);
+
+    Trace("====>\n");
+
+    *Context = __UnplugAllocate(sizeof (XENBUS_UNPLUG_CONTEXT));
+
+    status = STATUS_NO_MEMORY;
+    if (*Context == NULL)
+        goto fail1;
+
+    KeInitializeSpinLock(&(*Context)->Lock);
+    InitializeMutex(&(*Context)->Mutex);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+NTSTATUS
+UnplugGetInterface(
+    IN      PXENBUS_UNPLUG_CONTEXT  Context,
+    IN      ULONG                   Version,
+    IN OUT  PINTERFACE              Interface,
+    IN      ULONG                   Size
+    )
+{
+    NTSTATUS                        status;
+
+    ASSERT(Context != NULL);
+
+    switch (Version) {
+    case 1: {
+        struct _XENBUS_UNPLUG_INTERFACE_V1   *UnplugInterface;
+
+        UnplugInterface = (struct _XENBUS_UNPLUG_INTERFACE_V1 *)Interface;
+
+        status = STATUS_BUFFER_OVERFLOW;
+        if (Size < sizeof (struct _XENBUS_UNPLUG_INTERFACE_V1))
+            break;
+
+        *UnplugInterface = UnplugInterfaceVersion1;
+
+        ASSERT3U(Interface->Version, ==, Version);
+        Interface->Context = Context;
+
+        status = STATUS_SUCCESS;
+        break;
+    }
+    default:
+        status = STATUS_NOT_SUPPORTED;
+        break;
+    }
+
+    return status;
+}
+
+VOID
+UnplugTeardown(
+    IN  PXENBUS_UNPLUG_CONTEXT  Context
+    )
+{
+    Trace("====>\n");
+
+    RtlZeroMemory(&Context->Mutex, sizeof (MUTEX));
+    RtlZeroMemory(&Context->Lock, sizeof (KSPIN_LOCK));
+
+    ASSERT(IsZeroMemory(Context, sizeof (XENBUS_UNPLUG_CONTEXT)));
+    __UnplugFree(Context);
+
+    Trace("<====\n");
+}
diff --git a/src/xenbus/unplug.h b/src/xenbus/unplug.h
new file mode 100644
index 0000000..416b2d4
--- /dev/null
+++ b/src/xenbus/unplug.h
@@ -0,0 +1,62 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XENBUS_UNPLUG_H
+#define _XENBUS_UNPLUG_H
+
+#include <ntddk.h>
+#include <xen.h>
+#include <unplug_interface.h>
+
+typedef struct _XENBUS_UNPLUG_CONTEXT  XENBUS_UNPLUG_CONTEXT, *PXENBUS_UNPLUG_CONTEXT;
+
+#include "fdo.h"
+
+extern NTSTATUS
+UnplugInitialize(
+    IN  PXENBUS_FDO             Fdo,
+    OUT PXENBUS_UNPLUG_CONTEXT  *Context
+    );
+
+extern NTSTATUS
+UnplugGetInterface(
+    IN      PXENBUS_UNPLUG_CONTEXT  Context,
+    IN      ULONG                   Version,
+    IN OUT  PINTERFACE              Interface,
+    IN      ULONG                   Size
+    );
+
+extern VOID
+UnplugTeardown(
+    IN  PXENBUS_UNPLUG_CONTEXT   Context
+    );
+
+#endif  // _XENBUS_UNPLUG_H
diff --git a/src/xenfilt/driver.c b/src/xenfilt/driver.c
index 16ed6f7..f0ffac0 100644
--- a/src/xenfilt/driver.c
+++ b/src/xenfilt/driver.c
@@ -38,7 +38,6 @@
 #include "pdo.h"
 #include "driver.h"
 #include "emulated.h"
-#include "unplug.h"
 #include "mutex.h"
 #include "dbg_print.h"
 #include "assert.h"
@@ -50,7 +49,6 @@ extern PULONG       InitSafeBootMode;
 typedef struct _XENFILT_DRIVER {
     PDRIVER_OBJECT              DriverObject;
     HANDLE                      ParametersKey;
-    HANDLE                      UnplugKey;
 
     PCHAR                       ActiveDeviceID;
     PCHAR                       ActiveInstanceID;
@@ -61,12 +59,7 @@ typedef struct _XENFILT_DRIVER {
     XENFILT_FILTER_STATE        FilterState;
 
     PXENFILT_EMULATED_CONTEXT   EmulatedContext;
-    PXENFILT_UNPLUG_CONTEXT     UnplugContext;
-
     XENFILT_EMULATED_INTERFACE  EmulatedInterface;
-    XENFILT_UNPLUG_INTERFACE    UnplugInterface;
-
-    BOOLEAN                     UnplugAcquired;
 } XENFILT_DRIVER, *PXENFILT_DRIVER;
 
 static XENFILT_DRIVER   Driver;
@@ -138,27 +131,27 @@ DriverGetParametersKey(
 }
 
 static FORCEINLINE VOID
-__DriverSetUnplugKey(
-    IN  HANDLE  Key
+__DriverSetEmulatedContext(
+    IN  PXENFILT_EMULATED_CONTEXT   Context
     )
 {
-    Driver.UnplugKey = Key;
+    Driver.EmulatedContext = Context;
 }
 
-static FORCEINLINE HANDLE
-__DriverGetUnplugKey(
+static FORCEINLINE PXENFILT_EMULATED_CONTEXT
+__DriverGetEmulatedContext(
     VOID
     )
 {
-    return Driver.UnplugKey;
+    return Driver.EmulatedContext;
 }
 
-HANDLE
-DriverGetUnplugKey(
+PXENFILT_EMULATED_CONTEXT
+DriverGetEmulatedContext(
     VOID
     )
 {
-    return __DriverGetUnplugKey();
+    return __DriverGetEmulatedContext();
 }
 
 static FORCEINLINE VOID
@@ -226,26 +219,6 @@ DriverRemoveFunctionDeviceObject(
     --Driver.References;
 }
 
-#define DEFINE_DRIVER_GET_CONTEXT(_Interface, _Type)            \
-static FORCEINLINE _Type                                        \
-__DriverGet ## _Interface ## Context(                           \
-    VOID                                                        \
-    )                                                           \
-{                                                               \
-    return Driver. ## _Interface ## Context;                    \
-}                                                               \
-                                                                \
-_Type                                                           \
-DriverGet ## _Interface ## Context(                             \
-    VOID                                                        \
-    )                                                           \
-{                                                               \
-    return __DriverGet ## _Interface ## Context();              \
-}
-
-DEFINE_DRIVER_GET_CONTEXT(Emulated, PXENFILT_EMULATED_CONTEXT)
-DEFINE_DRIVER_GET_CONTEXT(Unplug, PXENFILT_UNPLUG_CONTEXT)
-
 #define SERVICES_KEY L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services"
 
 #define SERVICE_KEY(_Driver)    \
@@ -387,7 +360,6 @@ DriverSetFilterState(
     case XENFILT_FILTER_ENABLED: {
         PLIST_ENTRY ListEntry;
         BOOLEAN     Present;
-        NTSTATUS    status;
 
         // Assume all FDOs have enumerated until we know otherwise
         Driver.FilterState = XENFILT_FILTER_PENDING;
@@ -414,10 +386,8 @@ DriverSetFilterState(
 
         Info("ACTIVE DEVICE %sPRESENT\n", (!Present) ? "NOT " : "");
 
-        if (Present) {
-            status = XENFILT_UNPLUG(Acquire, &Driver.UnplugInterface);
-            Driver.UnplugAcquired = NT_SUCCESS(status) ? TRUE : FALSE;
-        }
+        if (Present)
+            UnplugDevices();
 
         Info("PENDING\n");
         break;
@@ -461,7 +431,6 @@ DriverUnload(
     )
 {
     HANDLE              ParametersKey;
-    HANDLE              UnplugKey;
 
     ASSERT3P(DriverObject, ==, __DriverGetDriverObject());
 
@@ -477,23 +446,11 @@ DriverUnload(
     RtlZeroMemory(&Driver.List, sizeof (LIST_ENTRY));
     RtlZeroMemory(&Driver.Mutex, sizeof (MUTEX));
 
-    if (Driver.UnplugAcquired) {
-        XENFILT_UNPLUG(Release, &Driver.UnplugInterface);
-
-        Driver.UnplugAcquired = FALSE;
-    }
-
     XENFILT_EMULATED(Release, &Driver.EmulatedInterface);
 
-    RtlZeroMemory(&Driver.UnplugInterface,
-                  sizeof (XENFILT_UNPLUG_INTERFACE));
-
     RtlZeroMemory(&Driver.EmulatedInterface,
                   sizeof (XENFILT_EMULATED_INTERFACE));
 
-    UnplugTeardown(Driver.UnplugContext);
-    Driver.UnplugContext = NULL;
-
     EmulatedTeardown(Driver.EmulatedContext);
     Driver.EmulatedContext = NULL;
 
@@ -505,10 +462,6 @@ DriverUnload(
         Driver.ActiveInstanceID = NULL;
     }
 
-    UnplugKey = __DriverGetUnplugKey();
-    __DriverSetUnplugKey(NULL);
-    RegistryCloseKey(UnplugKey);
-
     ParametersKey = __DriverGetParametersKey();
     __DriverSetParametersKey(NULL);
     RegistryCloseKey(ParametersKey);
@@ -763,15 +716,15 @@ DRIVER_INITIALIZE   DriverEntry;
 
 NTSTATUS
 DriverEntry(
-    IN  PDRIVER_OBJECT  DriverObject,
-    IN  PUNICODE_STRING RegistryPath
+    IN  PDRIVER_OBJECT          DriverObject,
+    IN  PUNICODE_STRING         RegistryPath
     )
 {
-    HANDLE              ServiceKey;
-    HANDLE              ParametersKey;
-    HANDLE              UnplugKey;
-    ULONG               Index;
-    NTSTATUS            status;
+    HANDLE                      ServiceKey;
+    HANDLE                      ParametersKey;
+    PXENFILT_EMULATED_CONTEXT   EmulatedContext;
+    ULONG                       Index;
+    NTSTATUS                    status;
 
     ASSERT3P(__DriverGetDriverObject(), ==, NULL);
 
@@ -820,23 +773,15 @@ DriverEntry(
 
     __DriverSetParametersKey(ParametersKey);
 
-    status = RegistryOpenSubKey(ServiceKey, "Unplug", KEY_READ, &UnplugKey);
+    status = DriverSetActiveDeviceInstance();
     if (!NT_SUCCESS(status))
         goto fail4;
 
-    __DriverSetUnplugKey(UnplugKey);
-
-    status = DriverSetActiveDeviceInstance();
+    status = EmulatedInitialize(&EmulatedContext);
     if (!NT_SUCCESS(status))
         goto fail5;
 
-    status = EmulatedInitialize(&Driver.EmulatedContext);
-    if (!NT_SUCCESS(status))
-        goto fail6;
-
-    status = UnplugInitialize(&Driver.UnplugContext);
-    if (!NT_SUCCESS(status))
-        goto fail7;
+    __DriverSetEmulatedContext(EmulatedContext);
 
     status = EmulatedGetInterface(__DriverGetEmulatedContext(),
                                   XENFILT_EMULATED_INTERFACE_VERSION_MAX,
@@ -845,16 +790,9 @@ DriverEntry(
     ASSERT(NT_SUCCESS(status));
     ASSERT(Driver.EmulatedInterface.Interface.Context != NULL);
 
-    status = UnplugGetInterface(__DriverGetUnplugContext(),
-                                 XENFILT_UNPLUG_INTERFACE_VERSION_MAX,
-                                 (PINTERFACE)&Driver.UnplugInterface,
-                                 sizeof (Driver.UnplugInterface));
-    ASSERT(NT_SUCCESS(status));
-    ASSERT(Driver.UnplugInterface.Interface.Context != NULL);
-
     status = XENFILT_EMULATED(Acquire, &Driver.EmulatedInterface);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail6;
 
     RegistryCloseKey(ServiceKey);
 
@@ -874,26 +812,14 @@ done:
     Trace("<====\n");
     return STATUS_SUCCESS;
 
-fail8:
-    Error("fail8\n");
-
-    RtlZeroMemory(&Driver.UnplugInterface,
-                  sizeof (XENFILT_UNPLUG_INTERFACE));
-
-    RtlZeroMemory(&Driver.EmulatedInterface,
-                  sizeof (XENFILT_EMULATED_INTERFACE));
-
-    UnplugTeardown(Driver.UnplugContext);
-    Driver.UnplugContext = NULL;
-
-fail7:
-    Error("fail7\n");
+fail6:
+    Error("fail6\n");
 
     EmulatedTeardown(Driver.EmulatedContext);
     Driver.EmulatedContext = NULL;
 
-fail6:
-    Error("fail6\n");
+fail5:
+    Error("fail5\n");
 
     if (Driver.ActiveDeviceID != NULL) {
         __DriverFree(Driver.ActiveDeviceID);
@@ -903,12 +829,6 @@ fail6:
         Driver.ActiveInstanceID = NULL;
     }
 
-fail5:
-    Error("fail5\n");
-
-    __DriverSetUnplugKey(NULL);
-    RegistryCloseKey(UnplugKey);
-
 fail4:
     Error("fail4\n");
 
diff --git a/src/xenfilt/driver.h b/src/xenfilt/driver.h
index 7079d27..f906d36 100644
--- a/src/xenfilt/driver.h
+++ b/src/xenfilt/driver.h
@@ -42,11 +42,6 @@ DriverGetParametersKey(
     VOID
     );
 
-extern HANDLE
-DriverGetUnplugKey(
-    VOID
-    );
-
 extern PCHAR
 DriverGetActiveDeviceID(
     VOID
@@ -90,13 +85,6 @@ DriverGetEmulatedContext(
     VOID
     );
 
-#include "unplug.h"
-
-PXENFILT_UNPLUG_CONTEXT
-DriverGetUnplugContext(
-    VOID
-    );
-
 typedef struct _XENFILT_FDO XENFILT_FDO, *PXENFILT_FDO;
 typedef struct _XENFILT_PDO XENFILT_PDO, *PXENFILT_PDO;
 
diff --git a/src/xenfilt/pdo.c b/src/xenfilt/pdo.c
index 230fdf0..6fab346 100644
--- a/src/xenfilt/pdo.c
+++ b/src/xenfilt/pdo.c
@@ -863,7 +863,6 @@ done:                                                               \
 }                                                                   \
 
 DEFINE_PDO_QUERY_INTERFACE(Emulated)
-DEFINE_PDO_QUERY_INTERFACE(Unplug)
 
 struct _INTERFACE_ENTRY {
     const GUID  *Guid;
@@ -876,7 +875,6 @@ struct _INTERFACE_ENTRY {
 
 struct _INTERFACE_ENTRY PdoInterfaceTable[] = {
     DEFINE_INTERFACE_ENTRY(EMULATED_INTERFACE, Emulated),
-    DEFINE_INTERFACE_ENTRY(UNPLUG_INTERFACE, Unplug),
     { NULL, NULL, NULL }
 };
 
diff --git a/src/xenfilt/unplug.c b/src/xenfilt/unplug.c
deleted file mode 100644
index 0c0948d..0000000
--- a/src/xenfilt/unplug.c
+++ /dev/null
@@ -1,467 +0,0 @@
-/* Copyright (c) Citrix Systems Inc.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, 
- * with or without modification, are permitted provided 
- * that the following conditions are met:
- * 
- * *   Redistributions of source code must retain the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer.
- * *   Redistributions in binary form must reproduce the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer in the documentation and/or other 
- *     materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
- * SUCH DAMAGE.
- */
-
-#include <ntddk.h>
-#include <ntstrsafe.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <xen.h>
-#include <version.h>
-
-#include "driver.h"
-#include "high.h"
-#include "registry.h"
-#include "unplug.h"
-#include "dbg_print.h"
-#include "assert.h"
-#include "util.h"
-
-struct _XENFILT_UNPLUG_CONTEXT {
-    KSPIN_LOCK  Lock;
-    LONG        References;
-    HIGH_LOCK   UnplugLock;
-    BOOLEAN     BlackListed;
-    BOOLEAN     UnplugDisks;
-    BOOLEAN     UnplugNics;
-    BOOLEAN     BootEmulated;
-};
-
-typedef enum _XENFILT_UNPLUG_TYPE {
-    XENFILT_UNPLUG_DISKS = 0,
-    XENFILT_UNPLUG_NICS
-} XENFILT_UNPLUG_TYPE, *PXENFILT_UNPLUG_TYPE;
-
-#define XENFILT_UNPLUG_TAG  'LPNU'
-
-static FORCEINLINE PVOID
-__UnplugAllocate(
-    IN  ULONG   Length
-    )
-{
-    return __AllocatePoolWithTag(NonPagedPool, Length, XENFILT_UNPLUG_TAG);
-}
-
-static FORCEINLINE VOID
-__UnplugFree(
-    IN  PVOID   Buffer
-    )
-{
-    ExFreePoolWithTag(Buffer, XENFILT_UNPLUG_TAG);
-}
-
-static VOID
-UnplugGetFlags(
-    IN  PXENFILT_UNPLUG_CONTEXT Context
-    )
-{
-    HANDLE                      Key;
-    DWORD                       Value;
-    NTSTATUS                    status;
-
-    Context->BootEmulated = FALSE;
-
-    Key = DriverGetParametersKey();
-
-    status = RegistryQueryDwordValue(Key,
-                                     "BootEmulated",
-                                     &Value);
-    if (NT_SUCCESS(status)) {
-        LogPrintf(LOG_LEVEL_WARNING,
-                  "UNPLUG: BOOT_EMULATED %d\n",
-                  Value);
-
-        Context->BootEmulated = (Value == 1) ? TRUE : FALSE;
-    }
-}
-
-static VOID
-UnplugRequest(
-    IN  PXENFILT_UNPLUG_CONTEXT Context,
-    IN  XENFILT_UNPLUG_TYPE     Type
-    )
-{
-    switch (Type) {
-    case XENFILT_UNPLUG_DISKS:
-        if (Context->BootEmulated) {
-#pragma prefast(suppress:28138)
-            WRITE_PORT_USHORT((PUSHORT)0x10, 0x0004);
-
-            LogPrintf(LOG_LEVEL_WARNING, "UNPLUG: AUX DISKS\n");
-        } else {
-#pragma prefast(suppress:28138)
-            WRITE_PORT_USHORT((PUSHORT)0x10, 0x0001);
-
-            LogPrintf(LOG_LEVEL_WARNING, "UNPLUG: DISKS\n");
-        }
-        break;
-    case XENFILT_UNPLUG_NICS:
-#pragma prefast(suppress:28138)
-        WRITE_PORT_USHORT((PUSHORT)0x10, 0x0002);
-
-        LogPrintf(LOG_LEVEL_WARNING, "UNPLUG: NICS\n");
-        break;
-    default:
-        ASSERT(FALSE);
-    }
-}
-
-static NTSTATUS
-UnplugPreamble(
-    IN  PXENFILT_UNPLUG_CONTEXT Context
-    )
-{
-    USHORT                      Magic;
-    UCHAR                       Version;
-    NTSTATUS                    status;
-
-    // See docs/misc/hvm-emulated-unplug.markdown for details of the
-    // protocol in use here
-
-#pragma prefast(suppress:28138)
-    Magic = READ_PORT_USHORT((PUSHORT)0x10);
-    
-    if (Magic == 0xd249) {
-        Context->BlackListed = TRUE;
-        goto done;
-    }
-
-    status = STATUS_NOT_SUPPORTED;
-    if (Magic != 0x49d2)
-        goto fail1;
-
-#pragma prefast(suppress:28138)
-    Version = READ_PORT_UCHAR((PUCHAR)0x12);
-    if (Version != 0) {
-#pragma prefast(suppress:28138)
-        WRITE_PORT_USHORT((PUSHORT)0x12, 0xFFFF);   // FIXME
-
-#pragma prefast(suppress:28138)
-        WRITE_PORT_ULONG((PULONG)0x10, 
-                         (MAJOR_VERSION << 16) |
-                         (MINOR_VERSION << 8) |
-                         MICRO_VERSION);
-
-#pragma prefast(suppress:28138)
-        Magic = READ_PORT_USHORT((PUSHORT)0x10);
-        if (Magic == 0xd249)
-            Context->BlackListed = TRUE;
-    }
-
-done:
-    LogPrintf(LOG_LEVEL_WARNING,
-              "UNPLUG: PRE-AMBLE (DRIVERS %s)\n",
-              (Context->BlackListed) ? "BLACKLISTED" : "NOT BLACKLISTED");
-
-    return STATUS_SUCCESS;
-
-fail1:
-    return status;
-}
-
-#define HKEY_LOCAL_MACHINE  "\\Registry\\Machine"
-#define SERVICES_KEY        HKEY_LOCAL_MACHINE "\\SYSTEM\\CurrentControlSet\\Services"
-
-static VOID
-UnplugCheckForPVDisks(
-    IN  PXENFILT_UNPLUG_CONTEXT Context
-    )
-{
-    HANDLE                      UnplugKey;
-    PANSI_STRING                ServiceNames;
-    ULONG                       Count;
-    ULONG                       Index;
-    KIRQL                       Irql;
-    NTSTATUS                    status;
-
-    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
-
-    UnplugKey = DriverGetUnplugKey();
-
-    ServiceNames = NULL;
-
-    status = RegistryQuerySzValue(UnplugKey,
-                                  "DISKS",
-                                  &ServiceNames);
-    if (!NT_SUCCESS(status))
-        goto done;
-
-    Count = 0;
-    for (Index = 0; ServiceNames[Index].Buffer != NULL; Index++)
-        if (_stricmp(ServiceNames[Index].Buffer, "XENVBD") == 0)
-            Count++;
-
-    if (Count < 1)
-        goto done;
-
-    AcquireHighLock(&Context->UnplugLock, &Irql);
-    Context->UnplugDisks = TRUE;
-    ReleaseHighLock(&Context->UnplugLock, Irql);
-
-done:
-    Info("%s\n", (Context->UnplugDisks) ? "PRESENT" : "NOT PRESENT");
-
-    if (ServiceNames != NULL)
-        RegistryFreeSzValue(ServiceNames);
-}
-
-static VOID
-UnplugCheckForPVNics(
-    IN  PXENFILT_UNPLUG_CONTEXT Context
-    )
-{
-    HANDLE                      UnplugKey;
-    PANSI_STRING                ServiceNames;
-    ULONG                       Count;
-    ULONG                       Index;
-    KIRQL                       Irql;
-    NTSTATUS                    status;
-
-    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
-
-    UnplugKey = DriverGetUnplugKey();
-
-    ServiceNames = NULL;
-
-    status = RegistryQuerySzValue(UnplugKey,
-                                  "NICS",
-                                  &ServiceNames);
-    if (!NT_SUCCESS(status))
-        goto done;
-
-    Count = 0;
-    for (Index = 0; ServiceNames[Index].Buffer != NULL; Index++)
-        if (_stricmp(ServiceNames[Index].Buffer, "XENVIF") == 0 ||
-            _stricmp(ServiceNames[Index].Buffer, "XENNET") == 0)
-            Count++;
-
-    if (Count < 2)
-        goto done;
-
-    AcquireHighLock(&Context->UnplugLock, &Irql);
-    Context->UnplugNics = TRUE;
-    ReleaseHighLock(&Context->UnplugLock, Irql);
-
-done:
-    Info("%s\n", (Context->UnplugNics) ? "PRESENT" : "NOT PRESENT");
-
-    if (ServiceNames != NULL)
-        RegistryFreeSzValue(ServiceNames);
-}
-
-static VOID
-UnplugReplay(
-    IN  PINTERFACE          Interface
-    )
-{
-    PXENFILT_UNPLUG_CONTEXT Context = Interface->Context;
-    KIRQL                   Irql;
-    NTSTATUS                status;
-
-    AcquireHighLock(&Context->UnplugLock, &Irql);
-
-    status = UnplugPreamble(Context);
-    ASSERT(NT_SUCCESS(status));
-
-    if (Context->UnplugDisks)
-        UnplugRequest(Context, XENFILT_UNPLUG_DISKS);
-
-    if (Context->UnplugNics)
-        UnplugRequest(Context, XENFILT_UNPLUG_NICS);
-    
-    ReleaseHighLock(&Context->UnplugLock, Irql);
-}
-
-NTSTATUS
-UnplugAcquire(
-    IN  PINTERFACE          Interface
-    )
-{
-    PXENFILT_UNPLUG_CONTEXT Context = Interface->Context;
-    KIRQL                   Irql;
-    NTSTATUS                status;
-
-    KeAcquireSpinLock(&Context->Lock, &Irql);
-
-    if (Context->References++ != 0)
-        goto done;
-
-    Trace("====>\n");
-
-    (VOID)__AcquireHighLock(&Context->UnplugLock);
-
-    status = UnplugPreamble(Context);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
-    if (Context->UnplugDisks)
-        UnplugRequest(Context, XENFILT_UNPLUG_DISKS);
-
-    if (Context->UnplugNics)
-        UnplugRequest(Context, XENFILT_UNPLUG_NICS);
-    
-    ReleaseHighLock(&Context->UnplugLock, DISPATCH_LEVEL);
-
-    Trace("<====\n");
-
-done:
-    KeReleaseSpinLock(&Context->Lock, Irql);
-
-    return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    ReleaseHighLock(&Context->UnplugLock, DISPATCH_LEVEL);
-
-    KeReleaseSpinLock(&Context->Lock, Irql);
-
-    return status;
-}
-
-VOID
-UnplugRelease(
-    IN  PINTERFACE              Interface
-    )
-{
-    PXENFILT_UNPLUG_CONTEXT     Context = Interface->Context;
-    KIRQL                       Irql;
-
-    KeAcquireSpinLock(&Context->Lock, &Irql);
-
-    if (--Context->References > 0)
-        goto done;
-
-    Trace("====>\n");
-
-    Context->BlackListed = FALSE;
-
-    Trace("<====\n");
-
-done:
-    KeReleaseSpinLock(&Context->Lock, Irql);
-}
-
-static struct _XENFILT_UNPLUG_INTERFACE_V1 UnplugInterfaceVersion1 = {
-    { sizeof (struct _XENFILT_UNPLUG_INTERFACE_V1), 1, NULL, NULL, NULL },
-    UnplugAcquire,
-    UnplugRelease,
-    UnplugReplay
-};
-                     
-NTSTATUS
-UnplugInitialize(
-    OUT PXENFILT_UNPLUG_CONTEXT *Context
-    )
-{
-    NTSTATUS                    status;
-
-    Trace("====>\n");
-
-    *Context = __UnplugAllocate(sizeof (XENFILT_UNPLUG_CONTEXT));
-
-    status = STATUS_NO_MEMORY;
-    if (*Context == NULL)
-        goto fail1;
-
-    UnplugCheckForPVDisks(*Context);
-    UnplugCheckForPVNics(*Context);
-    UnplugGetFlags(*Context);
-
-    KeInitializeSpinLock(&(*Context)->Lock);
-    InitializeHighLock(&(*Context)->UnplugLock);
-
-    Trace("<====\n");
-
-    return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return status;
-}
-
-NTSTATUS
-UnplugGetInterface(
-    IN      PXENFILT_UNPLUG_CONTEXT Context,
-    IN      ULONG                   Version,
-    IN OUT  PINTERFACE              Interface,
-    IN      ULONG                   Size
-    )
-{
-    NTSTATUS                        status;
-
-    ASSERT(Context != NULL);
-
-    switch (Version) {
-    case 1: {
-        struct _XENFILT_UNPLUG_INTERFACE_V1 *UnplugInterface;
-
-        UnplugInterface = (struct _XENFILT_UNPLUG_INTERFACE_V1 *)Interface;
-
-        status = STATUS_BUFFER_OVERFLOW;
-        if (Size < sizeof (struct _XENFILT_UNPLUG_INTERFACE_V1))
-            break;
-
-        *UnplugInterface = UnplugInterfaceVersion1;
-
-        ASSERT3U(Interface->Version, ==, Version);
-        Interface->Context = Context;
-
-        status = STATUS_SUCCESS;
-        break;
-    }
-    default:
-        status = STATUS_NOT_SUPPORTED;
-        break;
-    }
-
-    return status;
-}   
-
-VOID
-UnplugTeardown(
-    IN  PXENFILT_UNPLUG_CONTEXT Context
-    )
-{
-    Trace("====>\n");
-
-    Context->BootEmulated = FALSE;
-    Context->UnplugNics = FALSE;
-    Context->UnplugDisks = FALSE;
-
-    RtlZeroMemory(&Context->UnplugLock, sizeof (HIGH_LOCK));
-    RtlZeroMemory(&Context->Lock, sizeof (KSPIN_LOCK));
-
-    ASSERT(IsZeroMemory(Context, sizeof (XENFILT_UNPLUG_CONTEXT)));
-    __UnplugFree(Context);
-
-    Trace("<====\n");
-}
diff --git a/src/xenfilt/unplug.h b/src/xenfilt/unplug.h
deleted file mode 100644
index 191d8e2..0000000
--- a/src/xenfilt/unplug.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Copyright (c) Citrix Systems Inc.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, 
- * with or without modification, are permitted provided 
- * that the following conditions are met:
- * 
- * *   Redistributions of source code must retain the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer.
- * *   Redistributions in binary form must reproduce the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer in the documentation and/or other 
- *     materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
- * SUCH DAMAGE.
- */
-
-#ifndef _XENFILT_UNPLUG_H
-#define _XENFILT_UNPLUG_H
-
-#include <ntddk.h>
-#include <xen.h>
-#include <unplug_interface.h>
-
-typedef struct _XENFILT_UNPLUG_CONTEXT  XENFILT_UNPLUG_CONTEXT, *PXENFILT_UNPLUG_CONTEXT;
-
-extern NTSTATUS
-UnplugInitialize(
-    OUT PXENFILT_UNPLUG_CONTEXT *Context
-    );
-
-extern NTSTATUS
-UnplugGetInterface(
-    IN      PXENFILT_UNPLUG_CONTEXT Context,
-    IN      ULONG                   Version,
-    IN OUT  PINTERFACE              Interface,
-    IN      ULONG                   Size
-    );
-
-extern VOID
-UnplugTeardown(
-    IN  PXENFILT_UNPLUG_CONTEXT Context
-    );
-
-#endif  // _XENFILT_UNPLUG_H
diff --git a/vs2012/xen/xen.vcxproj b/vs2012/xen/xen.vcxproj
index df966af..0ffb844 100644
--- a/vs2012/xen/xen.vcxproj
+++ b/vs2012/xen/xen.vcxproj
@@ -90,6 +90,7 @@
     <ClCompile Include="..\..\src\xen\process.c" />
     <ClCompile Include="..\..\src\xen\acpi.c" />
     <ClCompile Include="..\..\src\xen\system.c" />
+    <ClCompile Include="..\..\src\xen\unplug.c" />
   </ItemGroup>
   <ItemGroup>
     <MASM Include="..\..\src\xen\amd64\hypercall_thunk.asm">
diff --git a/vs2012/xenbus/xenbus.vcxproj b/vs2012/xenbus/xenbus.vcxproj
index ab78a02..82f0dbf 100644
--- a/vs2012/xenbus/xenbus.vcxproj
+++ b/vs2012/xenbus/xenbus.vcxproj
@@ -94,6 +94,7 @@
     <ClCompile Include="..\..\src\xenbus\balloon.c" />
     <ClCompile Include="..\..\src\xenbus\cache.c" />
     <ClCompile Include="..\..\src\xenbus\hash_table.c" />
+    <ClCompile Include="..\..\src\xenbus\unplug.c" />
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="..\..\src\xenbus\xenbus.rc" />
diff --git a/vs2012/xenfilt/xenfilt.vcxproj b/vs2012/xenfilt/xenfilt.vcxproj
index 34efda4..4d5747d 100644
--- a/vs2012/xenfilt/xenfilt.vcxproj
+++ b/vs2012/xenfilt/xenfilt.vcxproj
@@ -68,7 +68,6 @@
   <ItemGroup>
     <ClCompile Include="../../src/common/registry.c" />
     <ClCompile Include="../../src/xenfilt/driver.c" />
-    <ClCompile Include="../../src/xenfilt/unplug.c" />
     <ClCompile Include="../../src/xenfilt/emulated.c" />
     <ClCompile Include="../../src/xenfilt/fdo.c" />
     <ClCompile Include="../../src/xenfilt/pdo.c" />
diff --git a/vs2013/xen/xen.vcxproj b/vs2013/xen/xen.vcxproj
index cd40452..9330d8d 100644
--- a/vs2013/xen/xen.vcxproj
+++ b/vs2013/xen/xen.vcxproj
@@ -93,6 +93,7 @@
     <ClCompile Include="..\..\src\xen\process.c" />
     <ClCompile Include="..\..\src\xen\acpi.c" />
     <ClCompile Include="..\..\src\xen\system.c" />
+    <ClCompile Include="..\..\src\xen\unplug.c" />
   </ItemGroup>
   <ItemGroup>
     <MASM Include="..\..\src\xen\amd64\hypercall_thunk.asm">
diff --git a/vs2013/xenbus/xenbus.vcxproj b/vs2013/xenbus/xenbus.vcxproj
index ca486c9..fb0b0dd 100644
--- a/vs2013/xenbus/xenbus.vcxproj
+++ b/vs2013/xenbus/xenbus.vcxproj
@@ -97,6 +97,7 @@
     <ClCompile Include="..\..\src\xenbus\balloon.c" />
     <ClCompile Include="..\..\src\xenbus\cache.c" />
     <ClCompile Include="..\..\src\xenbus\hash_table.c" />
+    <ClCompile Include="..\..\src\xenbus\unplug.c" />
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="..\..\src\xenbus\xenbus.rc" />
diff --git a/vs2013/xenfilt/xenfilt.vcxproj b/vs2013/xenfilt/xenfilt.vcxproj
index db4a437..4f749b1 100644
--- a/vs2013/xenfilt/xenfilt.vcxproj
+++ b/vs2013/xenfilt/xenfilt.vcxproj
@@ -71,7 +71,6 @@
   <ItemGroup>
     <ClCompile Include="../../src/common/registry.c" />
     <ClCompile Include="../../src/xenfilt/driver.c" />
-    <ClCompile Include="../../src/xenfilt/unplug.c" />
     <ClCompile Include="../../src/xenfilt/emulated.c" />
     <ClCompile Include="../../src/xenfilt/fdo.c" />
     <ClCompile Include="../../src/xenfilt/pdo.c" />
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:20:18 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:20:18 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7FC-0001wu-7B; Mon, 20 Jul 2015 09:20:18 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7FA-0001wg-45
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:20:16 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	B8/A4-24055-F4DBCA55; Mon, 20 Jul 2015 09:20:15 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-206.messagelabs.com!1437384011!16851933!1
X-Originating-IP: [74.125.82.53]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG, UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26715 invoked from network); 20 Jul 2015 09:20:11 -0000
Received: from mail-wg0-f53.google.com (HELO mail-wg0-f53.google.com)
	(74.125.82.53)
	by server-14.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:20:11 -0000
Received: by wgmn9 with SMTP id n9so125619969wgm.0
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:20:11 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=XrU6GfTHcnKt6qbkqt8E8kDIuchyimZw3FQYECjswng=;
	b=um23SkaHkn0LicKvrXf8rsuff+1AlXWrDAU/Qnf56RrHjgA7dWqb6mYuZDME8svbAJ
	c9EvRd6SV55YiZe/DsnpCXLmDHIjMgwXFiYGa9ek6U9VHx1fPtj1lrMzoK/Xz1yXQFsk
	A5mdHrQo/SQDDToW7mjQMbsHIQTly/xgdKNPPAcZ617y3gYtbwBDBzunDIJZ4nqmi6i2
	xJ8guO4ZvrtAowG9r6NkUhHT3inn7CWxCpnKpZlxNmY3z0cvX2tfG79IUI1HtzwyXNlJ
	iGadptD1wCOcoKXaQ5u5EM+83CSt1ZoPHymIyW9XKlqP2MjdGMO713Asp4O2W0VvIY4Q
	yXZQ==
X-Received: by 10.180.24.165 with SMTP id v5mr19878431wif.63.1437384011661;
	Mon, 20 Jul 2015 02:20:11 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	l6sm10833795wib.18.2015.07.20.02.20.10
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:20:11 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:19:55 +0100
Message-Id: <1437383995-6240-4-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437383995-6240-1-git-send-email-paul.durrant@citrix.com>
References: <1437383995-6240-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 3/3] Introduce new mechanism to unplug
	emulated devices
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This makes an incompatible change and so the PDO revision is bumped up
without retaining any previous revisions.

With this patch a new unplug interface is exported by XENBUS (so it is
available for query before installing XENFILT). This interface exports
a Request method which is now the one true way of requesting unplug
of emulated devices. Co-installers need not mess with registry keys
any more. Instead drivers should request unplug when they find their
PDOs blocked by aliasing emulated devices, or when they successfully
come online. The reason for the latter case is that unplug is now
single-shot. It needs to be re-requested by PV drivers each time their
PDOs come online otherwise emulated devices will be re-instated on
next reboot.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/revision.h             |   6 +-
 include/unplug_interface.h     |  70 +++---
 include/xen.h                  |  26 +++
 src/coinst/coinst.c            |   2 +-
 src/common/registry.c          |  42 ++++
 src/common/registry.h          |  16 +-
 src/xen/driver.c               | 113 ++++++++--
 src/xen/driver.h               |  40 ++++
 src/xen/unplug.c               | 421 +++++++++++++++++++++++++++++++++++++
 src/xen/unplug.h               |  48 +++++
 src/xenbus.inf                 |  17 +-
 src/xenbus/fdo.c               | 104 ++++-----
 src/xenbus/fdo.h               |  10 +-
 src/xenbus/pdo.c               |  14 +-
 src/xenbus/suspend.c           |  37 +---
 src/xenbus/unplug.c            | 241 +++++++++++++++++++++
 src/xenbus/unplug.h            |  62 ++++++
 src/xenfilt/driver.c           | 132 +++---------
 src/xenfilt/driver.h           |  12 --
 src/xenfilt/pdo.c              |   2 -
 src/xenfilt/unplug.c           | 467 -----------------------------------------
 src/xenfilt/unplug.h           |  59 ------
 vs2012/xen/xen.vcxproj         |   1 +
 vs2012/xenbus/xenbus.vcxproj   |   1 +
 vs2012/xenfilt/xenfilt.vcxproj |   1 -
 vs2013/xen/xen.vcxproj         |   1 +
 vs2013/xenbus/xenbus.vcxproj   |   1 +
 vs2013/xenfilt/xenfilt.vcxproj |   1 -
 28 files changed, 1126 insertions(+), 821 deletions(-)
 create mode 100644 src/xen/driver.h
 create mode 100644 src/xen/unplug.c
 create mode 100644 src/xen/unplug.h
 create mode 100644 src/xenbus/unplug.c
 create mode 100644 src/xenbus/unplug.h
 delete mode 100644 src/xenfilt/unplug.c
 delete mode 100644 src/xenfilt/unplug.h

diff --git a/include/revision.h b/include/revision.h
index 9a91a33..dfe4995 100644
--- a/include/revision.h
+++ b/include/revision.h
@@ -43,8 +43,8 @@
 // G  - XENBUS_GNTTAB_INTERFACE
 // EM - XENFILT_EMULATED_INTERFACE
 
-//                    REVISION   S  SI   E   D  ST   R   C   G  EM
-#define DEFINE_REVISION_TABLE                                      \
-    DEFINE_REVISION(0x08000008,  1,  2,  4,  1,  1,  1,  1,  1,  1)
+//                    REVISION   S  SI   E   D  ST   R   C   G   U  EM
+#define DEFINE_REVISION_TABLE                                           \
+    DEFINE_REVISION(0x08000009,  1,  2,  4,  1,  1,  1,  1,  1,  1,  1)
 
 #endif  // _REVISION_H
diff --git a/include/unplug_interface.h b/include/unplug_interface.h
index 8817f53..83b3dc9 100644
--- a/include/unplug_interface.h
+++ b/include/unplug_interface.h
@@ -30,75 +30,87 @@
  */
 
 /*! \file unplug_interface.h
-    \brief XENFILT UNPLUG Interface
+    \brief XENBUS UNPLUG Interface
 
-    This interface provides a primitive to re-unplug emulated devices,
-    which is required on resume-from-suspend
+    This interface provides a method to request emulated device unplug
 */
 
-#ifndef _XENFILT_UNPLUG_INTERFACE_H
-#define _XENFILT_UNPLUG_INTERFACE_H
+#ifndef _XENBUS_UNPLUG_INTERFACE_H
+#define _XENBUS_UNPLUG_INTERFACE_H
 
 #ifndef _WINDLL
 
-/*! \typedef XENFILT_UNPLUG_ACQUIRE
+/*! \typedef XENBUS_UNPLUG_ACQUIRE
     \brief Acquire a reference to the UNPLUG interface
 
     \param Interface The interface header
 */  
 typedef NTSTATUS
-(*XENFILT_UNPLUG_ACQUIRE)(
+(*XENBUS_UNPLUG_ACQUIRE)(
     IN  PINTERFACE  Interface
     );
 
-/*! \typedef XENFILT_UNPLUG_RELEASE
+/*! \typedef XENBUS_UNPLUG_RELEASE
     \brief Release a reference to the UNPLUG interface
 
     \param Interface The interface header
 */  
 typedef VOID
-(*XENFILT_UNPLUG_RELEASE)(
+(*XENBUS_UNPLUG_RELEASE)(
     IN  PINTERFACE  Interface
     );
 
-/*! \typedef XENFILT_UNPLUG_REPLAY
-    \brief Re-unplug emulated devices that were previously unplugged
-    at boot time
+/*! \enum _XENBUS_UNPLUG_DEVICE_TYPE
+    \brief Type of device to be unplugged
+*/
+typedef enum _XENBUS_UNPLUG_DEVICE_TYPE {
+    XENBUS_UNPLUG_DEVICE_TYPE_INVALID = 0,
+    XENBUS_UNPLUG_DEVICE_TYPE_NICS,     /*!< NICs */
+    XENBUS_UNPLUG_DEVICE_TYPE_DISKS,    /*!< Disks */
+} XENBUS_UNPLUG_DEVICE_TYPE, *PXENBUS_UNPLUG_DEVICE_TYPE;
+
+/*! \typedef XENBUS_UNPLUG_REQUEST
+    \brief Request unplug of a type of emulated device
 
     \param Interface The interface header
+    \param Type The type of device
+    \param Make Set to TRUE if the request is being made, FALSE if it is
+           being revoked.
 */  
 typedef VOID
-(*XENFILT_UNPLUG_REPLAY)(
-    IN  PINTERFACE  Interface
+(*XENBUS_UNPLUG_REQUEST)(
+    IN  PINTERFACE                  Interface,
+    IN  XENBUS_UNPLUG_DEVICE_TYPE   Type,
+    IN  BOOLEAN                     Make
     );
 
-// {D5657CFD-3DB5-4A23-A94F-61FD89247FE7}
-DEFINE_GUID(GUID_XENFILT_UNPLUG_INTERFACE,
-0xd5657cfd, 0x3db5, 0x4a23, 0xa9, 0x4f, 0x61, 0xfd, 0x89, 0x24, 0x7f, 0xe7);
+// {73db6517-3d06-4937-989f-199b7501e229}
+DEFINE_GUID(GUID_XENBUS_UNPLUG_INTERFACE,
+0x73db6517, 0x3d06, 0x4937, 0x98, 0x9f, 0x19, 0x9b, 0x75, 0x01, 0xe2, 0x29);
 
-/*! \struct _XENFILT_UNPLUG_INTERFACE_V1
+/*! \struct _XENBUS_UNPLUG_INTERFACE_V1
     \brief UNPLUG interface version 1
     \ingroup interfaces
 */
-struct _XENFILT_UNPLUG_INTERFACE_V1 {
+struct _XENBUS_UNPLUG_INTERFACE_V1 {
     INTERFACE               Interface;
-    XENFILT_UNPLUG_ACQUIRE  Acquire;
-    XENFILT_UNPLUG_RELEASE  Release;
-    XENFILT_UNPLUG_REPLAY   Replay;
+    XENBUS_UNPLUG_ACQUIRE   UnplugAcquire;
+    XENBUS_UNPLUG_RELEASE   UnplugRelease;
+    XENBUS_UNPLUG_REQUEST   UnplugRequest;
 };
 
-typedef struct _XENFILT_UNPLUG_INTERFACE_V1 XENFILT_UNPLUG_INTERFACE, *PXENFILT_UNPLUG_INTERFACE;
+typedef struct _XENBUS_UNPLUG_INTERFACE_V1 XENBUS_UNPLUG_INTERFACE, *PXENBUS_UNPLUG_INTERFACE;
 
-/*! \def XENFILT_UNPLUG
+/*! \def XENBUS_UNPLUG
     \brief Macro at assist in method invocation
 */
-#define XENFILT_UNPLUG(_Method, _Interface, ...)    \
-    (_Interface)-> ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+#define XENBUS_UNPLUG(_Method, _Interface, ...)    \
+    (_Interface)->Unplug ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
 
 #endif  // _WINDLL
 
-#define XENFILT_UNPLUG_INTERFACE_VERSION_MIN  1
-#define XENFILT_UNPLUG_INTERFACE_VERSION_MAX  1
+#define XENBUS_UNPLUG_INTERFACE_VERSION_MIN  1
+#define XENBUS_UNPLUG_INTERFACE_VERSION_MAX  1
 
-#endif  // _XENFILT_UNPLUG_INTERFACE_H
+#endif  // _XENBUS_UNPLUG_INTERFACE_H
 
diff --git a/include/xen.h b/include/xen.h
index cf9c2d9..6007582 100644
--- a/include/xen.h
+++ b/include/xen.h
@@ -307,6 +307,32 @@ ModuleLookup(
     OUT PULONG_PTR  Offset
     );
 
+// UNPLUG
+
+typedef enum _UNPLUG_TYPE {
+    UNPLUG_DISKS = 0,
+    UNPLUG_NICS,
+    UNPLUG_TYPE_COUNT
+} UNPLUG_TYPE, *PUNPLUG_TYPE;
+
+XEN_API
+VOID
+UnplugDevices(
+    VOID
+    );
+
+XEN_API
+NTSTATUS
+UnplugIncrementValue(
+    IN  UNPLUG_TYPE Type
+    );
+
+XEN_API
+NTSTATUS
+UnplugDecrementValue(
+    IN  UNPLUG_TYPE Type
+    );
+
 // LOG
 
 typedef enum _LOG_LEVEL {
diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 0b8c306..2b980a1 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -1298,7 +1298,7 @@ fail1:
     return FALSE;
 }
 
-#define DEFINE_REVISION(_N, _S, _SI, _E, _D, _ST, _R, _C, _G, _EM) \
+#define DEFINE_REVISION(_N, _S, _SI, _E, _D, _ST, _R, _C, _G, _U, _EM) \
     (_N)
 
 static DWORD    DeviceRevision[] = {
diff --git a/src/common/registry.c b/src/common/registry.c
index 4caeaa5..cb9e31d 100644
--- a/src/common/registry.c
+++ b/src/common/registry.c
@@ -116,6 +116,40 @@ fail1:
 }
 
 NTSTATUS
+RegistryCreateKey(
+    IN  HANDLE          Parent,
+    IN  PUNICODE_STRING Path,
+    IN  ULONG           Options,
+    OUT PHANDLE         Key
+    )
+{
+    OBJECT_ATTRIBUTES   Attributes;
+    NTSTATUS            status;
+
+    InitializeObjectAttributes(&Attributes,
+                               Path,
+                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
+                               Parent,
+                               NULL);
+
+    status = ZwCreateKey(Key,
+                         KEY_ALL_ACCESS,
+                         &Attributes,
+                         0,
+                         NULL,
+                         Options,
+                         NULL
+                         );
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    return STATUS_SUCCESS;
+
+fail1:
+    return status;
+}
+
+NTSTATUS
 RegistryOpenServiceKey(
     IN  ACCESS_MASK     DesiredAccess,
     OUT PHANDLE         Key
@@ -125,6 +159,14 @@ RegistryOpenServiceKey(
 }
 
 NTSTATUS
+RegistryCreateServiceKey(
+    OUT PHANDLE         Key
+    )
+{
+    return RegistryCreateKey(NULL, &RegistryPath, REG_OPTION_NON_VOLATILE, Key);
+}
+
+NTSTATUS
 RegistryOpenSoftwareKey(
     IN  PDEVICE_OBJECT  DeviceObject,
     IN  ACCESS_MASK     DesiredAccess,
diff --git a/src/common/registry.h b/src/common/registry.h
index 7f0fa23..3920b6d 100644
--- a/src/common/registry.h
+++ b/src/common/registry.h
@@ -53,12 +53,25 @@ RegistryOpenKey(
     );
 
 extern NTSTATUS
+RegistryCreateKey(
+    IN  HANDLE          Parent,
+    IN  PUNICODE_STRING Path,
+    IN  ULONG           Options,
+    OUT PHANDLE         Key
+    );
+
+extern NTSTATUS
 RegistryOpenServiceKey(
     IN  ACCESS_MASK DesiredAccess,
     OUT PHANDLE     Key
     );
 
 extern NTSTATUS
+RegistryCreateServiceKey(
+    OUT PHANDLE     Key
+    );
+
+extern NTSTATUS
 RegistryOpenSoftwareKey(
     IN  PDEVICE_OBJECT  DeviceObject,
     IN  ACCESS_MASK     DesiredAccess,
@@ -83,8 +96,7 @@ RegistryOpenSubKey(
 extern NTSTATUS
 RegistryCreateSubKey(
     IN  HANDLE      Key,
-    IN  PCHAR       Name,
-    IN  ULONG       Options,
+    IN  PCHAR       Name,    IN  ULONG       Options,
     OUT PHANDLE     SubKey
     );
 
diff --git a/src/xen/driver.c b/src/xen/driver.c
index 66a5e80..9662ff6 100644
--- a/src/xen/driver.c
+++ b/src/xen/driver.c
@@ -35,12 +35,15 @@
 #include <procgrp.h>
 #include <xen.h>
 
+#include "registry.h"
+#include "driver.h"
 #include "hypercall.h"
 #include "log.h"
 #include "module.h"
 #include "process.h"
 #include "system.h"
 #include "acpi.h"
+#include "unplug.h"
 #include "bug_check.h"
 #include "dbg_print.h"
 #include "assert.h"
@@ -51,6 +54,7 @@ extern PULONG   InitSafeBootMode;
 typedef struct _XEN_DRIVER {
     PLOG_DISPOSITION    TraceDisposition;
     PLOG_DISPOSITION    InfoDisposition;
+    HANDLE              UnplugKey;
 } XEN_DRIVER, *PXEN_DRIVER;
 
 static XEN_DRIVER   Driver;
@@ -102,6 +106,30 @@ fail1:
     return STATUS_INCOMPATIBLE_DRIVER_BLOCKED;
 }
 
+static FORCEINLINE VOID
+__DriverSetUnplugKey(
+    IN  HANDLE  Key
+    )
+{
+    Driver.UnplugKey = Key;
+}
+
+static FORCEINLINE HANDLE
+__DriverGetUnplugKey(
+    VOID
+    )
+{
+    return Driver.UnplugKey;
+}
+
+HANDLE
+DriverGetUnplugKey(
+    VOID
+    )
+{
+    return __DriverGetUnplugKey();
+}
+
 static VOID
 DriverOutputBuffer(
     IN  PVOID   Argument,
@@ -122,9 +150,9 @@ DllInitialize(
     IN  PUNICODE_STRING RegistryPath
     )
 {
-    NTSTATUS    status;
-
-    UNREFERENCED_PARAMETER(RegistryPath);
+    HANDLE              ServiceKey;
+    HANDLE              UnplugKey;
+    NTSTATUS            status;
 
     ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
     WdmlibProcgrpInitialize();
@@ -165,59 +193,103 @@ DllInitialize(
          MONTH,
          YEAR);
 
-    status = AcpiInitialize();
+    status = RegistryInitialize(RegistryPath);
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    status = SystemInitialize();
+    status = RegistryCreateServiceKey(&ServiceKey);
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    status = HypercallInitialize();
+    status = RegistryCreateSubKey(ServiceKey,
+                                  "Unplug",
+                                  REG_OPTION_NON_VOLATILE,
+                                  &UnplugKey);
     if (!NT_SUCCESS(status))
         goto fail4;
 
-    status = BugCheckInitialize();
+    __DriverSetUnplugKey(UnplugKey);
+
+    status = AcpiInitialize();
     if (!NT_SUCCESS(status))
         goto fail5;
 
-    status = ModuleInitialize();
+    status = SystemInitialize();
     if (!NT_SUCCESS(status))
         goto fail6;
 
-    status = ProcessInitialize();
+    status = HypercallInitialize();
     if (!NT_SUCCESS(status))
         goto fail7;
 
+    status = BugCheckInitialize();
+    if (!NT_SUCCESS(status))
+        goto fail8;
+
+    status = ModuleInitialize();
+    if (!NT_SUCCESS(status))
+        goto fail9;
+
+    status = ProcessInitialize();
+    if (!NT_SUCCESS(status))
+        goto fail10;
+
+    status = UnplugInitialize();
+    if (!NT_SUCCESS(status))
+        goto fail11;
+
+    RegistryCloseKey(ServiceKey);
+
 done:
     Trace("<====\n");
 
     return STATUS_SUCCESS;
 
+fail11:
+    Error("fail11\n");
+
+    ProcessTeardown();
+
+fail10:
+    Error("fail10\n");
+
+    ModuleTeardown();
+
+fail9:
+    Error("fail9\n");
+
+    BugCheckTeardown();
+
+fail8:
+    Error("fail8\n");
+
+    HypercallTeardown();
+
 fail7:
     Error("fail7\n");
 
-    ModuleTeardown();
+    SystemTeardown();
 
 fail6:
     Error("fail6\n");
 
-    BugCheckTeardown();
+    AcpiTeardown();
 
 fail5:
     Error("fail5\n");
 
-    HypercallTeardown();
+    RegistryCloseKey(UnplugKey);
+    __DriverSetUnplugKey(NULL);
 
 fail4:
     Error("fail4\n");
 
-    SystemTeardown();
+    RegistryCloseKey(ServiceKey);
 
 fail3:
     Error("fail3\n");
 
-    AcpiTeardown();
+    RegistryTeardown();
 
 fail2:
     Error("fail2\n");
@@ -231,7 +303,7 @@ fail2:
     LogTeardown();
 
 fail1:
-    Error("fail1 (%08x)", status);
+    Error("fail1 (%08x)\n", status);
 
     ASSERT(IsZeroMemory(&Driver, sizeof (XEN_DRIVER)));
 
@@ -243,11 +315,15 @@ DllUnload(
     VOID
     )
 {
+    HANDLE  UnplugKey;
+
     Trace("====>\n");
 
     if (*InitSafeBootMode > 0)
         goto done;
 
+    UnplugTeardown();
+
     ProcessTeardown();
 
     ModuleTeardown();
@@ -258,6 +334,13 @@ DllUnload(
 
     SystemTeardown();
 
+    UnplugKey = __DriverGetUnplugKey();
+
+    RegistryCloseKey(UnplugKey);
+    __DriverSetUnplugKey(NULL);
+
+    RegistryTeardown();
+
     Info("XEN %d.%d.%d (%d) (%02d.%02d.%04d)\n",
          MAJOR_VERSION,
          MINOR_VERSION,
diff --git a/src/xen/driver.h b/src/xen/driver.h
new file mode 100644
index 0000000..c4f7a6f
--- /dev/null
+++ b/src/xen/driver.h
@@ -0,0 +1,40 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XEN_DRIVER_H
+#define _XEN_DRIVER_H
+
+extern HANDLE
+DriverGetUnplugKey(
+    VOID
+    );
+
+#endif  // _XEN_DRIVER_H
diff --git a/src/xen/unplug.c b/src/xen/unplug.c
new file mode 100644
index 0000000..77b6b8e
--- /dev/null
+++ b/src/xen/unplug.c
@@ -0,0 +1,421 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#define XEN_API __declspec(dllexport)
+
+#include <ntddk.h>
+#include <ntstrsafe.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <xen.h>
+#include <version.h>
+
+#include "driver.h"
+#include "high.h"
+#include "registry.h"
+#include "unplug.h"
+#include "dbg_print.h"
+#include "assert.h"
+#include "util.h"
+
+#define UNPLUG_TAG  'LPNU'
+
+typedef struct _UNPLUG_CONTEXT {
+    LONG        References;
+    HIGH_LOCK   Lock;
+    BOOLEAN     BlackListed;
+    BOOLEAN     Request[UNPLUG_TYPE_COUNT];
+    BOOLEAN     BootEmulated;
+} UNPLUG_CONTEXT, *PUNPLUG_CONTEXT;
+
+static UNPLUG_CONTEXT   UnplugContext;
+
+static FORCEINLINE PVOID
+__UnplugAllocate(
+    IN  ULONG   Length
+    )
+{
+    return __AllocatePoolWithTag(NonPagedPool, Length, UNPLUG_TAG);
+}
+
+static FORCEINLINE VOID
+__UnplugFree(
+    IN  PVOID   Buffer
+    )
+{
+    ExFreePoolWithTag(Buffer, UNPLUG_TAG);
+}
+
+static VOID
+UnplugSetBootEmulated(
+    VOID
+    )
+{
+    PUNPLUG_CONTEXT Context = &UnplugContext;
+    CHAR            Key[] = "XEN:BOOT_EMULATED=";
+    PANSI_STRING    Option;
+    PCHAR           Value;
+    NTSTATUS        status;
+
+    status = RegistryQuerySystemStartOption(Key, &Option);
+    if (!NT_SUCCESS(status))
+        return;
+
+    Value = Option->Buffer + sizeof (Key) - 1;
+
+    if (strcmp(Value, "TRUE") == 0)
+        Context->BootEmulated = TRUE;
+
+    RegistryFreeSzValue(Option);
+}
+
+static VOID
+UnplugDeviceType(
+    IN  UNPLUG_TYPE Type
+    )
+{
+    PUNPLUG_CONTEXT Context = &UnplugContext;
+
+    switch (Type) {
+    case UNPLUG_DISKS:
+        if (Context->BootEmulated) {
+#pragma prefast(suppress:28138)
+            WRITE_PORT_USHORT((PUSHORT)0x10, 0x0004);
+
+            LogPrintf(LOG_LEVEL_WARNING, "UNPLUG: AUX DISKS\n");
+        } else {
+#pragma prefast(suppress:28138)
+            WRITE_PORT_USHORT((PUSHORT)0x10, 0x0001);
+
+            LogPrintf(LOG_LEVEL_WARNING, "UNPLUG: DISKS\n");
+        }
+        break;
+    case UNPLUG_NICS:
+#pragma prefast(suppress:28138)
+        WRITE_PORT_USHORT((PUSHORT)0x10, 0x0002);
+
+        LogPrintf(LOG_LEVEL_WARNING, "UNPLUG: NICS\n");
+        break;
+    default:
+        ASSERT(FALSE);
+    }
+}
+
+static NTSTATUS
+UnplugPreamble(
+    VOID
+    )
+{
+    PUNPLUG_CONTEXT Context = &UnplugContext;
+    USHORT          Magic;
+    UCHAR           Version;
+    NTSTATUS        status;
+
+    // See docs/misc/hvm-emulated-unplug.markdown for details of the
+    // protocol in use here
+
+#pragma prefast(suppress:28138)
+    Magic = READ_PORT_USHORT((PUSHORT)0x10);
+
+    if (Magic == 0xd249) {
+        Context->BlackListed = TRUE;
+        goto done;
+    }
+
+    status = STATUS_NOT_SUPPORTED;
+    if (Magic != 0x49d2)
+        goto fail1;
+
+#pragma prefast(suppress:28138)
+    Version = READ_PORT_UCHAR((PUCHAR)0x12);
+    if (Version != 0) {
+#pragma prefast(suppress:28138)
+        WRITE_PORT_USHORT((PUSHORT)0x12, 0xFFFF);   // FIXME
+
+#pragma prefast(suppress:28138)
+        WRITE_PORT_ULONG((PULONG)0x10,
+                         (MAJOR_VERSION << 16) |
+                         (MINOR_VERSION << 8) |
+                         MICRO_VERSION);
+
+#pragma prefast(suppress:28138)
+        Magic = READ_PORT_USHORT((PUSHORT)0x10);
+        if (Magic == 0xd249)
+            Context->BlackListed = TRUE;
+    }
+
+done:
+    LogPrintf(LOG_LEVEL_WARNING,
+              "UNPLUG: PRE-AMBLE (DRIVERS %s)\n",
+              (Context->BlackListed) ? "BLACKLISTED" : "NOT BLACKLISTED");
+
+    return STATUS_SUCCESS;
+
+fail1:
+    return status;
+}
+
+static VOID
+UnplugSetRequest(
+    IN  UNPLUG_TYPE     Type
+    )
+{
+    PUNPLUG_CONTEXT     Context = &UnplugContext;
+    HANDLE              UnplugKey;
+    PCHAR               ValueName;
+    ULONG               Value;
+    KIRQL               Irql;
+    NTSTATUS            status;
+
+    Trace("====>\n");
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    UnplugKey = DriverGetUnplugKey();
+
+    switch (Type) {
+    case UNPLUG_DISKS:
+        ValueName = "DISKS";
+        break;
+    case UNPLUG_NICS:
+        ValueName = "NICS";
+        break;
+    default:
+        ValueName = NULL;
+        ASSERT(FALSE);
+    }
+
+    status = RegistryQueryDwordValue(UnplugKey,
+                                     ValueName,
+                                     &Value);
+    if (!NT_SUCCESS(status))
+        goto done;
+
+    (VOID) RegistryDeleteValue(UnplugKey, ValueName);
+
+    Info("%s\n", ValueName);
+
+    AcquireHighLock(&Context->Lock, &Irql);
+    Context->Request[Type] = (Value != 0) ? TRUE : FALSE;
+    ReleaseHighLock(&Context->Lock, Irql);
+
+done:
+    Trace("<====\n");
+}
+
+XEN_API
+NTSTATUS
+UnplugIncrementValue(
+    IN  UNPLUG_TYPE     Type
+    )
+{
+    HANDLE              UnplugKey;
+    PCHAR               ValueName;
+    ULONG               Value;
+    NTSTATUS            status;
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    UnplugKey = DriverGetUnplugKey();
+
+    switch (Type) {
+    case UNPLUG_DISKS:
+        ValueName = "DISKS";
+        break;
+    case UNPLUG_NICS:
+        ValueName = "NICS";
+        break;
+    default:
+        ValueName = NULL;
+        ASSERT(FALSE);
+    }
+
+    status = RegistryQueryDwordValue(UnplugKey,
+                                     ValueName,
+                                     &Value);
+    if (!NT_SUCCESS(status))
+        Value = 0;
+
+    Value++;
+
+    status = RegistryUpdateDwordValue(UnplugKey,
+                                      ValueName,
+                                      Value);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Info("%s %u\n", ValueName, Value);
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+XEN_API
+NTSTATUS
+UnplugDecrementValue(
+    IN  UNPLUG_TYPE     Type
+    )
+{
+    HANDLE              UnplugKey;
+    PCHAR               ValueName;
+    LONG                Value;
+    NTSTATUS            status;
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    UnplugKey = DriverGetUnplugKey();
+
+    switch (Type) {
+    case UNPLUG_DISKS:
+        ValueName = "DISKS";
+        break;
+    case UNPLUG_NICS:
+        ValueName = "NICS";
+        break;
+    default:
+        ValueName = NULL;
+        ASSERT(FALSE);
+    }
+
+    status = RegistryQueryDwordValue(UnplugKey,
+                                     ValueName,
+                                     (PULONG)&Value);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = STATUS_INVALID_PARAMETER;
+    if (--Value < 0)
+        goto fail2;
+
+    status = RegistryUpdateDwordValue(UnplugKey,
+                                      ValueName,
+                                      (ULONG)Value);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Info("%s %u\n", ValueName, (ULONG)Value);
+
+    return STATUS_SUCCESS;
+
+fail3:
+    Error("fail3\n");
+
+fail2:
+    Error("fail2\n");
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+XEN_API
+VOID
+UnplugDevices(
+    VOID
+    )
+{
+    PUNPLUG_CONTEXT Context = &UnplugContext;
+    UNPLUG_TYPE     Type;
+    KIRQL           Irql;
+    NTSTATUS        status;
+
+    AcquireHighLock(&Context->Lock, &Irql);
+
+    status = UnplugPreamble();
+    ASSERT(NT_SUCCESS(status));
+
+    for (Type = 0; Type < UNPLUG_TYPE_COUNT; Type++) {
+        if (Context->Request[Type])
+            UnplugDeviceType(Type);
+    }
+
+    ReleaseHighLock(&Context->Lock, Irql);
+}
+
+NTSTATUS
+UnplugInitialize(
+    VOID
+    )
+{
+    PUNPLUG_CONTEXT Context = &UnplugContext;
+    LONG            References;
+    UNPLUG_TYPE     Type;
+    NTSTATUS        status;
+
+    References = InterlockedIncrement(&Context->References);
+
+    status = STATUS_OBJECTID_EXISTS;
+    if (References != 1)
+        goto fail1;
+
+    InitializeHighLock(&Context->Lock);
+
+    for (Type = 0; Type < UNPLUG_TYPE_COUNT; Type++)
+        UnplugSetRequest(Type);
+
+    UnplugSetBootEmulated();
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    (VOID) InterlockedDecrement(&Context->References);
+
+    ASSERT(IsZeroMemory(Context, sizeof (UNPLUG_CONTEXT)));
+
+    return status;
+}
+
+VOID
+UnplugTeardown(
+    VOID
+    )
+{
+    PUNPLUG_CONTEXT Context = &UnplugContext;
+    UNPLUG_TYPE     Type;
+
+    Context->BootEmulated = FALSE;
+
+    for (Type = 0; Type < UNPLUG_TYPE_COUNT; Type++)
+        Context->Request[Type] = FALSE;
+
+    RtlZeroMemory(&Context->Lock, sizeof (HIGH_LOCK));
+
+    (VOID) InterlockedDecrement(&Context->References);
+
+    ASSERT(IsZeroMemory(Context, sizeof (UNPLUG_CONTEXT)));
+}
diff --git a/src/xen/unplug.h b/src/xen/unplug.h
new file mode 100644
index 0000000..bd8e67c
--- /dev/null
+++ b/src/xen/unplug.h
@@ -0,0 +1,48 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XEN_UNPLUG_H
+#define _XEN_UNPLUG_H
+
+#include <ntddk.h>
+#include <xen.h>
+
+extern NTSTATUS
+UnplugInitialize(
+    VOID
+    );
+
+extern VOID
+UnplugTeardown(
+    VOID
+    );
+
+#endif  // _XEN_UNPLUG_H
diff --git a/src/xenbus.inf b/src/xenbus.inf
index 90dcf64..7f9370f 100644
--- a/src/xenbus.inf
+++ b/src/xenbus.inf
@@ -71,8 +71,8 @@ xenbus_coinst_@MAJOR_VERSION@_@MINOR_VERSION@_@MICRO_VERSION@_@BUILD_NUMBER@.dll
 [XenBus_Inst] 
 CopyFiles=XenBus_Copyfiles
 
-[XenBus_Inst.Services] 
-AddService=xenbus,0x02,XenBus_Service,
+[XenBus_Inst.Services]
+AddService=xenbus,0x02,XenBus_Service
 AddService=xenfilt,,XenFilt_Service,
 
 [XenBus_Service] 
@@ -82,16 +82,13 @@ StartType=%SERVICE_BOOT_START%
 ErrorControl=%SERVICE_ERROR_NORMAL% 
 ServiceBinary=%12%\xenbus.sys 
 LoadOrderGroup="Boot Bus Extender"
-AddReg = XenBus_Parameters, XenBus_Interfaces, XenBus_Interrupts
+AddReg = XenBus_Parameters, XenBus_Interrupts
 
 [XenBus_Parameters]
 HKR,"Parameters",,0x00000010
 HKR,"Parameters","SupportedClasses",0x00010000,"VIF","VBD","IFACE"
 HKR,"Parameters","SyntheticClasses",0x00010000,"IFACE"
 
-[XenBus_Interfaces]
-HKR,"Interfaces",,0x00000010
-
 [XenBus_Interrupts]
 HKR,"Interrupt Management",,0x00000010
 HKR,"Interrupt Management\MessageSignaledInterruptProperties",,0x00000010
@@ -105,19 +102,13 @@ StartType=%SERVICE_BOOT_START%
 ErrorControl=%SERVICE_ERROR_NORMAL% 
 ServiceBinary=%12%\xenfilt.sys 
 LoadOrderGroup="Boot Bus Extender"
-AddReg = XenFilt_Parameters, XenFilt_Unplug, XenFilt_Interfaces
+AddReg = XenFilt_Parameters
 
 [XenFilt_Parameters]
 HKR,"Parameters",,0x00000010
 HKR,"Parameters","ACPI\PNP0A03",0x00000000,"DEVICE"
 HKR,"Parameters","PCIIDE\IDEChannel",0x00000000,"DISK"
 
-[XenFilt_Unplug]
-HKR,"Unplug",,0x00000010
-
-[XenFilt_Interfaces]
-HKR,"Interfaces",,0x00000010
-
 [XenBus_Inst.CoInstallers]
 CopyFiles=CoInst_CopyFiles
 AddReg=CoInst_AddReg
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 8208111..e8a6f22 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -38,8 +38,6 @@
 #include <stdlib.h>
 #include <xen.h>
 
-#include <unplug_interface.h>
-
 #include "names.h"
 #include "registry.h"
 #include "fdo.h"
@@ -58,6 +56,7 @@
 #include "balloon.h"
 #include "driver.h"
 #include "range_set.h"
+#include "unplug.h"
 #include "dbg_print.h"
 #include "assert.h"
 #include "util.h"
@@ -122,6 +121,7 @@ struct _XENBUS_FDO {
     PXENBUS_RANGE_SET_CONTEXT       RangeSetContext;
     PXENBUS_CACHE_CONTEXT           CacheContext;
     PXENBUS_GNTTAB_CONTEXT          GnttabContext;
+    PXENBUS_UNPLUG_CONTEXT          UnplugContext;
     PXENBUS_BALLOON_CONTEXT         BalloonContext;
 
     XENBUS_DEBUG_INTERFACE          DebugInterface;
@@ -130,7 +130,6 @@ struct _XENBUS_FDO {
     XENBUS_STORE_INTERFACE          StoreInterface;
     XENBUS_RANGE_SET_INTERFACE      RangeSetInterface;
     XENBUS_BALLOON_INTERFACE        BalloonInterface;
-    XENFILT_UNPLUG_INTERFACE        UnplugInterface;
 
     PXENBUS_RANGE_SET               RangeSet;
     LIST_ENTRY                      List;
@@ -548,6 +547,7 @@ DEFINE_FDO_GET_CONTEXT(Store, PXENBUS_STORE_CONTEXT)
 DEFINE_FDO_GET_CONTEXT(RangeSet, PXENBUS_RANGE_SET_CONTEXT)
 DEFINE_FDO_GET_CONTEXT(Cache, PXENBUS_CACHE_CONTEXT)
 DEFINE_FDO_GET_CONTEXT(Gnttab, PXENBUS_GNTTAB_CONTEXT)
+DEFINE_FDO_GET_CONTEXT(Unplug, PXENBUS_UNPLUG_CONTEXT)
 DEFINE_FDO_GET_CONTEXT(Balloon, PXENBUS_BALLOON_CONTEXT)
 
 __drv_functionClass(IO_COMPLETION_ROUTINE)
@@ -2508,15 +2508,9 @@ FdoD3ToD0(
             goto fail7;
     }
 
-    if (Fdo->UnplugInterface.Interface.Context != NULL) {
-        status = XENFILT_UNPLUG(Acquire, &Fdo->UnplugInterface);
-        if (!NT_SUCCESS(status))
-            goto fail8;
-    }
-
     status = __FdoD3ToD0(Fdo);
     if (!NT_SUCCESS(status))
-        goto fail9;
+        goto fail8;
 
     status = XENBUS_SUSPEND(Register,
                             &Fdo->SuspendInterface,
@@ -2525,7 +2519,7 @@ FdoD3ToD0(
                             Fdo,
                             &Fdo->SuspendCallbackLate);
     if (!NT_SUCCESS(status))
-        goto fail10;
+        goto fail9;
 
     KeLowerIrql(Irql);
 
@@ -2556,16 +2550,10 @@ not_active:
 
     return STATUS_SUCCESS;
 
-fail10:
-    Error("fail10\n");
-
-    __FdoD0ToD3(Fdo);
-
 fail9:
     Error("fail9\n");
 
-    if (Fdo->UnplugInterface.Interface.Context != NULL)
-        XENFILT_UNPLUG(Release, &Fdo->UnplugInterface);
+    __FdoD0ToD3(Fdo);
 
 fail8:
     Error("fail8\n");
@@ -2692,9 +2680,6 @@ FdoD0ToD3(
 
     __FdoD0ToD3(Fdo);
 
-    if (Fdo->UnplugInterface.Interface.Context != NULL)
-        XENFILT_UNPLUG(Release, &Fdo->UnplugInterface);
-
     if (Fdo->BalloonInterface.Interface.Context != NULL)
         XENBUS_BALLOON(Release, &Fdo->BalloonInterface);
 
@@ -2733,8 +2718,7 @@ FdoS4ToS3(
 
     HypercallPopulate();
 
-    if (Fdo->UnplugInterface.Interface.Context != NULL)
-        XENFILT_UNPLUG(Replay, &Fdo->UnplugInterface);
+    UnplugDevices();
 
     KeLowerIrql(Irql);
 
@@ -4471,15 +4455,6 @@ fail1:
                       (_Size),                                                          \
                       (_Optional))
 
-VOID
-FdoGetUnplugInterface(
-    IN  PXENBUS_FDO                 Fdo,
-    OUT PXENFILT_UNPLUG_INTERFACE   UnplugInterface
-    )
-{
-    *UnplugInterface = Fdo->UnplugInterface;
-}
-
 static BOOLEAN
 FdoIsBalloonEnabled(
     IN  PXENBUS_FDO Fdo
@@ -4581,44 +4556,39 @@ FdoCreate(
     if (!__FdoIsActive(Fdo))
         goto done;
 
-    status = FDO_QUERY_INTERFACE(Fdo,
-                                 XENFILT,
-                                 UNPLUG,
-                                 (PINTERFACE)&Fdo->UnplugInterface,
-                                 sizeof (Fdo->UnplugInterface),
-                                 TRUE);
+    status = DebugInitialize(Fdo, &Fdo->DebugContext);
     if (!NT_SUCCESS(status))
         goto fail7;
 
-    status = DebugInitialize(Fdo, &Fdo->DebugContext);
+    status = SuspendInitialize(Fdo, &Fdo->SuspendContext);
     if (!NT_SUCCESS(status))
         goto fail8;
 
-    status = SuspendInitialize(Fdo, &Fdo->SuspendContext);
+    status = SharedInfoInitialize(Fdo, &Fdo->SharedInfoContext);
     if (!NT_SUCCESS(status))
         goto fail9;
 
-    status = SharedInfoInitialize(Fdo, &Fdo->SharedInfoContext);
+    status = EvtchnInitialize(Fdo, &Fdo->EvtchnContext);
     if (!NT_SUCCESS(status))
         goto fail10;
 
-    status = EvtchnInitialize(Fdo, &Fdo->EvtchnContext);
+    status = StoreInitialize(Fdo, &Fdo->StoreContext);
     if (!NT_SUCCESS(status))
         goto fail11;
 
-    status = StoreInitialize(Fdo, &Fdo->StoreContext);
+    status = RangeSetInitialize(Fdo, &Fdo->RangeSetContext);
     if (!NT_SUCCESS(status))
         goto fail12;
 
-    status = RangeSetInitialize(Fdo, &Fdo->RangeSetContext);
+    status = CacheInitialize(Fdo, &Fdo->CacheContext);
     if (!NT_SUCCESS(status))
         goto fail13;
 
-    status = CacheInitialize(Fdo, &Fdo->CacheContext);
+    status = GnttabInitialize(Fdo, &Fdo->GnttabContext);
     if (!NT_SUCCESS(status))
         goto fail14;
 
-    status = GnttabInitialize(Fdo, &Fdo->GnttabContext);
+    status = UnplugInitialize(Fdo, &Fdo->UnplugContext);
     if (!NT_SUCCESS(status))
         goto fail15;
 
@@ -4687,56 +4657,56 @@ done:
 fail16:
     Error("fail16\n");
 
-    GnttabTeardown(Fdo->GnttabContext);
-    Fdo->GnttabContext = NULL;
+    UnplugTeardown(Fdo->UnplugContext);
+    Fdo->UnplugContext = NULL;
 
 fail15:
     Error("fail15\n");
 
-    CacheTeardown(Fdo->CacheContext);
-    Fdo->CacheContext = NULL;
+    GnttabTeardown(Fdo->GnttabContext);
+    Fdo->GnttabContext = NULL;
 
 fail14:
     Error("fail14\n");
 
-    RangeSetTeardown(Fdo->RangeSetContext);
-    Fdo->RangeSetContext = NULL;
+    CacheTeardown(Fdo->CacheContext);
+    Fdo->CacheContext = NULL;
 
 fail13:
     Error("fail13\n");
 
-    StoreTeardown(Fdo->StoreContext);
-    Fdo->StoreContext = NULL;
+    RangeSetTeardown(Fdo->RangeSetContext);
+    Fdo->RangeSetContext = NULL;
 
 fail12:
     Error("fail12\n");
 
-    EvtchnTeardown(Fdo->EvtchnContext);
-    Fdo->EvtchnContext = NULL;
+    StoreTeardown(Fdo->StoreContext);
+    Fdo->StoreContext = NULL;
 
 fail11:
     Error("fail11\n");
 
-    SharedInfoTeardown(Fdo->SharedInfoContext);
-    Fdo->SharedInfoContext = NULL;
+    EvtchnTeardown(Fdo->EvtchnContext);
+    Fdo->EvtchnContext = NULL;
 
 fail10:
     Error("fail10\n");
 
-    SuspendTeardown(Fdo->SuspendContext);
-    Fdo->SuspendContext = NULL;
+    SharedInfoTeardown(Fdo->SharedInfoContext);
+    Fdo->SharedInfoContext = NULL;
 
 fail9:
     Error("fail9\n");
 
-    DebugTeardown(Fdo->DebugContext);
-    Fdo->DebugContext = NULL;
+    SuspendTeardown(Fdo->SuspendContext);
+    Fdo->SuspendContext = NULL;
 
 fail8:
     Error("fail8\n");
 
-    RtlZeroMemory(&Fdo->UnplugInterface,
-                  sizeof (XENFILT_UNPLUG_INTERFACE));
+    DebugTeardown(Fdo->DebugContext);
+    Fdo->DebugContext = NULL;
 
 fail7:
     Error("fail7\n");
@@ -4834,6 +4804,9 @@ FdoDestroy(
             Fdo->BalloonContext = NULL;
         }
 
+        UnplugTeardown(Fdo->UnplugContext);
+        Fdo->UnplugContext = NULL;
+
         GnttabTeardown(Fdo->GnttabContext);
         Fdo->GnttabContext = NULL;
 
@@ -4858,9 +4831,6 @@ FdoDestroy(
         DebugTeardown(Fdo->DebugContext);
         Fdo->DebugContext = NULL;
 
-        RtlZeroMemory(&Fdo->UnplugInterface,
-                      sizeof (XENFILT_UNPLUG_INTERFACE));
-
         __FdoSetActive(Fdo, FALSE);
     }
 
diff --git a/src/xenbus/fdo.h b/src/xenbus/fdo.h
index 4b99ba0..1feef17 100644
--- a/src/xenbus/fdo.h
+++ b/src/xenbus/fdo.h
@@ -33,7 +33,6 @@
 #define _XENBUS_FDO_H
 
 #include <ntddk.h>
-#include <unplug_interface.h>
 
 #include "driver.h"
 #include "types.h"
@@ -249,10 +248,11 @@ FdoGetGnttabContext(
     IN  PXENBUS_FDO Fdo
     );
 
-extern VOID
-FdoGetUnplugInterface(
-    IN  PXENBUS_FDO                 Fdo,
-    OUT PXENFILT_UNPLUG_INTERFACE   UnplugInterface
+#include "unplug.h"
+
+extern PXENBUS_UNPLUG_CONTEXT
+FdoGetUnplugContext(
+    IN  PXENBUS_FDO Fdo
     );
 
 extern NTSTATUS
diff --git a/src/xenbus/pdo.c b/src/xenbus/pdo.c
index f305bb7..8e7f90a 100644
--- a/src/xenbus/pdo.c
+++ b/src/xenbus/pdo.c
@@ -362,11 +362,12 @@ typedef struct _XENBUS_PDO_REVISION {
     ULONG   RangeSetInterfaceVersion;
     ULONG   CacheInterfaceVersion;
     ULONG   GnttabInterfaceVersion;
+    ULONG   UnplugInterfaceVersion;
     ULONG   EmulatedInterfaceVersion;
 } XENBUS_PDO_REVISION, *PXENBUS_PDO_REVISION;
 
-#define DEFINE_REVISION(_N, _S, _SI, _E, _D, _ST, _R, _C, _G, _EM) \
-    { (_N), (_S), (_SI), (_E), (_D), (_ST), (_R), (_C), (_G), (_EM) }
+#define DEFINE_REVISION(_N, _S, _SI, _E, _D, _ST, _R, _C, _G, _U, _EM) \
+    { (_N), (_S), (_SI), (_E), (_D), (_ST), (_R), (_C), (_G), (_U), (_EM) }
 
 static XENBUS_PDO_REVISION PdoRevision[] = {
     DEFINE_REVISION_TABLE
@@ -426,6 +427,11 @@ PdoDumpRevisions(
         ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
                      Revision->GnttabInterfaceVersion == XENBUS_GNTTAB_INTERFACE_VERSION_MAX));
 
+        ASSERT3U(Revision->UnplugInterfaceVersion, >=, XENBUS_UNPLUG_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->UnplugInterfaceVersion, <=, XENBUS_UNPLUG_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->UnplugInterfaceVersion == XENBUS_UNPLUG_INTERFACE_VERSION_MAX));
+
         ASSERT3U(Revision->EmulatedInterfaceVersion, >=, XENFILT_EMULATED_INTERFACE_VERSION_MIN);
         ASSERT3U(Revision->EmulatedInterfaceVersion, <=, XENFILT_EMULATED_INTERFACE_VERSION_MAX);
         ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
@@ -442,6 +448,7 @@ PdoDumpRevisions(
              "RANGE_SET v%u "
              "CACHE v%u "
              "GNTTAB v%u "
+             "UNPLUG v%u\n"
              "EMULATED v%u\n",
              Revision->Number,
              Revision->SuspendInterfaceVersion,
@@ -452,6 +459,7 @@ PdoDumpRevisions(
              Revision->RangeSetInterfaceVersion,
              Revision->CacheInterfaceVersion,
              Revision->GnttabInterfaceVersion,
+             Revision->UnplugInterfaceVersion,
              Revision->EmulatedInterfaceVersion);
     }
 }
@@ -1010,6 +1018,7 @@ DEFINE_PDO_QUERY_INTERFACE(Store)
 DEFINE_PDO_QUERY_INTERFACE(RangeSet)
 DEFINE_PDO_QUERY_INTERFACE(Cache)
 DEFINE_PDO_QUERY_INTERFACE(Gnttab)
+DEFINE_PDO_QUERY_INTERFACE(Unplug)
 
 struct _INTERFACE_ENTRY {
     const GUID  *Guid;
@@ -1027,6 +1036,7 @@ static struct _INTERFACE_ENTRY PdoInterfaceTable[] = {
     { &GUID_XENBUS_RANGE_SET_INTERFACE, "RANGE_SET_INTERFACE", PdoQueryRangeSetInterface },
     { &GUID_XENBUS_CACHE_INTERFACE, "CACHE_INTERFACE", PdoQueryCacheInterface },
     { &GUID_XENBUS_GNTTAB_INTERFACE, "GNTTAB_INTERFACE", PdoQueryGnttabInterface },
+    { &GUID_XENBUS_UNPLUG_INTERFACE, "UNPLUG_INTERFACE", PdoQueryUnplugInterface },
     { &GUID_XENFILT_EMULATED_INTERFACE, "EMULATED_INTERFACE", PdoDelegateIrp },
     { NULL, NULL, NULL }
 };
diff --git a/src/xenbus/suspend.c b/src/xenbus/suspend.c
index b826795..fad35e4 100644
--- a/src/xenbus/suspend.c
+++ b/src/xenbus/suspend.c
@@ -33,8 +33,6 @@
 #include <stdarg.h>
 #include <xen.h>
 
-#include <unplug_interface.h>
-
 #include "suspend.h"
 #include "thread.h"
 #include "fdo.h"
@@ -58,7 +56,6 @@ struct _XENBUS_SUSPEND_CONTEXT {
     LIST_ENTRY                  LateList;
     XENBUS_DEBUG_INTERFACE      DebugInterface;
     PXENBUS_DEBUG_CALLBACK      DebugCallback;
-    XENFILT_UNPLUG_INTERFACE    UnplugInterface;
 };
 
 #define XENBUS_SUSPEND_TAG  'PSUS'
@@ -153,10 +150,6 @@ SuspendTrigger(
     KIRQL                   Irql;
     NTSTATUS                status;
 
-    status = STATUS_NOT_SUPPORTED;
-    if (Context->UnplugInterface.Interface.Context == NULL)
-        goto fail1;
-
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
     LogPrintf(LOG_LEVEL_INFO,
@@ -179,7 +172,7 @@ SuspendTrigger(
 
         HypercallPopulate();
 
-        XENFILT_UNPLUG(Replay, &Context->UnplugInterface);
+        UnplugDevices();
 
         for (ListEntry = Context->EarlyList.Flink;
              ListEntry != &Context->EarlyList;
@@ -216,11 +209,6 @@ SuspendTrigger(
     KeLowerIrql(Irql);
 
     return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return status;
 }
 
 static ULONG
@@ -338,13 +326,6 @@ SuspendAcquire(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    if (Context->UnplugInterface.Interface.Context != NULL) {
-        status = XENFILT_UNPLUG(Acquire, &Context->UnplugInterface);
-
-        if (!NT_SUCCESS(status))
-            goto fail3;
-    }
-
     Trace("<====\n");
 
 done:
@@ -352,14 +333,6 @@ done:
 
     return STATUS_SUCCESS;
 
-fail3:
-    Error("fail3\n");
-
-    XENBUS_DEBUG(Deregister,
-                 &Context->DebugInterface,
-                 Context->DebugCallback);
-    Context->DebugCallback = NULL;
-
 fail2:
     Error("fail2\n");
 
@@ -396,9 +369,6 @@ SuspendRelease(
 
     Context->Count = 0;
 
-    if (Context->UnplugInterface.Interface.Context != NULL)
-        XENFILT_UNPLUG(Release, &Context->UnplugInterface);
-
     XENBUS_DEBUG(Deregister,
                  &Context->DebugInterface,
                  Context->DebugCallback);
@@ -444,8 +414,6 @@ SuspendInitialize(
                                sizeof ((*Context)->DebugInterface));
     ASSERT(NT_SUCCESS(status));
 
-    FdoGetUnplugInterface(Fdo, &(*Context)->UnplugInterface);
-
     InitializeListHead(&(*Context)->EarlyList);
     InitializeListHead(&(*Context)->LateList);
     KeInitializeSpinLock(&(*Context)->Lock);
@@ -509,9 +477,6 @@ SuspendTeardown(
 
     Context->Fdo = NULL;
 
-    RtlZeroMemory(&Context->UnplugInterface,
-                  sizeof (XENFILT_UNPLUG_INTERFACE));
-
     RtlZeroMemory(&Context->DebugInterface,
                   sizeof (XENBUS_DEBUG_INTERFACE));
 
diff --git a/src/xenbus/unplug.c b/src/xenbus/unplug.c
new file mode 100644
index 0000000..0a1b27a
--- /dev/null
+++ b/src/xenbus/unplug.c
@@ -0,0 +1,241 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <ntddk.h>
+#include <ntstrsafe.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <xen.h>
+
+#include "unplug.h"
+#include "fdo.h"
+#include "mutex.h"
+#include "dbg_print.h"
+#include "assert.h"
+#include "util.h"
+
+struct _XENBUS_UNPLUG_CONTEXT {
+    KSPIN_LOCK  Lock;
+    LONG        References;
+    MUTEX       Mutex;
+};
+
+#define XENBUS_UNPLUG_TAG    'LPNU'
+
+static FORCEINLINE PVOID
+__UnplugAllocate(
+    IN  ULONG   Length
+    )
+{
+    return __AllocatePoolWithTag(NonPagedPool, Length, XENBUS_UNPLUG_TAG);
+}
+
+static FORCEINLINE VOID
+__UnplugFree(
+    IN  PVOID   Buffer
+    )
+{
+    ExFreePoolWithTag(Buffer, XENBUS_UNPLUG_TAG);
+}
+
+static VOID
+UnplugRequest(
+    IN  PINTERFACE                  Interface,
+    IN  XENBUS_UNPLUG_DEVICE_TYPE   Type,
+    IN  BOOLEAN                     Make
+    )
+{
+    PXENBUS_UNPLUG_CONTEXT          Context = Interface->Context;
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    AcquireMutex(&Context->Mutex);
+
+    switch (Type) {
+    case XENBUS_UNPLUG_DEVICE_TYPE_NICS:
+        Info("NICS (%s)\n", (Make) ? "MAKE" : "REVOKE");
+
+        if (Make)
+            (VOID) UnplugIncrementValue(UNPLUG_NICS);
+        else
+            (VOID) UnplugDecrementValue(UNPLUG_NICS);
+
+        break;
+
+    case XENBUS_UNPLUG_DEVICE_TYPE_DISKS:
+        Info("DISKS (%s)\n", (Make) ? "MAKE" : "REVOKE");
+
+        if (Make)
+            (VOID) UnplugIncrementValue(UNPLUG_DISKS);
+        else
+            (VOID) UnplugDecrementValue(UNPLUG_DISKS);
+
+        break;
+
+    default:
+        ASSERT(FALSE);
+        break;
+    }
+
+    ReleaseMutex(&Context->Mutex);
+}
+
+static NTSTATUS
+UnplugAcquire(
+    IN  PINTERFACE          Interface
+    )
+{
+    PXENBUS_UNPLUG_CONTEXT  Context = Interface->Context;
+    KIRQL                   Irql;
+
+    KeAcquireSpinLock(&Context->Lock, &Irql);
+
+    if (Context->References++ != 0)
+        goto done;
+
+    Trace("<===>\n");
+
+done:
+    KeReleaseSpinLock(&Context->Lock, Irql);
+
+    return STATUS_SUCCESS;
+}
+
+static VOID
+UnplugRelease(
+    IN  PINTERFACE          Interface
+    )
+{
+    PXENBUS_UNPLUG_CONTEXT  Context = Interface->Context;
+    KIRQL                   Irql;
+
+    KeAcquireSpinLock(&Context->Lock, &Irql);
+
+    if (--Context->References > 0)
+        goto done;
+
+    Trace("<===>\n");
+
+done:
+    KeReleaseSpinLock(&Context->Lock, Irql);
+}
+
+static struct _XENBUS_UNPLUG_INTERFACE_V1 UnplugInterfaceVersion1 = {
+    { sizeof (struct _XENBUS_UNPLUG_INTERFACE_V1), 1, NULL, NULL, NULL },
+    UnplugAcquire,
+    UnplugRelease,
+    UnplugRequest
+};
+
+NTSTATUS
+UnplugInitialize(
+    IN  PXENBUS_FDO             Fdo,
+    OUT PXENBUS_UNPLUG_CONTEXT  *Context
+    )
+{
+    NTSTATUS                    status;
+
+    UNREFERENCED_PARAMETER(Fdo);
+
+    Trace("====>\n");
+
+    *Context = __UnplugAllocate(sizeof (XENBUS_UNPLUG_CONTEXT));
+
+    status = STATUS_NO_MEMORY;
+    if (*Context == NULL)
+        goto fail1;
+
+    KeInitializeSpinLock(&(*Context)->Lock);
+    InitializeMutex(&(*Context)->Mutex);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+NTSTATUS
+UnplugGetInterface(
+    IN      PXENBUS_UNPLUG_CONTEXT  Context,
+    IN      ULONG                   Version,
+    IN OUT  PINTERFACE              Interface,
+    IN      ULONG                   Size
+    )
+{
+    NTSTATUS                        status;
+
+    ASSERT(Context != NULL);
+
+    switch (Version) {
+    case 1: {
+        struct _XENBUS_UNPLUG_INTERFACE_V1   *UnplugInterface;
+
+        UnplugInterface = (struct _XENBUS_UNPLUG_INTERFACE_V1 *)Interface;
+
+        status = STATUS_BUFFER_OVERFLOW;
+        if (Size < sizeof (struct _XENBUS_UNPLUG_INTERFACE_V1))
+            break;
+
+        *UnplugInterface = UnplugInterfaceVersion1;
+
+        ASSERT3U(Interface->Version, ==, Version);
+        Interface->Context = Context;
+
+        status = STATUS_SUCCESS;
+        break;
+    }
+    default:
+        status = STATUS_NOT_SUPPORTED;
+        break;
+    }
+
+    return status;
+}
+
+VOID
+UnplugTeardown(
+    IN  PXENBUS_UNPLUG_CONTEXT  Context
+    )
+{
+    Trace("====>\n");
+
+    RtlZeroMemory(&Context->Mutex, sizeof (MUTEX));
+    RtlZeroMemory(&Context->Lock, sizeof (KSPIN_LOCK));
+
+    ASSERT(IsZeroMemory(Context, sizeof (XENBUS_UNPLUG_CONTEXT)));
+    __UnplugFree(Context);
+
+    Trace("<====\n");
+}
diff --git a/src/xenbus/unplug.h b/src/xenbus/unplug.h
new file mode 100644
index 0000000..416b2d4
--- /dev/null
+++ b/src/xenbus/unplug.h
@@ -0,0 +1,62 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XENBUS_UNPLUG_H
+#define _XENBUS_UNPLUG_H
+
+#include <ntddk.h>
+#include <xen.h>
+#include <unplug_interface.h>
+
+typedef struct _XENBUS_UNPLUG_CONTEXT  XENBUS_UNPLUG_CONTEXT, *PXENBUS_UNPLUG_CONTEXT;
+
+#include "fdo.h"
+
+extern NTSTATUS
+UnplugInitialize(
+    IN  PXENBUS_FDO             Fdo,
+    OUT PXENBUS_UNPLUG_CONTEXT  *Context
+    );
+
+extern NTSTATUS
+UnplugGetInterface(
+    IN      PXENBUS_UNPLUG_CONTEXT  Context,
+    IN      ULONG                   Version,
+    IN OUT  PINTERFACE              Interface,
+    IN      ULONG                   Size
+    );
+
+extern VOID
+UnplugTeardown(
+    IN  PXENBUS_UNPLUG_CONTEXT   Context
+    );
+
+#endif  // _XENBUS_UNPLUG_H
diff --git a/src/xenfilt/driver.c b/src/xenfilt/driver.c
index 16ed6f7..f0ffac0 100644
--- a/src/xenfilt/driver.c
+++ b/src/xenfilt/driver.c
@@ -38,7 +38,6 @@
 #include "pdo.h"
 #include "driver.h"
 #include "emulated.h"
-#include "unplug.h"
 #include "mutex.h"
 #include "dbg_print.h"
 #include "assert.h"
@@ -50,7 +49,6 @@ extern PULONG       InitSafeBootMode;
 typedef struct _XENFILT_DRIVER {
     PDRIVER_OBJECT              DriverObject;
     HANDLE                      ParametersKey;
-    HANDLE                      UnplugKey;
 
     PCHAR                       ActiveDeviceID;
     PCHAR                       ActiveInstanceID;
@@ -61,12 +59,7 @@ typedef struct _XENFILT_DRIVER {
     XENFILT_FILTER_STATE        FilterState;
 
     PXENFILT_EMULATED_CONTEXT   EmulatedContext;
-    PXENFILT_UNPLUG_CONTEXT     UnplugContext;
-
     XENFILT_EMULATED_INTERFACE  EmulatedInterface;
-    XENFILT_UNPLUG_INTERFACE    UnplugInterface;
-
-    BOOLEAN                     UnplugAcquired;
 } XENFILT_DRIVER, *PXENFILT_DRIVER;
 
 static XENFILT_DRIVER   Driver;
@@ -138,27 +131,27 @@ DriverGetParametersKey(
 }
 
 static FORCEINLINE VOID
-__DriverSetUnplugKey(
-    IN  HANDLE  Key
+__DriverSetEmulatedContext(
+    IN  PXENFILT_EMULATED_CONTEXT   Context
     )
 {
-    Driver.UnplugKey = Key;
+    Driver.EmulatedContext = Context;
 }
 
-static FORCEINLINE HANDLE
-__DriverGetUnplugKey(
+static FORCEINLINE PXENFILT_EMULATED_CONTEXT
+__DriverGetEmulatedContext(
     VOID
     )
 {
-    return Driver.UnplugKey;
+    return Driver.EmulatedContext;
 }
 
-HANDLE
-DriverGetUnplugKey(
+PXENFILT_EMULATED_CONTEXT
+DriverGetEmulatedContext(
     VOID
     )
 {
-    return __DriverGetUnplugKey();
+    return __DriverGetEmulatedContext();
 }
 
 static FORCEINLINE VOID
@@ -226,26 +219,6 @@ DriverRemoveFunctionDeviceObject(
     --Driver.References;
 }
 
-#define DEFINE_DRIVER_GET_CONTEXT(_Interface, _Type)            \
-static FORCEINLINE _Type                                        \
-__DriverGet ## _Interface ## Context(                           \
-    VOID                                                        \
-    )                                                           \
-{                                                               \
-    return Driver. ## _Interface ## Context;                    \
-}                                                               \
-                                                                \
-_Type                                                           \
-DriverGet ## _Interface ## Context(                             \
-    VOID                                                        \
-    )                                                           \
-{                                                               \
-    return __DriverGet ## _Interface ## Context();              \
-}
-
-DEFINE_DRIVER_GET_CONTEXT(Emulated, PXENFILT_EMULATED_CONTEXT)
-DEFINE_DRIVER_GET_CONTEXT(Unplug, PXENFILT_UNPLUG_CONTEXT)
-
 #define SERVICES_KEY L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services"
 
 #define SERVICE_KEY(_Driver)    \
@@ -387,7 +360,6 @@ DriverSetFilterState(
     case XENFILT_FILTER_ENABLED: {
         PLIST_ENTRY ListEntry;
         BOOLEAN     Present;
-        NTSTATUS    status;
 
         // Assume all FDOs have enumerated until we know otherwise
         Driver.FilterState = XENFILT_FILTER_PENDING;
@@ -414,10 +386,8 @@ DriverSetFilterState(
 
         Info("ACTIVE DEVICE %sPRESENT\n", (!Present) ? "NOT " : "");
 
-        if (Present) {
-            status = XENFILT_UNPLUG(Acquire, &Driver.UnplugInterface);
-            Driver.UnplugAcquired = NT_SUCCESS(status) ? TRUE : FALSE;
-        }
+        if (Present)
+            UnplugDevices();
 
         Info("PENDING\n");
         break;
@@ -461,7 +431,6 @@ DriverUnload(
     )
 {
     HANDLE              ParametersKey;
-    HANDLE              UnplugKey;
 
     ASSERT3P(DriverObject, ==, __DriverGetDriverObject());
 
@@ -477,23 +446,11 @@ DriverUnload(
     RtlZeroMemory(&Driver.List, sizeof (LIST_ENTRY));
     RtlZeroMemory(&Driver.Mutex, sizeof (MUTEX));
 
-    if (Driver.UnplugAcquired) {
-        XENFILT_UNPLUG(Release, &Driver.UnplugInterface);
-
-        Driver.UnplugAcquired = FALSE;
-    }
-
     XENFILT_EMULATED(Release, &Driver.EmulatedInterface);
 
-    RtlZeroMemory(&Driver.UnplugInterface,
-                  sizeof (XENFILT_UNPLUG_INTERFACE));
-
     RtlZeroMemory(&Driver.EmulatedInterface,
                   sizeof (XENFILT_EMULATED_INTERFACE));
 
-    UnplugTeardown(Driver.UnplugContext);
-    Driver.UnplugContext = NULL;
-
     EmulatedTeardown(Driver.EmulatedContext);
     Driver.EmulatedContext = NULL;
 
@@ -505,10 +462,6 @@ DriverUnload(
         Driver.ActiveInstanceID = NULL;
     }
 
-    UnplugKey = __DriverGetUnplugKey();
-    __DriverSetUnplugKey(NULL);
-    RegistryCloseKey(UnplugKey);
-
     ParametersKey = __DriverGetParametersKey();
     __DriverSetParametersKey(NULL);
     RegistryCloseKey(ParametersKey);
@@ -763,15 +716,15 @@ DRIVER_INITIALIZE   DriverEntry;
 
 NTSTATUS
 DriverEntry(
-    IN  PDRIVER_OBJECT  DriverObject,
-    IN  PUNICODE_STRING RegistryPath
+    IN  PDRIVER_OBJECT          DriverObject,
+    IN  PUNICODE_STRING         RegistryPath
     )
 {
-    HANDLE              ServiceKey;
-    HANDLE              ParametersKey;
-    HANDLE              UnplugKey;
-    ULONG               Index;
-    NTSTATUS            status;
+    HANDLE                      ServiceKey;
+    HANDLE                      ParametersKey;
+    PXENFILT_EMULATED_CONTEXT   EmulatedContext;
+    ULONG                       Index;
+    NTSTATUS                    status;
 
     ASSERT3P(__DriverGetDriverObject(), ==, NULL);
 
@@ -820,23 +773,15 @@ DriverEntry(
 
     __DriverSetParametersKey(ParametersKey);
 
-    status = RegistryOpenSubKey(ServiceKey, "Unplug", KEY_READ, &UnplugKey);
+    status = DriverSetActiveDeviceInstance();
     if (!NT_SUCCESS(status))
         goto fail4;
 
-    __DriverSetUnplugKey(UnplugKey);
-
-    status = DriverSetActiveDeviceInstance();
+    status = EmulatedInitialize(&EmulatedContext);
     if (!NT_SUCCESS(status))
         goto fail5;
 
-    status = EmulatedInitialize(&Driver.EmulatedContext);
-    if (!NT_SUCCESS(status))
-        goto fail6;
-
-    status = UnplugInitialize(&Driver.UnplugContext);
-    if (!NT_SUCCESS(status))
-        goto fail7;
+    __DriverSetEmulatedContext(EmulatedContext);
 
     status = EmulatedGetInterface(__DriverGetEmulatedContext(),
                                   XENFILT_EMULATED_INTERFACE_VERSION_MAX,
@@ -845,16 +790,9 @@ DriverEntry(
     ASSERT(NT_SUCCESS(status));
     ASSERT(Driver.EmulatedInterface.Interface.Context != NULL);
 
-    status = UnplugGetInterface(__DriverGetUnplugContext(),
-                                 XENFILT_UNPLUG_INTERFACE_VERSION_MAX,
-                                 (PINTERFACE)&Driver.UnplugInterface,
-                                 sizeof (Driver.UnplugInterface));
-    ASSERT(NT_SUCCESS(status));
-    ASSERT(Driver.UnplugInterface.Interface.Context != NULL);
-
     status = XENFILT_EMULATED(Acquire, &Driver.EmulatedInterface);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail6;
 
     RegistryCloseKey(ServiceKey);
 
@@ -874,26 +812,14 @@ done:
     Trace("<====\n");
     return STATUS_SUCCESS;
 
-fail8:
-    Error("fail8\n");
-
-    RtlZeroMemory(&Driver.UnplugInterface,
-                  sizeof (XENFILT_UNPLUG_INTERFACE));
-
-    RtlZeroMemory(&Driver.EmulatedInterface,
-                  sizeof (XENFILT_EMULATED_INTERFACE));
-
-    UnplugTeardown(Driver.UnplugContext);
-    Driver.UnplugContext = NULL;
-
-fail7:
-    Error("fail7\n");
+fail6:
+    Error("fail6\n");
 
     EmulatedTeardown(Driver.EmulatedContext);
     Driver.EmulatedContext = NULL;
 
-fail6:
-    Error("fail6\n");
+fail5:
+    Error("fail5\n");
 
     if (Driver.ActiveDeviceID != NULL) {
         __DriverFree(Driver.ActiveDeviceID);
@@ -903,12 +829,6 @@ fail6:
         Driver.ActiveInstanceID = NULL;
     }
 
-fail5:
-    Error("fail5\n");
-
-    __DriverSetUnplugKey(NULL);
-    RegistryCloseKey(UnplugKey);
-
 fail4:
     Error("fail4\n");
 
diff --git a/src/xenfilt/driver.h b/src/xenfilt/driver.h
index 7079d27..f906d36 100644
--- a/src/xenfilt/driver.h
+++ b/src/xenfilt/driver.h
@@ -42,11 +42,6 @@ DriverGetParametersKey(
     VOID
     );
 
-extern HANDLE
-DriverGetUnplugKey(
-    VOID
-    );
-
 extern PCHAR
 DriverGetActiveDeviceID(
     VOID
@@ -90,13 +85,6 @@ DriverGetEmulatedContext(
     VOID
     );
 
-#include "unplug.h"
-
-PXENFILT_UNPLUG_CONTEXT
-DriverGetUnplugContext(
-    VOID
-    );
-
 typedef struct _XENFILT_FDO XENFILT_FDO, *PXENFILT_FDO;
 typedef struct _XENFILT_PDO XENFILT_PDO, *PXENFILT_PDO;
 
diff --git a/src/xenfilt/pdo.c b/src/xenfilt/pdo.c
index 230fdf0..6fab346 100644
--- a/src/xenfilt/pdo.c
+++ b/src/xenfilt/pdo.c
@@ -863,7 +863,6 @@ done:                                                               \
 }                                                                   \
 
 DEFINE_PDO_QUERY_INTERFACE(Emulated)
-DEFINE_PDO_QUERY_INTERFACE(Unplug)
 
 struct _INTERFACE_ENTRY {
     const GUID  *Guid;
@@ -876,7 +875,6 @@ struct _INTERFACE_ENTRY {
 
 struct _INTERFACE_ENTRY PdoInterfaceTable[] = {
     DEFINE_INTERFACE_ENTRY(EMULATED_INTERFACE, Emulated),
-    DEFINE_INTERFACE_ENTRY(UNPLUG_INTERFACE, Unplug),
     { NULL, NULL, NULL }
 };
 
diff --git a/src/xenfilt/unplug.c b/src/xenfilt/unplug.c
deleted file mode 100644
index 0c0948d..0000000
--- a/src/xenfilt/unplug.c
+++ /dev/null
@@ -1,467 +0,0 @@
-/* Copyright (c) Citrix Systems Inc.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, 
- * with or without modification, are permitted provided 
- * that the following conditions are met:
- * 
- * *   Redistributions of source code must retain the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer.
- * *   Redistributions in binary form must reproduce the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer in the documentation and/or other 
- *     materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
- * SUCH DAMAGE.
- */
-
-#include <ntddk.h>
-#include <ntstrsafe.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <xen.h>
-#include <version.h>
-
-#include "driver.h"
-#include "high.h"
-#include "registry.h"
-#include "unplug.h"
-#include "dbg_print.h"
-#include "assert.h"
-#include "util.h"
-
-struct _XENFILT_UNPLUG_CONTEXT {
-    KSPIN_LOCK  Lock;
-    LONG        References;
-    HIGH_LOCK   UnplugLock;
-    BOOLEAN     BlackListed;
-    BOOLEAN     UnplugDisks;
-    BOOLEAN     UnplugNics;
-    BOOLEAN     BootEmulated;
-};
-
-typedef enum _XENFILT_UNPLUG_TYPE {
-    XENFILT_UNPLUG_DISKS = 0,
-    XENFILT_UNPLUG_NICS
-} XENFILT_UNPLUG_TYPE, *PXENFILT_UNPLUG_TYPE;
-
-#define XENFILT_UNPLUG_TAG  'LPNU'
-
-static FORCEINLINE PVOID
-__UnplugAllocate(
-    IN  ULONG   Length
-    )
-{
-    return __AllocatePoolWithTag(NonPagedPool, Length, XENFILT_UNPLUG_TAG);
-}
-
-static FORCEINLINE VOID
-__UnplugFree(
-    IN  PVOID   Buffer
-    )
-{
-    ExFreePoolWithTag(Buffer, XENFILT_UNPLUG_TAG);
-}
-
-static VOID
-UnplugGetFlags(
-    IN  PXENFILT_UNPLUG_CONTEXT Context
-    )
-{
-    HANDLE                      Key;
-    DWORD                       Value;
-    NTSTATUS                    status;
-
-    Context->BootEmulated = FALSE;
-
-    Key = DriverGetParametersKey();
-
-    status = RegistryQueryDwordValue(Key,
-                                     "BootEmulated",
-                                     &Value);
-    if (NT_SUCCESS(status)) {
-        LogPrintf(LOG_LEVEL_WARNING,
-                  "UNPLUG: BOOT_EMULATED %d\n",
-                  Value);
-
-        Context->BootEmulated = (Value == 1) ? TRUE : FALSE;
-    }
-}
-
-static VOID
-UnplugRequest(
-    IN  PXENFILT_UNPLUG_CONTEXT Context,
-    IN  XENFILT_UNPLUG_TYPE     Type
-    )
-{
-    switch (Type) {
-    case XENFILT_UNPLUG_DISKS:
-        if (Context->BootEmulated) {
-#pragma prefast(suppress:28138)
-            WRITE_PORT_USHORT((PUSHORT)0x10, 0x0004);
-
-            LogPrintf(LOG_LEVEL_WARNING, "UNPLUG: AUX DISKS\n");
-        } else {
-#pragma prefast(suppress:28138)
-            WRITE_PORT_USHORT((PUSHORT)0x10, 0x0001);
-
-            LogPrintf(LOG_LEVEL_WARNING, "UNPLUG: DISKS\n");
-        }
-        break;
-    case XENFILT_UNPLUG_NICS:
-#pragma prefast(suppress:28138)
-        WRITE_PORT_USHORT((PUSHORT)0x10, 0x0002);
-
-        LogPrintf(LOG_LEVEL_WARNING, "UNPLUG: NICS\n");
-        break;
-    default:
-        ASSERT(FALSE);
-    }
-}
-
-static NTSTATUS
-UnplugPreamble(
-    IN  PXENFILT_UNPLUG_CONTEXT Context
-    )
-{
-    USHORT                      Magic;
-    UCHAR                       Version;
-    NTSTATUS                    status;
-
-    // See docs/misc/hvm-emulated-unplug.markdown for details of the
-    // protocol in use here
-
-#pragma prefast(suppress:28138)
-    Magic = READ_PORT_USHORT((PUSHORT)0x10);
-    
-    if (Magic == 0xd249) {
-        Context->BlackListed = TRUE;
-        goto done;
-    }
-
-    status = STATUS_NOT_SUPPORTED;
-    if (Magic != 0x49d2)
-        goto fail1;
-
-#pragma prefast(suppress:28138)
-    Version = READ_PORT_UCHAR((PUCHAR)0x12);
-    if (Version != 0) {
-#pragma prefast(suppress:28138)
-        WRITE_PORT_USHORT((PUSHORT)0x12, 0xFFFF);   // FIXME
-
-#pragma prefast(suppress:28138)
-        WRITE_PORT_ULONG((PULONG)0x10, 
-                         (MAJOR_VERSION << 16) |
-                         (MINOR_VERSION << 8) |
-                         MICRO_VERSION);
-
-#pragma prefast(suppress:28138)
-        Magic = READ_PORT_USHORT((PUSHORT)0x10);
-        if (Magic == 0xd249)
-            Context->BlackListed = TRUE;
-    }
-
-done:
-    LogPrintf(LOG_LEVEL_WARNING,
-              "UNPLUG: PRE-AMBLE (DRIVERS %s)\n",
-              (Context->BlackListed) ? "BLACKLISTED" : "NOT BLACKLISTED");
-
-    return STATUS_SUCCESS;
-
-fail1:
-    return status;
-}
-
-#define HKEY_LOCAL_MACHINE  "\\Registry\\Machine"
-#define SERVICES_KEY        HKEY_LOCAL_MACHINE "\\SYSTEM\\CurrentControlSet\\Services"
-
-static VOID
-UnplugCheckForPVDisks(
-    IN  PXENFILT_UNPLUG_CONTEXT Context
-    )
-{
-    HANDLE                      UnplugKey;
-    PANSI_STRING                ServiceNames;
-    ULONG                       Count;
-    ULONG                       Index;
-    KIRQL                       Irql;
-    NTSTATUS                    status;
-
-    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
-
-    UnplugKey = DriverGetUnplugKey();
-
-    ServiceNames = NULL;
-
-    status = RegistryQuerySzValue(UnplugKey,
-                                  "DISKS",
-                                  &ServiceNames);
-    if (!NT_SUCCESS(status))
-        goto done;
-
-    Count = 0;
-    for (Index = 0; ServiceNames[Index].Buffer != NULL; Index++)
-        if (_stricmp(ServiceNames[Index].Buffer, "XENVBD") == 0)
-            Count++;
-
-    if (Count < 1)
-        goto done;
-
-    AcquireHighLock(&Context->UnplugLock, &Irql);
-    Context->UnplugDisks = TRUE;
-    ReleaseHighLock(&Context->UnplugLock, Irql);
-
-done:
-    Info("%s\n", (Context->UnplugDisks) ? "PRESENT" : "NOT PRESENT");
-
-    if (ServiceNames != NULL)
-        RegistryFreeSzValue(ServiceNames);
-}
-
-static VOID
-UnplugCheckForPVNics(
-    IN  PXENFILT_UNPLUG_CONTEXT Context
-    )
-{
-    HANDLE                      UnplugKey;
-    PANSI_STRING                ServiceNames;
-    ULONG                       Count;
-    ULONG                       Index;
-    KIRQL                       Irql;
-    NTSTATUS                    status;
-
-    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
-
-    UnplugKey = DriverGetUnplugKey();
-
-    ServiceNames = NULL;
-
-    status = RegistryQuerySzValue(UnplugKey,
-                                  "NICS",
-                                  &ServiceNames);
-    if (!NT_SUCCESS(status))
-        goto done;
-
-    Count = 0;
-    for (Index = 0; ServiceNames[Index].Buffer != NULL; Index++)
-        if (_stricmp(ServiceNames[Index].Buffer, "XENVIF") == 0 ||
-            _stricmp(ServiceNames[Index].Buffer, "XENNET") == 0)
-            Count++;
-
-    if (Count < 2)
-        goto done;
-
-    AcquireHighLock(&Context->UnplugLock, &Irql);
-    Context->UnplugNics = TRUE;
-    ReleaseHighLock(&Context->UnplugLock, Irql);
-
-done:
-    Info("%s\n", (Context->UnplugNics) ? "PRESENT" : "NOT PRESENT");
-
-    if (ServiceNames != NULL)
-        RegistryFreeSzValue(ServiceNames);
-}
-
-static VOID
-UnplugReplay(
-    IN  PINTERFACE          Interface
-    )
-{
-    PXENFILT_UNPLUG_CONTEXT Context = Interface->Context;
-    KIRQL                   Irql;
-    NTSTATUS                status;
-
-    AcquireHighLock(&Context->UnplugLock, &Irql);
-
-    status = UnplugPreamble(Context);
-    ASSERT(NT_SUCCESS(status));
-
-    if (Context->UnplugDisks)
-        UnplugRequest(Context, XENFILT_UNPLUG_DISKS);
-
-    if (Context->UnplugNics)
-        UnplugRequest(Context, XENFILT_UNPLUG_NICS);
-    
-    ReleaseHighLock(&Context->UnplugLock, Irql);
-}
-
-NTSTATUS
-UnplugAcquire(
-    IN  PINTERFACE          Interface
-    )
-{
-    PXENFILT_UNPLUG_CONTEXT Context = Interface->Context;
-    KIRQL                   Irql;
-    NTSTATUS                status;
-
-    KeAcquireSpinLock(&Context->Lock, &Irql);
-
-    if (Context->References++ != 0)
-        goto done;
-
-    Trace("====>\n");
-
-    (VOID)__AcquireHighLock(&Context->UnplugLock);
-
-    status = UnplugPreamble(Context);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
-    if (Context->UnplugDisks)
-        UnplugRequest(Context, XENFILT_UNPLUG_DISKS);
-
-    if (Context->UnplugNics)
-        UnplugRequest(Context, XENFILT_UNPLUG_NICS);
-    
-    ReleaseHighLock(&Context->UnplugLock, DISPATCH_LEVEL);
-
-    Trace("<====\n");
-
-done:
-    KeReleaseSpinLock(&Context->Lock, Irql);
-
-    return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    ReleaseHighLock(&Context->UnplugLock, DISPATCH_LEVEL);
-
-    KeReleaseSpinLock(&Context->Lock, Irql);
-
-    return status;
-}
-
-VOID
-UnplugRelease(
-    IN  PINTERFACE              Interface
-    )
-{
-    PXENFILT_UNPLUG_CONTEXT     Context = Interface->Context;
-    KIRQL                       Irql;
-
-    KeAcquireSpinLock(&Context->Lock, &Irql);
-
-    if (--Context->References > 0)
-        goto done;
-
-    Trace("====>\n");
-
-    Context->BlackListed = FALSE;
-
-    Trace("<====\n");
-
-done:
-    KeReleaseSpinLock(&Context->Lock, Irql);
-}
-
-static struct _XENFILT_UNPLUG_INTERFACE_V1 UnplugInterfaceVersion1 = {
-    { sizeof (struct _XENFILT_UNPLUG_INTERFACE_V1), 1, NULL, NULL, NULL },
-    UnplugAcquire,
-    UnplugRelease,
-    UnplugReplay
-};
-                     
-NTSTATUS
-UnplugInitialize(
-    OUT PXENFILT_UNPLUG_CONTEXT *Context
-    )
-{
-    NTSTATUS                    status;
-
-    Trace("====>\n");
-
-    *Context = __UnplugAllocate(sizeof (XENFILT_UNPLUG_CONTEXT));
-
-    status = STATUS_NO_MEMORY;
-    if (*Context == NULL)
-        goto fail1;
-
-    UnplugCheckForPVDisks(*Context);
-    UnplugCheckForPVNics(*Context);
-    UnplugGetFlags(*Context);
-
-    KeInitializeSpinLock(&(*Context)->Lock);
-    InitializeHighLock(&(*Context)->UnplugLock);
-
-    Trace("<====\n");
-
-    return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return status;
-}
-
-NTSTATUS
-UnplugGetInterface(
-    IN      PXENFILT_UNPLUG_CONTEXT Context,
-    IN      ULONG                   Version,
-    IN OUT  PINTERFACE              Interface,
-    IN      ULONG                   Size
-    )
-{
-    NTSTATUS                        status;
-
-    ASSERT(Context != NULL);
-
-    switch (Version) {
-    case 1: {
-        struct _XENFILT_UNPLUG_INTERFACE_V1 *UnplugInterface;
-
-        UnplugInterface = (struct _XENFILT_UNPLUG_INTERFACE_V1 *)Interface;
-
-        status = STATUS_BUFFER_OVERFLOW;
-        if (Size < sizeof (struct _XENFILT_UNPLUG_INTERFACE_V1))
-            break;
-
-        *UnplugInterface = UnplugInterfaceVersion1;
-
-        ASSERT3U(Interface->Version, ==, Version);
-        Interface->Context = Context;
-
-        status = STATUS_SUCCESS;
-        break;
-    }
-    default:
-        status = STATUS_NOT_SUPPORTED;
-        break;
-    }
-
-    return status;
-}   
-
-VOID
-UnplugTeardown(
-    IN  PXENFILT_UNPLUG_CONTEXT Context
-    )
-{
-    Trace("====>\n");
-
-    Context->BootEmulated = FALSE;
-    Context->UnplugNics = FALSE;
-    Context->UnplugDisks = FALSE;
-
-    RtlZeroMemory(&Context->UnplugLock, sizeof (HIGH_LOCK));
-    RtlZeroMemory(&Context->Lock, sizeof (KSPIN_LOCK));
-
-    ASSERT(IsZeroMemory(Context, sizeof (XENFILT_UNPLUG_CONTEXT)));
-    __UnplugFree(Context);
-
-    Trace("<====\n");
-}
diff --git a/src/xenfilt/unplug.h b/src/xenfilt/unplug.h
deleted file mode 100644
index 191d8e2..0000000
--- a/src/xenfilt/unplug.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Copyright (c) Citrix Systems Inc.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, 
- * with or without modification, are permitted provided 
- * that the following conditions are met:
- * 
- * *   Redistributions of source code must retain the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer.
- * *   Redistributions in binary form must reproduce the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer in the documentation and/or other 
- *     materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
- * SUCH DAMAGE.
- */
-
-#ifndef _XENFILT_UNPLUG_H
-#define _XENFILT_UNPLUG_H
-
-#include <ntddk.h>
-#include <xen.h>
-#include <unplug_interface.h>
-
-typedef struct _XENFILT_UNPLUG_CONTEXT  XENFILT_UNPLUG_CONTEXT, *PXENFILT_UNPLUG_CONTEXT;
-
-extern NTSTATUS
-UnplugInitialize(
-    OUT PXENFILT_UNPLUG_CONTEXT *Context
-    );
-
-extern NTSTATUS
-UnplugGetInterface(
-    IN      PXENFILT_UNPLUG_CONTEXT Context,
-    IN      ULONG                   Version,
-    IN OUT  PINTERFACE              Interface,
-    IN      ULONG                   Size
-    );
-
-extern VOID
-UnplugTeardown(
-    IN  PXENFILT_UNPLUG_CONTEXT Context
-    );
-
-#endif  // _XENFILT_UNPLUG_H
diff --git a/vs2012/xen/xen.vcxproj b/vs2012/xen/xen.vcxproj
index df966af..0ffb844 100644
--- a/vs2012/xen/xen.vcxproj
+++ b/vs2012/xen/xen.vcxproj
@@ -90,6 +90,7 @@
     <ClCompile Include="..\..\src\xen\process.c" />
     <ClCompile Include="..\..\src\xen\acpi.c" />
     <ClCompile Include="..\..\src\xen\system.c" />
+    <ClCompile Include="..\..\src\xen\unplug.c" />
   </ItemGroup>
   <ItemGroup>
     <MASM Include="..\..\src\xen\amd64\hypercall_thunk.asm">
diff --git a/vs2012/xenbus/xenbus.vcxproj b/vs2012/xenbus/xenbus.vcxproj
index ab78a02..82f0dbf 100644
--- a/vs2012/xenbus/xenbus.vcxproj
+++ b/vs2012/xenbus/xenbus.vcxproj
@@ -94,6 +94,7 @@
     <ClCompile Include="..\..\src\xenbus\balloon.c" />
     <ClCompile Include="..\..\src\xenbus\cache.c" />
     <ClCompile Include="..\..\src\xenbus\hash_table.c" />
+    <ClCompile Include="..\..\src\xenbus\unplug.c" />
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="..\..\src\xenbus\xenbus.rc" />
diff --git a/vs2012/xenfilt/xenfilt.vcxproj b/vs2012/xenfilt/xenfilt.vcxproj
index 34efda4..4d5747d 100644
--- a/vs2012/xenfilt/xenfilt.vcxproj
+++ b/vs2012/xenfilt/xenfilt.vcxproj
@@ -68,7 +68,6 @@
   <ItemGroup>
     <ClCompile Include="../../src/common/registry.c" />
     <ClCompile Include="../../src/xenfilt/driver.c" />
-    <ClCompile Include="../../src/xenfilt/unplug.c" />
     <ClCompile Include="../../src/xenfilt/emulated.c" />
     <ClCompile Include="../../src/xenfilt/fdo.c" />
     <ClCompile Include="../../src/xenfilt/pdo.c" />
diff --git a/vs2013/xen/xen.vcxproj b/vs2013/xen/xen.vcxproj
index cd40452..9330d8d 100644
--- a/vs2013/xen/xen.vcxproj
+++ b/vs2013/xen/xen.vcxproj
@@ -93,6 +93,7 @@
     <ClCompile Include="..\..\src\xen\process.c" />
     <ClCompile Include="..\..\src\xen\acpi.c" />
     <ClCompile Include="..\..\src\xen\system.c" />
+    <ClCompile Include="..\..\src\xen\unplug.c" />
   </ItemGroup>
   <ItemGroup>
     <MASM Include="..\..\src\xen\amd64\hypercall_thunk.asm">
diff --git a/vs2013/xenbus/xenbus.vcxproj b/vs2013/xenbus/xenbus.vcxproj
index ca486c9..fb0b0dd 100644
--- a/vs2013/xenbus/xenbus.vcxproj
+++ b/vs2013/xenbus/xenbus.vcxproj
@@ -97,6 +97,7 @@
     <ClCompile Include="..\..\src\xenbus\balloon.c" />
     <ClCompile Include="..\..\src\xenbus\cache.c" />
     <ClCompile Include="..\..\src\xenbus\hash_table.c" />
+    <ClCompile Include="..\..\src\xenbus\unplug.c" />
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="..\..\src\xenbus\xenbus.rc" />
diff --git a/vs2013/xenfilt/xenfilt.vcxproj b/vs2013/xenfilt/xenfilt.vcxproj
index db4a437..4f749b1 100644
--- a/vs2013/xenfilt/xenfilt.vcxproj
+++ b/vs2013/xenfilt/xenfilt.vcxproj
@@ -71,7 +71,6 @@
   <ItemGroup>
     <ClCompile Include="../../src/common/registry.c" />
     <ClCompile Include="../../src/xenfilt/driver.c" />
-    <ClCompile Include="../../src/xenfilt/unplug.c" />
     <ClCompile Include="../../src/xenfilt/emulated.c" />
     <ClCompile Include="../../src/xenfilt/fdo.c" />
     <ClCompile Include="../../src/xenfilt/pdo.c" />
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:21:40 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:21:40 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7GW-0001yB-Cq; Mon, 20 Jul 2015 09:21:40 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7GU-0001y6-Pc
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:21:38 +0000
Received: from [85.158.139.211] by server-10.bemta-5.messagelabs.com id
	41/C6-24486-2ADBCA55; Mon, 20 Jul 2015 09:21:38 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-206.messagelabs.com!1437384097!16974477!1
X-Originating-IP: [209.85.212.175]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13111 invoked from network); 20 Jul 2015 09:21:37 -0000
Received: from mail-wi0-f175.google.com (HELO mail-wi0-f175.google.com)
	(209.85.212.175)
	by server-10.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:21:37 -0000
Received: by wibxm9 with SMTP id xm9so86226711wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:21:37 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=18pB6nL39lFlUiAVPH71H/toIXJ1RU94aNaGUdqZiTs=;
	b=NgSA4XqwFxOzlnNHzG6vrSZj9ER3dR+V8PreTLwx1DVfBe2gUuy9kUopE2qo4zMWyu
	2WQsP1UbTWmzSTfFAZ3wJhxFST2CMChr4JlU62zce2OrkvTZUKUhQn8mYuNwpVuRWChR
	SAQUo+15/8c61UaQqgWNClygODJIrcWgXCgrwL2/4o2SKyllm81+OkRCTIoqFA8ihJQE
	IhOy9BFmQtIufSRFMsuyG8227aj32XUYUQf1shoFkvr1IBmyrbfC6m6jRRU3W6I1D/1F
	lh5KIrmtLK3u/pVOMITbS/wIfjRSb0cHeMjaqvfGw2cYX5N2q/CIEalRxaeJpDHL1Y0F
	UnMw==
X-Received: by 10.180.97.7 with SMTP id dw7mr20123711wib.74.1437384097375;
	Mon, 20 Jul 2015 02:21:37 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id n6sm10871100wix.1.2015.07.20.02.21.36
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:21:36 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:21:29 +0100
Message-Id: <1437384092-17504-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/4] Remove PDO Luid field
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It's not used any more.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/pdo.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 46dc20d..ec4a248 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -79,7 +79,6 @@ struct _XENVIF_PDO {
     PULONG                      Revision;
     ULONG                       Count;
 
-    NET_LUID                    Luid;
     ETHERNET_ADDRESS            PermanentAddress;
     ETHERNET_ADDRESS            CurrentAddress;
 
@@ -1325,8 +1324,6 @@ PdoStopDevice(
 
     PdoD0ToD3(Pdo);
 
-    RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID));
-
     RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
 
     __PdoSetDevicePnpState(Pdo, Stopped);
@@ -1411,8 +1408,6 @@ PdoRemoveDevice(
     PdoD0ToD3(Pdo);
 
 done:
-    RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID));
-
     RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
 
     NeedInvalidate = FALSE;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:21:40 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:21:40 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7GW-0001yB-Cq; Mon, 20 Jul 2015 09:21:40 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7GU-0001y6-Pc
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:21:38 +0000
Received: from [85.158.139.211] by server-10.bemta-5.messagelabs.com id
	41/C6-24486-2ADBCA55; Mon, 20 Jul 2015 09:21:38 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-206.messagelabs.com!1437384097!16974477!1
X-Originating-IP: [209.85.212.175]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13111 invoked from network); 20 Jul 2015 09:21:37 -0000
Received: from mail-wi0-f175.google.com (HELO mail-wi0-f175.google.com)
	(209.85.212.175)
	by server-10.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:21:37 -0000
Received: by wibxm9 with SMTP id xm9so86226711wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:21:37 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=18pB6nL39lFlUiAVPH71H/toIXJ1RU94aNaGUdqZiTs=;
	b=NgSA4XqwFxOzlnNHzG6vrSZj9ER3dR+V8PreTLwx1DVfBe2gUuy9kUopE2qo4zMWyu
	2WQsP1UbTWmzSTfFAZ3wJhxFST2CMChr4JlU62zce2OrkvTZUKUhQn8mYuNwpVuRWChR
	SAQUo+15/8c61UaQqgWNClygODJIrcWgXCgrwL2/4o2SKyllm81+OkRCTIoqFA8ihJQE
	IhOy9BFmQtIufSRFMsuyG8227aj32XUYUQf1shoFkvr1IBmyrbfC6m6jRRU3W6I1D/1F
	lh5KIrmtLK3u/pVOMITbS/wIfjRSb0cHeMjaqvfGw2cYX5N2q/CIEalRxaeJpDHL1Y0F
	UnMw==
X-Received: by 10.180.97.7 with SMTP id dw7mr20123711wib.74.1437384097375;
	Mon, 20 Jul 2015 02:21:37 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id n6sm10871100wix.1.2015.07.20.02.21.36
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:21:36 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:21:29 +0100
Message-Id: <1437384092-17504-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/4] Remove PDO Luid field
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It's not used any more.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/pdo.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 46dc20d..ec4a248 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -79,7 +79,6 @@ struct _XENVIF_PDO {
     PULONG                      Revision;
     ULONG                       Count;
 
-    NET_LUID                    Luid;
     ETHERNET_ADDRESS            PermanentAddress;
     ETHERNET_ADDRESS            CurrentAddress;
 
@@ -1325,8 +1324,6 @@ PdoStopDevice(
 
     PdoD0ToD3(Pdo);
 
-    RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID));
-
     RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
 
     __PdoSetDevicePnpState(Pdo, Stopped);
@@ -1411,8 +1408,6 @@ PdoRemoveDevice(
     PdoD0ToD3(Pdo);
 
 done:
-    RtlZeroMemory(&Pdo->Luid, sizeof (NET_LUID));
-
     RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
 
     NeedInvalidate = FALSE;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:21:43 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:21:43 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7GZ-0001yo-E3; Mon, 20 Jul 2015 09:21:43 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7GX-0001yX-Mi
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:21:42 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	25/B7-24055-5ADBCA55; Mon, 20 Jul 2015 09:21:41 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-4.tower-206.messagelabs.com!1437384099!22282925!1
X-Originating-IP: [209.85.212.171]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17413 invoked from network); 20 Jul 2015 09:21:39 -0000
Received: from mail-wi0-f171.google.com (HELO mail-wi0-f171.google.com)
	(209.85.212.171)
	by server-4.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:21:39 -0000
Received: by wibud3 with SMTP id ud3so82582716wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:21:39 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=n6zgJyKdp5wtq3dpwFOEGMbQ/1xt2shfa/EwtkRM7Zw=;
	b=Ly9x4NF460FcGpV9mEuwQpDrfO/a1NvqX329VY1bpS2LHqhBGgeAt0soqRaWLyU7uu
	HdDkVUKTWe86zAxUxyHyNY2zvp2LtzmyasyY8KJbadruoUoBkP3eBYTEXnxZeZzmTZbU
	RtmQt3OThrEjFv8ItaHICJ0O0ZzeJb6jdUgnYfLyDAcvbFORFcuC7MWVnUP9yn597yWY
	e8i7017p9reBxKjJJPkmu2WfzxvsjNdotcwBxU8W4+yZCW9DLxfePEBShnt0XWu3KaVI
	qg36Xk41IK26zwPZAD9XDvze7n1+qJXHHhfnhpVCE//Gsr+oKzvSlI4tHWqmbFJ+rmZw
	5TtQ==
X-Received: by 10.180.91.76 with SMTP id cc12mr20449858wib.67.1437384099634;
	Mon, 20 Jul 2015 02:21:39 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id n6sm10871100wix.1.2015.07.20.02.21.38
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:21:39 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:21:31 +0100
Message-Id: <1437384092-17504-3-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437384092-17504-1-git-send-email-paul.durrant@citrix.com>
References: <1437384092-17504-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 3/4] Remove interface subscriber checks from
	the co-installer...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...and replace with a scan of child driver software keys to check that
the revision number in the MatchingDeviceId value is supported.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 835 ++++++++++++++++++++++++++++++++--------------------
 1 file changed, 510 insertions(+), 325 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 82bd86e..0c0ac61 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -34,17 +34,11 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <strsafe.h>
-
-#include <debug_interface.h>
-#include <suspend_interface.h>
-#include <evtchn_interface.h>
-#include <store_interface.h>
-#include <range_set_interface.h>
-#include <cache_interface.h>
-#include <gnttab_interface.h>
-#include <vif_interface.h>
+#include <malloc.h>
+#include <assert.h>
 
 #include <version.h>
+#include <revision.h>
 
 __user_code;
 
@@ -58,6 +52,13 @@ __user_code;
 #define UNPLUG_KEY \
         SERVICE_KEY(XENFILT) ## "\\Unplug"
 
+#define CONTROL_KEY "SYSTEM\\CurrentControlSet\\Control"
+
+#define CLASS_KEY   \
+        CONTROL_KEY ## "\\Class"
+
+#define ENUM_KEY    "SYSTEM\\CurrentControlSet\\Enum"
+
 static VOID
 #pragma prefast(suppress:6262) // Function uses '1036' bytes of stack: exceeds /analyze:stacksize'1024'
 __Log(
@@ -186,79 +187,157 @@ __FunctionName(
 #undef  _NAME
 }
 
-struct _INTERFACE_ENTRY {
-    const TCHAR *ProviderName;
-    const TCHAR *InterfaceName;
-    DWORD       VersionMin;
-    DWORD       VersionMax;       
-};
+static BOOLEAN
+OpenEnumKey(
+    OUT PHKEY   EnumKey
+    )
+{
+    HRESULT     Error;
 
-#define DEFINE_INTERFACE_ENTRY(_ProviderName, _InterfaceName)           \
-    { #_ProviderName,                                                   \
-      #_InterfaceName,                                                  \
-      _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MIN,   \
-      _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MAX    \
+    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                         ENUM_KEY,
+                         0,
+                         KEY_READ,
+                         EnumKey);
+    if (Error != ERROR_SUCCESS) {
+        SetLastError(Error);
+        goto fail1;
     }
 
-static struct _INTERFACE_ENTRY InterfaceTable[] = {
-    DEFINE_INTERFACE_ENTRY(XENVIF, VIF),
-    { NULL, NULL, 0, 0 }
-};
+    return TRUE;
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
 
 static BOOLEAN
-SupportInterfaceVersion(
-    IN  PTCHAR              ProviderName,
-    IN  PTCHAR              InterfaceName,
-    IN  DWORD               Version
+OpenBusKey(
+    IN  PTCHAR  BusKeyName,
+    OUT PHKEY   BusKey
     )
 {
-    BOOLEAN                 Supported;
-    struct _INTERFACE_ENTRY *Entry;
-
-    Supported = FALSE;
-    SetLastError(ERROR_REVISION_MISMATCH);
-
-    for (Entry = InterfaceTable; Entry->ProviderName != NULL; Entry++) {
-        if (_stricmp(ProviderName, Entry->ProviderName) == 0 &&
-            _stricmp(InterfaceName, Entry->InterfaceName) == 0 &&
-            Version >= Entry->VersionMin &&
-            Version <= Entry->VersionMax) {
-            Supported = TRUE;
-            break;
-        }
+    BOOLEAN     Success;
+    HKEY        EnumKey;
+    HRESULT     Error;
+
+    Success = OpenEnumKey(&EnumKey);
+    if (!Success)
+        goto fail1;
+
+    Error = RegOpenKeyEx(EnumKey,
+                         BusKeyName,
+                         0,
+                         KEY_READ,
+                         BusKey);
+    if (Error != ERROR_SUCCESS) {
+        SetLastError(Error);
+        goto fail2;
+    }
+
+    RegCloseKey(EnumKey);
+
+    return TRUE;
+
+fail2:
+    Log("fail2");
+
+    RegCloseKey(EnumKey);
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
     }
 
-    Log("%s_%s_INTERFACE VERSION %d %s",
-        ProviderName,
-        InterfaceName,
-        Version,
-        (Supported) ? "SUPPORTED" : "NOT SUPPORTED");
+    return FALSE;
+}
+
+static BOOLEAN
+OpenDeviceKey(
+    IN  PTCHAR  BusKeyName,
+    IN  PTCHAR  DeviceKeyName,
+    OUT PHKEY   DeviceKey
+    )
+{
+    BOOLEAN     Success;
+    HKEY        BusKey;
+    HRESULT     Error;
+
+    Success = OpenBusKey(BusKeyName, &BusKey);
+    if (!Success)
+        goto fail1;
+
+    Error = RegOpenKeyEx(BusKey,
+                         DeviceKeyName,
+                         0,
+                         KEY_READ,
+                         DeviceKey);
+    if (Error != ERROR_SUCCESS) {
+        SetLastError(Error);
+        goto fail2;
+    }
+
+    RegCloseKey(BusKey);
+
+    return TRUE;
+
+fail2:
+    Log("fail2");
+
+    RegCloseKey(BusKey);
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
 
-    return Supported;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
 }
 
 static BOOLEAN
-SupportSubscriberInterfaces(
-    IN  PTCHAR  ProviderName,
-    IN  HKEY    SubscriberKey
+GetDriverKeyName(
+    IN  HKEY    DeviceKey,
+    OUT PTCHAR  *Name
     )
 {
-    DWORD       Values;
-    DWORD       MaxInterfaceNameLength;
-    DWORD       InterfaceNameLength;
-    PTCHAR      InterfaceName;
-    DWORD       Index;
     HRESULT     Error;
+    DWORD       SubKeys;
+    DWORD       MaxSubKeyLength;
+    DWORD       SubKeyLength;
+    PTCHAR      SubKeyName;
+    DWORD       Index;
+    HKEY        SubKey;
+    PTCHAR      DriverKeyName;
 
-    Error = RegQueryInfoKey(SubscriberKey,
+    Error = RegQueryInfoKey(DeviceKey,
                             NULL,
                             NULL,
                             NULL,
+                            &SubKeys,
+                            &MaxSubKeyLength,
                             NULL,
                             NULL,
                             NULL,
-                            &Values,
-                            &MaxInterfaceNameLength,
                             NULL,
                             NULL,
                             NULL);
@@ -267,55 +346,92 @@ SupportSubscriberInterfaces(
         goto fail1;
     }
 
-    if (Values == 0)
-        goto done;
+    SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
 
-    MaxInterfaceNameLength += sizeof (TCHAR);
-
-    InterfaceNameLength = MaxInterfaceNameLength;
-
-    InterfaceName = malloc(InterfaceNameLength);
-    if (InterfaceName == NULL)
+    SubKeyName = malloc(SubKeyLength);
+    if (SubKeyName == NULL)
         goto fail2;
 
-    for (Index = 0; Index < Values; Index++) {
-        DWORD   InterfaceNameLength;
-        DWORD   Type;
-        DWORD   Value;
-        DWORD   ValueLength;
+    SubKey = NULL;
+    DriverKeyName = NULL;
 
-        InterfaceNameLength = MaxInterfaceNameLength;
-        memset(InterfaceName, 0, InterfaceNameLength);
+    for (Index = 0; Index < SubKeys; Index++) {
+        DWORD       MaxValueLength;
+        DWORD       DriverKeyNameLength;
+        DWORD       Type;
 
-        ValueLength = sizeof (DWORD);
+        SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
+        memset(SubKeyName, 0, SubKeyLength);
 
-        Error = RegEnumValue(SubscriberKey,
+        Error = RegEnumKeyEx(DeviceKey,
                              Index,
-                             (LPTSTR)InterfaceName,
-                             &InterfaceNameLength,
+                             (LPTSTR)SubKeyName,
+                             &SubKeyLength,
+                             NULL,
+                             NULL,
                              NULL,
-                             &Type,
-                             (LPBYTE)&Value,
-                             &ValueLength);
+                             NULL);
         if (Error != ERROR_SUCCESS) {
             SetLastError(Error);
             goto fail3;
         }
 
-        if (Type != REG_DWORD) {
-            SetLastError(ERROR_BAD_FORMAT);
+        Error = RegOpenKeyEx(DeviceKey,
+                             SubKeyName,
+                             0,
+                             KEY_READ,
+                             &SubKey);
+        if (Error != ERROR_SUCCESS)
+            continue;
+
+        Error = RegQueryInfoKey(SubKey,
+                                NULL,
+                                NULL,
+                                NULL,
+                                NULL,
+                                NULL,
+                                NULL,
+                                NULL,
+                                NULL,
+                                &MaxValueLength,
+                                NULL,
+                                NULL);
+        if (Error != ERROR_SUCCESS) {
+            SetLastError(Error);
             goto fail4;
         }
 
-        if (!SupportInterfaceVersion(ProviderName,
-                                     InterfaceName,
-                                     Value))
+        DriverKeyNameLength = MaxValueLength + sizeof (TCHAR);
+
+        DriverKeyName = calloc(1, DriverKeyNameLength);
+        if (DriverKeyName == NULL)
             goto fail5;
+
+        Error = RegQueryValueEx(SubKey,
+                                "Driver",
+                                NULL,
+                                &Type,
+                                (LPBYTE)DriverKeyName,
+                                &DriverKeyNameLength);
+        if (Error == ERROR_SUCCESS &&
+            Type == REG_SZ)
+            break;
+
+        free(DriverKeyName);
+        DriverKeyName = NULL;
+
+        RegCloseKey(SubKey);
+        SubKey = NULL;
     }
 
-    free(InterfaceName);
+    Log("%s", (DriverKeyName != NULL) ? DriverKeyName : "none found");
 
-done:
+    if (SubKey != NULL)
+        RegCloseKey(SubKey);
+
+    free(SubKeyName);
+
+    *Name = DriverKeyName;
     return TRUE;
 
 fail5:
@@ -324,11 +440,14 @@ fail5:
 fail4:
     Log("fail4");
 
+    if (SubKey != NULL)
+        RegCloseKey(SubKey);
+
 fail3:
     Log("fail3");
 
-    free(InterfaceName);
-    
+    free(SubKeyName);
+
 fail2:
     Log("fail2");
 
@@ -347,129 +466,375 @@ fail1:
 }
 
 static BOOLEAN
-SupportRegisteredSubscribers(
-    IN  PTCHAR  ProviderName
+OpenClassKey(
+    OUT PHKEY   ClassKey
     )
 {
-    TCHAR       InterfacesKeyName[MAX_PATH];
-    HKEY        InterfacesKey;
-    DWORD       SubKeys;
-    DWORD       MaxSubKeyNameLength;
-    DWORD       Index;
-    DWORD       SubKeyNameLength;
-    PTCHAR      SubKeyName;
-    HKEY        SubKey;
-    HRESULT     Result;
     HRESULT     Error;
 
-    Result = StringCbPrintf(InterfacesKeyName,
-                            MAX_PATH,
-                            "%s\\%s\\Interfaces",
-                            SERVICES_KEY,
-                            ProviderName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
+    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                         CLASS_KEY,
+                         0,
+                         KEY_READ,
+                         ClassKey);
+    if (Error != ERROR_SUCCESS) {
+        SetLastError(Error);
         goto fail1;
     }
 
-    Error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
-                           InterfacesKeyName,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &InterfacesKey,
-                           NULL);
+    return TRUE;
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
+OpenDriverKey(
+    IN  PTCHAR  DriverKeyName,
+    OUT PHKEY   DriverKey
+    )
+{
+    BOOLEAN     Success;
+    HKEY        ClassKey;
+    HRESULT     Error;
+
+    Success = OpenClassKey(&ClassKey);
+    if (!Success)
+        goto fail1;
+
+    Error = RegOpenKeyEx(ClassKey,
+                         DriverKeyName,
+                         0,
+                         KEY_READ,
+                         DriverKey);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
         goto fail2;
     }
 
-    Error = RegQueryInfoKey(InterfacesKey,
+    RegCloseKey(ClassKey);
+
+    return TRUE;
+
+fail2:
+    Log("fail2");
+
+    RegCloseKey(ClassKey);
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+#define DEFINE_REVISION(_N, _C, _V) \
+    (_N)
+
+static DWORD    DeviceRevision[] = {
+    DEFINE_REVISION_TABLE
+};
+
+#undef DEFINE_REVISION
+
+static BOOLEAN
+SupportDeviceID(
+    IN  PTCHAR      DeviceID
+    )
+{
+    unsigned int    Revision;
+    int             Count;
+    DWORD           Index;
+    HRESULT         Error;
+
+    DeviceID = strrchr(DeviceID, '&');
+    assert(DeviceID != NULL);
+    DeviceID++;
+
+    Count = sscanf_s(DeviceID,
+                     "REV_%8x",
+                     &Revision);
+    if (Count != 1) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail1;
+    }
+
+    for (Index = 0; Index < ARRAYSIZE(DeviceRevision); Index++) {
+        if (Revision == DeviceRevision[Index])
+            goto found;
+    }
+
+    SetLastError(ERROR_FILE_NOT_FOUND);
+    goto fail2;
+
+found:
+    Log("%x", Revision);
+
+    return TRUE;
+
+fail2:
+    Log("fail2");
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
+GetMatchingDeviceID(
+    IN  HKEY    DriverKey,
+    OUT PTCHAR  *MatchingDeviceID
+    )
+{
+    HRESULT     Error;
+    DWORD       MaxValueLength;
+    DWORD       MatchingDeviceIDLength;
+    DWORD       Type;
+    DWORD       Index;
+
+    Error = RegQueryInfoKey(DriverKey,
+                            NULL,
                             NULL,
                             NULL,
                             NULL,
-                            &SubKeys,
-                            &MaxSubKeyNameLength,
                             NULL,
                             NULL,
                             NULL,
                             NULL,
+                            &MaxValueLength,
                             NULL,
                             NULL);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
+        goto fail1;
+    }
+
+    MatchingDeviceIDLength = MaxValueLength + sizeof (TCHAR);
+
+    *MatchingDeviceID = calloc(1, MatchingDeviceIDLength);
+    if (*MatchingDeviceID == NULL)
+        goto fail2;
+
+    Error = RegQueryValueEx(DriverKey,
+                            "MatchingDeviceId",
+                            NULL,
+                            &Type,
+                            (LPBYTE)*MatchingDeviceID,
+                            &MatchingDeviceIDLength);
+    if (Error != ERROR_SUCCESS) {
+        SetLastError(Error);
         goto fail3;
     }
 
-    SubKeyNameLength = MaxSubKeyNameLength + sizeof (TCHAR);
+    if (Type != REG_SZ) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail4;
+    }
+
+    for (Index = 0; Index < strlen(*MatchingDeviceID); Index++)
+        (*MatchingDeviceID)[Index] = (CHAR)toupper((*MatchingDeviceID)[Index]);
+
+    Log("%s", *MatchingDeviceID);
+
+    return TRUE;
+
+fail4:
+    Log("fail4");
+
+fail3:
+    Log("fail3");
+
+    free(*MatchingDeviceID);
+
+fail2:
+    Log("fail2");
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
+SupportChildDrivers(
+    VOID
+    )
+{
+    BOOLEAN     Success;
+    HKEY        XenbusKey;
+    HRESULT     Error;
+    DWORD       SubKeys;
+    DWORD       MaxSubKeyLength;
+    DWORD       SubKeyLength;
+    PTCHAR      SubKeyName;
+    HKEY        DeviceKey;
+    PTCHAR      DriverKeyName;
+    HKEY        DriverKey;
+    PTCHAR      MatchingDeviceID;
+    DWORD       Index;
+
+    Log("====>");
+
+    Success = OpenBusKey("XENVIF", &XenbusKey);
+    if (!Success) {
+        // If there is no key then this must be a fresh installation
+        if (GetLastError() == ERROR_FILE_NOT_FOUND)
+            goto done;
+
+        goto fail1;
+    }
+
+    Error = RegQueryInfoKey(XenbusKey,
+                            NULL,
+                            NULL,
+                            NULL,
+                            &SubKeys,
+                            &MaxSubKeyLength,
+                            NULL,
+                            NULL,
+                            NULL,
+                            NULL,
+                            NULL,
+                            NULL);
+    if (Error != ERROR_SUCCESS) {
+        SetLastError(Error);
+        goto fail2;
+    }
+
+    SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
 
-    SubKeyName = malloc(SubKeyNameLength);
+    SubKeyName = malloc(SubKeyLength);
     if (SubKeyName == NULL)
-        goto fail4;
+        goto fail3;
 
     for (Index = 0; Index < SubKeys; Index++) {
-        SubKeyNameLength = MaxSubKeyNameLength + sizeof (TCHAR);
-        memset(SubKeyName, 0, SubKeyNameLength);
+        SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
+        memset(SubKeyName, 0, SubKeyLength);
 
-        Error = RegEnumKeyEx(InterfacesKey,
+        Error = RegEnumKeyEx(XenbusKey,
                              Index,
                              (LPTSTR)SubKeyName,
-                             &SubKeyNameLength,
+                             &SubKeyLength,
                              NULL,
                              NULL,
                              NULL,
                              NULL);
         if (Error != ERROR_SUCCESS) {
             SetLastError(Error);
-            goto fail5;
+            goto fail4;
         }
 
-        Error = RegOpenKeyEx(InterfacesKey,
-                             SubKeyName,
-                             0,
-                             KEY_READ,
-                             &SubKey);
-        if (Error != ERROR_SUCCESS)
+        Success = OpenDeviceKey("XENBUS", SubKeyName, &DeviceKey);
+        if (!Success)
+            goto fail5;
+
+        Success = GetDriverKeyName(DeviceKey, &DriverKeyName);
+        if (!Success)
             goto fail6;
 
-        if (!SupportSubscriberInterfaces(ProviderName, SubKey))
+        if (DriverKeyName == NULL)
+            goto loop;
+
+        Success = OpenDriverKey(DriverKeyName, &DriverKey);
+        if (!Success)
             goto fail7;
 
-        RegCloseKey(SubKey);
+        Success = GetMatchingDeviceID(DriverKey, &MatchingDeviceID);
+        if (!Success)
+            goto fail8;
+
+        Success = SupportDeviceID(MatchingDeviceID);
+        if (!Success)
+            goto fail9;
+
+        free(MatchingDeviceID);
+
+        RegCloseKey(DriverKey);
+
+        free(DriverKeyName);
+
+    loop:
+        RegCloseKey(DeviceKey);
     }
 
     free(SubKeyName);
 
-    RegCloseKey(InterfacesKey);
+    RegCloseKey(XenbusKey);
+
+done:
+    Log("<====");
 
     return TRUE;
 
+fail9:
+    Log("fail9");
+
+    free(MatchingDeviceID);
+
+fail8:
+    Log("fail8");
+
+    RegCloseKey(DriverKey);
+
 fail7:
     Log("fail7");
 
-    RegCloseKey(SubKey);
+    free(DriverKeyName);
 
 fail6:
     Log("fail6");
 
+    RegCloseKey(DeviceKey);
+
 fail5:
     Log("fail5");
 
-    free(SubKeyName);
-
 fail4:
     Log("fail4");
-    
+
+    free(SubKeyName);
+
 fail3:
     Log("fail3");
 
-    RegCloseKey(InterfacesKey);
-
 fail2:
     Log("fail2");
-    
+
+    RegCloseKey(XenbusKey);
+
 fail1:
     Error = GetLastError();
 
@@ -749,176 +1114,6 @@ fail1:
     return FALSE;
 }
 
-static HKEY
-OpenInterfacesKey(
-    IN  PTCHAR  ProviderName
-    )
-{
-    HRESULT     Result;
-    TCHAR       KeyName[MAX_PATH];
-    HKEY        Key;
-    HRESULT     Error;
-
-    Result = StringCbPrintf(KeyName,
-                            MAX_PATH,
-                            "%s\\%s\\Interfaces",
-                            SERVICES_KEY,
-                            ProviderName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail1;
-    }
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         KeyName,
-                         0,
-                         KEY_ALL_ACCESS,
-                         &Key);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    return Key;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static BOOLEAN
-SubscribeInterface(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  SubscriberName,
-    IN  PTCHAR  InterfaceName,
-    IN  DWORD   InterfaceVersion
-    )
-{
-    HKEY        Key;
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL)
-        goto fail1;
-
-    Error = RegCreateKeyEx(InterfacesKey,
-                           SubscriberName,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &Key,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    Error = RegSetValueEx(Key,
-                          InterfaceName,
-                          0,
-                          REG_DWORD,
-                          (const BYTE *)&InterfaceVersion,
-                          sizeof(DWORD));
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    Log("%s: %s_%s_INTERFACE_VERSION %u",
-        SubscriberName,
-        ProviderName,
-        InterfaceName,
-        InterfaceVersion);
-
-    RegCloseKey(Key);
-    RegCloseKey(InterfacesKey);
-
-    return TRUE;
-
-fail3:
-    RegCloseKey(Key);
-
-fail2:
-    RegCloseKey(InterfacesKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-#define SUBSCRIBE_INTERFACE(_ProviderName, _SubscriberName, _InterfaceName)                        \
-    do {                                                                                           \
-        (VOID) SubscribeInterface(#_ProviderName,                                                  \
-                                  #_SubscriberName,                                                \
-                                  #_InterfaceName,                                                 \
-                                  _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MAX); \
-    } while (FALSE);
-
-static BOOLEAN
-UnsubscribeInterfaces(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  SubscriberName
-    )
-{
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    Log("%s: %s", SubscriberName, ProviderName);
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL) {
-        goto fail1;
-    }
-
-    Error = RegDeleteTree(InterfacesKey,
-                          SubscriberName);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    RegCloseKey(InterfacesKey);
-
-    return TRUE;
-
-fail2:
-    RegCloseKey(InterfacesKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
 static HRESULT
 DifInstallPreProcess(
     IN  HDEVINFO                    DeviceInfoSet,
@@ -935,7 +1130,7 @@ DifInstallPreProcess(
 
     Log("====>");
 
-    Success = SupportRegisteredSubscribers("XENVIF");
+    Success = SupportChildDrivers();
     if (!Success)
         goto fail1;
 
@@ -970,14 +1165,6 @@ DifInstallPostProcess(
 
     Log("====>");
 
-    SUBSCRIBE_INTERFACE(XENBUS, XENVIF, DEBUG);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVIF, SUSPEND);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVIF, EVTCHN);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVIF, STORE);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVIF, RANGE_SET);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVIF, CACHE);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVIF, GNTTAB);
-
     (VOID) InstallUnplugService("NICS", "XENVIF");
 
     Log("<====");
@@ -1056,8 +1243,6 @@ DifRemovePreProcess(
 
     (VOID) RemoveUnplugService("NICS", "XENVIF");
 
-    UnsubscribeInterfaces("XENBUS", "XENVIF");
-
     Log("<====");
 
     return NO_ERROR; 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:21:43 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:21:43 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7GZ-0001yo-E3; Mon, 20 Jul 2015 09:21:43 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7GX-0001yX-Mi
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:21:42 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	25/B7-24055-5ADBCA55; Mon, 20 Jul 2015 09:21:41 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-4.tower-206.messagelabs.com!1437384099!22282925!1
X-Originating-IP: [209.85.212.171]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17413 invoked from network); 20 Jul 2015 09:21:39 -0000
Received: from mail-wi0-f171.google.com (HELO mail-wi0-f171.google.com)
	(209.85.212.171)
	by server-4.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:21:39 -0000
Received: by wibud3 with SMTP id ud3so82582716wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:21:39 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=n6zgJyKdp5wtq3dpwFOEGMbQ/1xt2shfa/EwtkRM7Zw=;
	b=Ly9x4NF460FcGpV9mEuwQpDrfO/a1NvqX329VY1bpS2LHqhBGgeAt0soqRaWLyU7uu
	HdDkVUKTWe86zAxUxyHyNY2zvp2LtzmyasyY8KJbadruoUoBkP3eBYTEXnxZeZzmTZbU
	RtmQt3OThrEjFv8ItaHICJ0O0ZzeJb6jdUgnYfLyDAcvbFORFcuC7MWVnUP9yn597yWY
	e8i7017p9reBxKjJJPkmu2WfzxvsjNdotcwBxU8W4+yZCW9DLxfePEBShnt0XWu3KaVI
	qg36Xk41IK26zwPZAD9XDvze7n1+qJXHHhfnhpVCE//Gsr+oKzvSlI4tHWqmbFJ+rmZw
	5TtQ==
X-Received: by 10.180.91.76 with SMTP id cc12mr20449858wib.67.1437384099634;
	Mon, 20 Jul 2015 02:21:39 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id n6sm10871100wix.1.2015.07.20.02.21.38
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:21:39 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:21:31 +0100
Message-Id: <1437384092-17504-3-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437384092-17504-1-git-send-email-paul.durrant@citrix.com>
References: <1437384092-17504-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 3/4] Remove interface subscriber checks from
	the co-installer...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...and replace with a scan of child driver software keys to check that
the revision number in the MatchingDeviceId value is supported.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 835 ++++++++++++++++++++++++++++++++--------------------
 1 file changed, 510 insertions(+), 325 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 82bd86e..0c0ac61 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -34,17 +34,11 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <strsafe.h>
-
-#include <debug_interface.h>
-#include <suspend_interface.h>
-#include <evtchn_interface.h>
-#include <store_interface.h>
-#include <range_set_interface.h>
-#include <cache_interface.h>
-#include <gnttab_interface.h>
-#include <vif_interface.h>
+#include <malloc.h>
+#include <assert.h>
 
 #include <version.h>
+#include <revision.h>
 
 __user_code;
 
@@ -58,6 +52,13 @@ __user_code;
 #define UNPLUG_KEY \
         SERVICE_KEY(XENFILT) ## "\\Unplug"
 
+#define CONTROL_KEY "SYSTEM\\CurrentControlSet\\Control"
+
+#define CLASS_KEY   \
+        CONTROL_KEY ## "\\Class"
+
+#define ENUM_KEY    "SYSTEM\\CurrentControlSet\\Enum"
+
 static VOID
 #pragma prefast(suppress:6262) // Function uses '1036' bytes of stack: exceeds /analyze:stacksize'1024'
 __Log(
@@ -186,79 +187,157 @@ __FunctionName(
 #undef  _NAME
 }
 
-struct _INTERFACE_ENTRY {
-    const TCHAR *ProviderName;
-    const TCHAR *InterfaceName;
-    DWORD       VersionMin;
-    DWORD       VersionMax;       
-};
+static BOOLEAN
+OpenEnumKey(
+    OUT PHKEY   EnumKey
+    )
+{
+    HRESULT     Error;
 
-#define DEFINE_INTERFACE_ENTRY(_ProviderName, _InterfaceName)           \
-    { #_ProviderName,                                                   \
-      #_InterfaceName,                                                  \
-      _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MIN,   \
-      _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MAX    \
+    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                         ENUM_KEY,
+                         0,
+                         KEY_READ,
+                         EnumKey);
+    if (Error != ERROR_SUCCESS) {
+        SetLastError(Error);
+        goto fail1;
     }
 
-static struct _INTERFACE_ENTRY InterfaceTable[] = {
-    DEFINE_INTERFACE_ENTRY(XENVIF, VIF),
-    { NULL, NULL, 0, 0 }
-};
+    return TRUE;
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
 
 static BOOLEAN
-SupportInterfaceVersion(
-    IN  PTCHAR              ProviderName,
-    IN  PTCHAR              InterfaceName,
-    IN  DWORD               Version
+OpenBusKey(
+    IN  PTCHAR  BusKeyName,
+    OUT PHKEY   BusKey
     )
 {
-    BOOLEAN                 Supported;
-    struct _INTERFACE_ENTRY *Entry;
-
-    Supported = FALSE;
-    SetLastError(ERROR_REVISION_MISMATCH);
-
-    for (Entry = InterfaceTable; Entry->ProviderName != NULL; Entry++) {
-        if (_stricmp(ProviderName, Entry->ProviderName) == 0 &&
-            _stricmp(InterfaceName, Entry->InterfaceName) == 0 &&
-            Version >= Entry->VersionMin &&
-            Version <= Entry->VersionMax) {
-            Supported = TRUE;
-            break;
-        }
+    BOOLEAN     Success;
+    HKEY        EnumKey;
+    HRESULT     Error;
+
+    Success = OpenEnumKey(&EnumKey);
+    if (!Success)
+        goto fail1;
+
+    Error = RegOpenKeyEx(EnumKey,
+                         BusKeyName,
+                         0,
+                         KEY_READ,
+                         BusKey);
+    if (Error != ERROR_SUCCESS) {
+        SetLastError(Error);
+        goto fail2;
+    }
+
+    RegCloseKey(EnumKey);
+
+    return TRUE;
+
+fail2:
+    Log("fail2");
+
+    RegCloseKey(EnumKey);
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
     }
 
-    Log("%s_%s_INTERFACE VERSION %d %s",
-        ProviderName,
-        InterfaceName,
-        Version,
-        (Supported) ? "SUPPORTED" : "NOT SUPPORTED");
+    return FALSE;
+}
+
+static BOOLEAN
+OpenDeviceKey(
+    IN  PTCHAR  BusKeyName,
+    IN  PTCHAR  DeviceKeyName,
+    OUT PHKEY   DeviceKey
+    )
+{
+    BOOLEAN     Success;
+    HKEY        BusKey;
+    HRESULT     Error;
+
+    Success = OpenBusKey(BusKeyName, &BusKey);
+    if (!Success)
+        goto fail1;
+
+    Error = RegOpenKeyEx(BusKey,
+                         DeviceKeyName,
+                         0,
+                         KEY_READ,
+                         DeviceKey);
+    if (Error != ERROR_SUCCESS) {
+        SetLastError(Error);
+        goto fail2;
+    }
+
+    RegCloseKey(BusKey);
+
+    return TRUE;
+
+fail2:
+    Log("fail2");
+
+    RegCloseKey(BusKey);
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
 
-    return Supported;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
 }
 
 static BOOLEAN
-SupportSubscriberInterfaces(
-    IN  PTCHAR  ProviderName,
-    IN  HKEY    SubscriberKey
+GetDriverKeyName(
+    IN  HKEY    DeviceKey,
+    OUT PTCHAR  *Name
     )
 {
-    DWORD       Values;
-    DWORD       MaxInterfaceNameLength;
-    DWORD       InterfaceNameLength;
-    PTCHAR      InterfaceName;
-    DWORD       Index;
     HRESULT     Error;
+    DWORD       SubKeys;
+    DWORD       MaxSubKeyLength;
+    DWORD       SubKeyLength;
+    PTCHAR      SubKeyName;
+    DWORD       Index;
+    HKEY        SubKey;
+    PTCHAR      DriverKeyName;
 
-    Error = RegQueryInfoKey(SubscriberKey,
+    Error = RegQueryInfoKey(DeviceKey,
                             NULL,
                             NULL,
                             NULL,
+                            &SubKeys,
+                            &MaxSubKeyLength,
                             NULL,
                             NULL,
                             NULL,
-                            &Values,
-                            &MaxInterfaceNameLength,
                             NULL,
                             NULL,
                             NULL);
@@ -267,55 +346,92 @@ SupportSubscriberInterfaces(
         goto fail1;
     }
 
-    if (Values == 0)
-        goto done;
+    SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
 
-    MaxInterfaceNameLength += sizeof (TCHAR);
-
-    InterfaceNameLength = MaxInterfaceNameLength;
-
-    InterfaceName = malloc(InterfaceNameLength);
-    if (InterfaceName == NULL)
+    SubKeyName = malloc(SubKeyLength);
+    if (SubKeyName == NULL)
         goto fail2;
 
-    for (Index = 0; Index < Values; Index++) {
-        DWORD   InterfaceNameLength;
-        DWORD   Type;
-        DWORD   Value;
-        DWORD   ValueLength;
+    SubKey = NULL;
+    DriverKeyName = NULL;
 
-        InterfaceNameLength = MaxInterfaceNameLength;
-        memset(InterfaceName, 0, InterfaceNameLength);
+    for (Index = 0; Index < SubKeys; Index++) {
+        DWORD       MaxValueLength;
+        DWORD       DriverKeyNameLength;
+        DWORD       Type;
 
-        ValueLength = sizeof (DWORD);
+        SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
+        memset(SubKeyName, 0, SubKeyLength);
 
-        Error = RegEnumValue(SubscriberKey,
+        Error = RegEnumKeyEx(DeviceKey,
                              Index,
-                             (LPTSTR)InterfaceName,
-                             &InterfaceNameLength,
+                             (LPTSTR)SubKeyName,
+                             &SubKeyLength,
+                             NULL,
+                             NULL,
                              NULL,
-                             &Type,
-                             (LPBYTE)&Value,
-                             &ValueLength);
+                             NULL);
         if (Error != ERROR_SUCCESS) {
             SetLastError(Error);
             goto fail3;
         }
 
-        if (Type != REG_DWORD) {
-            SetLastError(ERROR_BAD_FORMAT);
+        Error = RegOpenKeyEx(DeviceKey,
+                             SubKeyName,
+                             0,
+                             KEY_READ,
+                             &SubKey);
+        if (Error != ERROR_SUCCESS)
+            continue;
+
+        Error = RegQueryInfoKey(SubKey,
+                                NULL,
+                                NULL,
+                                NULL,
+                                NULL,
+                                NULL,
+                                NULL,
+                                NULL,
+                                NULL,
+                                &MaxValueLength,
+                                NULL,
+                                NULL);
+        if (Error != ERROR_SUCCESS) {
+            SetLastError(Error);
             goto fail4;
         }
 
-        if (!SupportInterfaceVersion(ProviderName,
-                                     InterfaceName,
-                                     Value))
+        DriverKeyNameLength = MaxValueLength + sizeof (TCHAR);
+
+        DriverKeyName = calloc(1, DriverKeyNameLength);
+        if (DriverKeyName == NULL)
             goto fail5;
+
+        Error = RegQueryValueEx(SubKey,
+                                "Driver",
+                                NULL,
+                                &Type,
+                                (LPBYTE)DriverKeyName,
+                                &DriverKeyNameLength);
+        if (Error == ERROR_SUCCESS &&
+            Type == REG_SZ)
+            break;
+
+        free(DriverKeyName);
+        DriverKeyName = NULL;
+
+        RegCloseKey(SubKey);
+        SubKey = NULL;
     }
 
-    free(InterfaceName);
+    Log("%s", (DriverKeyName != NULL) ? DriverKeyName : "none found");
 
-done:
+    if (SubKey != NULL)
+        RegCloseKey(SubKey);
+
+    free(SubKeyName);
+
+    *Name = DriverKeyName;
     return TRUE;
 
 fail5:
@@ -324,11 +440,14 @@ fail5:
 fail4:
     Log("fail4");
 
+    if (SubKey != NULL)
+        RegCloseKey(SubKey);
+
 fail3:
     Log("fail3");
 
-    free(InterfaceName);
-    
+    free(SubKeyName);
+
 fail2:
     Log("fail2");
 
@@ -347,129 +466,375 @@ fail1:
 }
 
 static BOOLEAN
-SupportRegisteredSubscribers(
-    IN  PTCHAR  ProviderName
+OpenClassKey(
+    OUT PHKEY   ClassKey
     )
 {
-    TCHAR       InterfacesKeyName[MAX_PATH];
-    HKEY        InterfacesKey;
-    DWORD       SubKeys;
-    DWORD       MaxSubKeyNameLength;
-    DWORD       Index;
-    DWORD       SubKeyNameLength;
-    PTCHAR      SubKeyName;
-    HKEY        SubKey;
-    HRESULT     Result;
     HRESULT     Error;
 
-    Result = StringCbPrintf(InterfacesKeyName,
-                            MAX_PATH,
-                            "%s\\%s\\Interfaces",
-                            SERVICES_KEY,
-                            ProviderName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
+    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                         CLASS_KEY,
+                         0,
+                         KEY_READ,
+                         ClassKey);
+    if (Error != ERROR_SUCCESS) {
+        SetLastError(Error);
         goto fail1;
     }
 
-    Error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
-                           InterfacesKeyName,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &InterfacesKey,
-                           NULL);
+    return TRUE;
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
+OpenDriverKey(
+    IN  PTCHAR  DriverKeyName,
+    OUT PHKEY   DriverKey
+    )
+{
+    BOOLEAN     Success;
+    HKEY        ClassKey;
+    HRESULT     Error;
+
+    Success = OpenClassKey(&ClassKey);
+    if (!Success)
+        goto fail1;
+
+    Error = RegOpenKeyEx(ClassKey,
+                         DriverKeyName,
+                         0,
+                         KEY_READ,
+                         DriverKey);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
         goto fail2;
     }
 
-    Error = RegQueryInfoKey(InterfacesKey,
+    RegCloseKey(ClassKey);
+
+    return TRUE;
+
+fail2:
+    Log("fail2");
+
+    RegCloseKey(ClassKey);
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+#define DEFINE_REVISION(_N, _C, _V) \
+    (_N)
+
+static DWORD    DeviceRevision[] = {
+    DEFINE_REVISION_TABLE
+};
+
+#undef DEFINE_REVISION
+
+static BOOLEAN
+SupportDeviceID(
+    IN  PTCHAR      DeviceID
+    )
+{
+    unsigned int    Revision;
+    int             Count;
+    DWORD           Index;
+    HRESULT         Error;
+
+    DeviceID = strrchr(DeviceID, '&');
+    assert(DeviceID != NULL);
+    DeviceID++;
+
+    Count = sscanf_s(DeviceID,
+                     "REV_%8x",
+                     &Revision);
+    if (Count != 1) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail1;
+    }
+
+    for (Index = 0; Index < ARRAYSIZE(DeviceRevision); Index++) {
+        if (Revision == DeviceRevision[Index])
+            goto found;
+    }
+
+    SetLastError(ERROR_FILE_NOT_FOUND);
+    goto fail2;
+
+found:
+    Log("%x", Revision);
+
+    return TRUE;
+
+fail2:
+    Log("fail2");
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
+GetMatchingDeviceID(
+    IN  HKEY    DriverKey,
+    OUT PTCHAR  *MatchingDeviceID
+    )
+{
+    HRESULT     Error;
+    DWORD       MaxValueLength;
+    DWORD       MatchingDeviceIDLength;
+    DWORD       Type;
+    DWORD       Index;
+
+    Error = RegQueryInfoKey(DriverKey,
+                            NULL,
                             NULL,
                             NULL,
                             NULL,
-                            &SubKeys,
-                            &MaxSubKeyNameLength,
                             NULL,
                             NULL,
                             NULL,
                             NULL,
+                            &MaxValueLength,
                             NULL,
                             NULL);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
+        goto fail1;
+    }
+
+    MatchingDeviceIDLength = MaxValueLength + sizeof (TCHAR);
+
+    *MatchingDeviceID = calloc(1, MatchingDeviceIDLength);
+    if (*MatchingDeviceID == NULL)
+        goto fail2;
+
+    Error = RegQueryValueEx(DriverKey,
+                            "MatchingDeviceId",
+                            NULL,
+                            &Type,
+                            (LPBYTE)*MatchingDeviceID,
+                            &MatchingDeviceIDLength);
+    if (Error != ERROR_SUCCESS) {
+        SetLastError(Error);
         goto fail3;
     }
 
-    SubKeyNameLength = MaxSubKeyNameLength + sizeof (TCHAR);
+    if (Type != REG_SZ) {
+        SetLastError(ERROR_BAD_FORMAT);
+        goto fail4;
+    }
+
+    for (Index = 0; Index < strlen(*MatchingDeviceID); Index++)
+        (*MatchingDeviceID)[Index] = (CHAR)toupper((*MatchingDeviceID)[Index]);
+
+    Log("%s", *MatchingDeviceID);
+
+    return TRUE;
+
+fail4:
+    Log("fail4");
+
+fail3:
+    Log("fail3");
+
+    free(*MatchingDeviceID);
+
+fail2:
+    Log("fail2");
+
+fail1:
+    Error = GetLastError();
+
+    {
+        PTCHAR  Message;
+
+        Message = GetErrorMessage(Error);
+        Log("fail1 (%s)", Message);
+        LocalFree(Message);
+    }
+
+    return FALSE;
+}
+
+static BOOLEAN
+SupportChildDrivers(
+    VOID
+    )
+{
+    BOOLEAN     Success;
+    HKEY        XenbusKey;
+    HRESULT     Error;
+    DWORD       SubKeys;
+    DWORD       MaxSubKeyLength;
+    DWORD       SubKeyLength;
+    PTCHAR      SubKeyName;
+    HKEY        DeviceKey;
+    PTCHAR      DriverKeyName;
+    HKEY        DriverKey;
+    PTCHAR      MatchingDeviceID;
+    DWORD       Index;
+
+    Log("====>");
+
+    Success = OpenBusKey("XENVIF", &XenbusKey);
+    if (!Success) {
+        // If there is no key then this must be a fresh installation
+        if (GetLastError() == ERROR_FILE_NOT_FOUND)
+            goto done;
+
+        goto fail1;
+    }
+
+    Error = RegQueryInfoKey(XenbusKey,
+                            NULL,
+                            NULL,
+                            NULL,
+                            &SubKeys,
+                            &MaxSubKeyLength,
+                            NULL,
+                            NULL,
+                            NULL,
+                            NULL,
+                            NULL,
+                            NULL);
+    if (Error != ERROR_SUCCESS) {
+        SetLastError(Error);
+        goto fail2;
+    }
+
+    SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
 
-    SubKeyName = malloc(SubKeyNameLength);
+    SubKeyName = malloc(SubKeyLength);
     if (SubKeyName == NULL)
-        goto fail4;
+        goto fail3;
 
     for (Index = 0; Index < SubKeys; Index++) {
-        SubKeyNameLength = MaxSubKeyNameLength + sizeof (TCHAR);
-        memset(SubKeyName, 0, SubKeyNameLength);
+        SubKeyLength = MaxSubKeyLength + sizeof (TCHAR);
+        memset(SubKeyName, 0, SubKeyLength);
 
-        Error = RegEnumKeyEx(InterfacesKey,
+        Error = RegEnumKeyEx(XenbusKey,
                              Index,
                              (LPTSTR)SubKeyName,
-                             &SubKeyNameLength,
+                             &SubKeyLength,
                              NULL,
                              NULL,
                              NULL,
                              NULL);
         if (Error != ERROR_SUCCESS) {
             SetLastError(Error);
-            goto fail5;
+            goto fail4;
         }
 
-        Error = RegOpenKeyEx(InterfacesKey,
-                             SubKeyName,
-                             0,
-                             KEY_READ,
-                             &SubKey);
-        if (Error != ERROR_SUCCESS)
+        Success = OpenDeviceKey("XENBUS", SubKeyName, &DeviceKey);
+        if (!Success)
+            goto fail5;
+
+        Success = GetDriverKeyName(DeviceKey, &DriverKeyName);
+        if (!Success)
             goto fail6;
 
-        if (!SupportSubscriberInterfaces(ProviderName, SubKey))
+        if (DriverKeyName == NULL)
+            goto loop;
+
+        Success = OpenDriverKey(DriverKeyName, &DriverKey);
+        if (!Success)
             goto fail7;
 
-        RegCloseKey(SubKey);
+        Success = GetMatchingDeviceID(DriverKey, &MatchingDeviceID);
+        if (!Success)
+            goto fail8;
+
+        Success = SupportDeviceID(MatchingDeviceID);
+        if (!Success)
+            goto fail9;
+
+        free(MatchingDeviceID);
+
+        RegCloseKey(DriverKey);
+
+        free(DriverKeyName);
+
+    loop:
+        RegCloseKey(DeviceKey);
     }
 
     free(SubKeyName);
 
-    RegCloseKey(InterfacesKey);
+    RegCloseKey(XenbusKey);
+
+done:
+    Log("<====");
 
     return TRUE;
 
+fail9:
+    Log("fail9");
+
+    free(MatchingDeviceID);
+
+fail8:
+    Log("fail8");
+
+    RegCloseKey(DriverKey);
+
 fail7:
     Log("fail7");
 
-    RegCloseKey(SubKey);
+    free(DriverKeyName);
 
 fail6:
     Log("fail6");
 
+    RegCloseKey(DeviceKey);
+
 fail5:
     Log("fail5");
 
-    free(SubKeyName);
-
 fail4:
     Log("fail4");
-    
+
+    free(SubKeyName);
+
 fail3:
     Log("fail3");
 
-    RegCloseKey(InterfacesKey);
-
 fail2:
     Log("fail2");
-    
+
+    RegCloseKey(XenbusKey);
+
 fail1:
     Error = GetLastError();
 
@@ -749,176 +1114,6 @@ fail1:
     return FALSE;
 }
 
-static HKEY
-OpenInterfacesKey(
-    IN  PTCHAR  ProviderName
-    )
-{
-    HRESULT     Result;
-    TCHAR       KeyName[MAX_PATH];
-    HKEY        Key;
-    HRESULT     Error;
-
-    Result = StringCbPrintf(KeyName,
-                            MAX_PATH,
-                            "%s\\%s\\Interfaces",
-                            SERVICES_KEY,
-                            ProviderName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail1;
-    }
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         KeyName,
-                         0,
-                         KEY_ALL_ACCESS,
-                         &Key);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    return Key;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static BOOLEAN
-SubscribeInterface(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  SubscriberName,
-    IN  PTCHAR  InterfaceName,
-    IN  DWORD   InterfaceVersion
-    )
-{
-    HKEY        Key;
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL)
-        goto fail1;
-
-    Error = RegCreateKeyEx(InterfacesKey,
-                           SubscriberName,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &Key,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    Error = RegSetValueEx(Key,
-                          InterfaceName,
-                          0,
-                          REG_DWORD,
-                          (const BYTE *)&InterfaceVersion,
-                          sizeof(DWORD));
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    Log("%s: %s_%s_INTERFACE_VERSION %u",
-        SubscriberName,
-        ProviderName,
-        InterfaceName,
-        InterfaceVersion);
-
-    RegCloseKey(Key);
-    RegCloseKey(InterfacesKey);
-
-    return TRUE;
-
-fail3:
-    RegCloseKey(Key);
-
-fail2:
-    RegCloseKey(InterfacesKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-#define SUBSCRIBE_INTERFACE(_ProviderName, _SubscriberName, _InterfaceName)                        \
-    do {                                                                                           \
-        (VOID) SubscribeInterface(#_ProviderName,                                                  \
-                                  #_SubscriberName,                                                \
-                                  #_InterfaceName,                                                 \
-                                  _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MAX); \
-    } while (FALSE);
-
-static BOOLEAN
-UnsubscribeInterfaces(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  SubscriberName
-    )
-{
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    Log("%s: %s", SubscriberName, ProviderName);
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL) {
-        goto fail1;
-    }
-
-    Error = RegDeleteTree(InterfacesKey,
-                          SubscriberName);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    RegCloseKey(InterfacesKey);
-
-    return TRUE;
-
-fail2:
-    RegCloseKey(InterfacesKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
 static HRESULT
 DifInstallPreProcess(
     IN  HDEVINFO                    DeviceInfoSet,
@@ -935,7 +1130,7 @@ DifInstallPreProcess(
 
     Log("====>");
 
-    Success = SupportRegisteredSubscribers("XENVIF");
+    Success = SupportChildDrivers();
     if (!Success)
         goto fail1;
 
@@ -970,14 +1165,6 @@ DifInstallPostProcess(
 
     Log("====>");
 
-    SUBSCRIBE_INTERFACE(XENBUS, XENVIF, DEBUG);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVIF, SUSPEND);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVIF, EVTCHN);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVIF, STORE);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVIF, RANGE_SET);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVIF, CACHE);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVIF, GNTTAB);
-
     (VOID) InstallUnplugService("NICS", "XENVIF");
 
     Log("<====");
@@ -1056,8 +1243,6 @@ DifRemovePreProcess(
 
     (VOID) RemoveUnplugService("NICS", "XENVIF");
 
-    UnsubscribeInterfaces("XENBUS", "XENVIF");
-
     Log("<====");
 
     return NO_ERROR; 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:21:43 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:21:43 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7GZ-0001yv-FK; Mon, 20 Jul 2015 09:21:43 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7GY-0001yZ-0F
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:21:42 +0000
Received: from [85.158.137.68] by server-17.bemta-3.messagelabs.com id
	59/3F-16276-5ADBCA55; Mon, 20 Jul 2015 09:21:41 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-31.messagelabs.com!1437384098!27357112!1
X-Originating-IP: [74.125.82.42]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27240 invoked from network); 20 Jul 2015 09:21:38 -0000
Received: from mail-wg0-f42.google.com (HELO mail-wg0-f42.google.com)
	(74.125.82.42)
	by server-10.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:21:38 -0000
Received: by wgkl9 with SMTP id l9so125442012wgk.1
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:21:38 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=zn8XqKLYrIe/EZ6OvcOi3v43UMb1m9aM+z97F5j5Abo=;
	b=YlCkCt8bhMl4n5oj62+jS0OW0ThpiV/YEN/nAfRfbNMtuq00FMA620yuyLZJ4skf+h
	UbZFZ0nhoLz76AYlojy7lAjSM6gAx8yLnBpdF3nIYaX+6v/deGgZDPrgyslEA7mNS1B3
	/mFnVP0ssze1zfBroccrlenACTt1JSU7i9SWA8C1VJTYevsAVGzJih1GsexzjUkWGWam
	CTOz1gE7H8CSnUKxxBOTxI5JJdTU8ZLN+4T7z1ZWsiJAmAZBd/2y+uKoqq5jlB+T+euW
	hbSyttgyrsI0GP1TG4YdW52ItxQQh9D3dEagY8lUgTaCE2M4Kf01J4mWvHOEggUigAfQ
	eB5g==
X-Received: by 10.194.86.161 with SMTP id q1mr55959975wjz.18.1437384098622;
	Mon, 20 Jul 2015 02:21:38 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id n6sm10871100wix.1.2015.07.20.02.21.37
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:21:38 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:21:30 +0100
Message-Id: <1437384092-17504-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437384092-17504-1-git-send-email-paul.durrant@citrix.com>
References: <1437384092-17504-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/4] Apply new PDO revision numbering policy
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/revision.h |  43 +++++++++++++
 src/xenvif/pdo.c   | 181 ++++++++++++++++++-----------------------------------
 2 files changed, 104 insertions(+), 120 deletions(-)
 create mode 100644 include/revision.h

diff --git a/include/revision.h b/include/revision.h
new file mode 100644
index 0000000..6ae273c
--- /dev/null
+++ b/include/revision.h
@@ -0,0 +1,43 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _REVISION_H
+#define _REVISION_H
+
+// Key:
+// C  - XENBUS_CACHE_INTERFACE
+// V  - XENVIF_VIF_INTERFACE
+
+//                    REVISION   C   V
+#define DEFINE_REVISION_TABLE                                      \
+    DEFINE_REVISION(0x08000002,  1,  2)
+
+#endif  // _REVISION_H
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index ec4a248..1470c8a 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -58,6 +58,7 @@
 #include "assert.h"
 #include "util.h"
 #include "version.h"
+#include "revision.h"
 
 #define PDO_POOL 'ODP'
 
@@ -76,9 +77,6 @@ struct _XENVIF_PDO {
 
     UNICODE_STRING              ContainerID;
 
-    PULONG                      Revision;
-    ULONG                       Count;
-
     ETHERNET_ADDRESS            PermanentAddress;
     ETHERNET_ADDRESS            CurrentAddress;
 
@@ -528,99 +526,52 @@ fail1:
 
 #define MAXTEXTLEN  1024
 
-static NTSTATUS
-PdoAddRevision(
-    IN  PXENVIF_PDO Pdo,
-    IN  ULONG       Revision
-    )
-{
-    PVOID           Buffer;
-    ULONG           Count;
-    NTSTATUS        status;
-
-    Count = Pdo->Count + 1;
-
-    Buffer = __PdoAllocate(sizeof (ULONG) * Count);
-
-    status = STATUS_NO_MEMORY;
-    if (Buffer == NULL)
-        goto fail1;
-
-    if (Pdo->Revision != NULL) {
-        RtlCopyMemory(Buffer,
-                      Pdo->Revision,
-                      sizeof (ULONG) * Pdo->Count);
-        __PdoFree(Pdo->Revision);
-    }
+typedef struct _XENVIF_PDO_REVISION {
+    ULONG   Number;
+    ULONG   CacheInterfaceVersion;
+    ULONG   VifInterfaceVersion;
+} XENVIF_PDO_REVISION, *PXENVIF_PDO_REVISION;
 
-    Pdo->Revision = Buffer;
-    Pdo->Revision[Pdo->Count] = Revision;
+#define DEFINE_REVISION(_N, _C, _V) \
+    { (_N), (_C), (_V) }
 
-    Pdo->Count++;
-    ASSERT3U(Pdo->Count, <=, 64);
-
-    return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
+static XENVIF_PDO_REVISION PdoRevision[] = {
+    DEFINE_REVISION_TABLE
+};
 
-    return status;
-}
+#undef DEFINE_REVISION
 
-static NTSTATUS
-PdoSetRevisions(
+static VOID
+PdoDumpRevisions(
     IN  PXENVIF_PDO Pdo
     )
 {
-    ULONG           Cache;
-    ULONG           Revision;
-    NTSTATUS        status;
+    ULONG           Index;
 
-    Revision = MAJOR_VERSION << 24;
-
-    // Enumerate all possible combinations of exported interface versions since v1
-    // and add a PDO revsion for each combination that's currently supported. Note that
-    // the exported interfaces include any interface queries we pass through.
-    // We must enumerate from v1 to ensure that revision numbers don't change
-    // even when a particular combination of interface versions becomes
-    // unsupported. (See README.md for API versioning policy).
-
-    for (Cache = 1; Cache <= XENBUS_CACHE_INTERFACE_VERSION_MAX; Cache++) {
-        ULONG       Vif;
-
-        for (Vif = 1; Vif <= XENVIF_VIF_INTERFACE_VERSION_MAX; Vif++) {
-            Revision++;
-
-            if (Cache >= XENBUS_CACHE_INTERFACE_VERSION_MIN &&
-                Vif >= XENVIF_VIF_INTERFACE_VERSION_MIN) {
-                Info("%08X -> "
-                     "CACHE v%u "
-                     "VIF v%u\n",
-                     Revision,
-                     Cache,
-                     Vif);
-
-                status = PdoAddRevision(Pdo, Revision);
-                if (!NT_SUCCESS(status))
-                    goto fail1;
-            }
-        }
-    }
+    UNREFERENCED_PARAMETER(Pdo);
 
-    ASSERT(Pdo->Count > 0);
-    return STATUS_SUCCESS;
+    for (Index = 0; Index < ARRAYSIZE(PdoRevision); Index++) {
+        PXENVIF_PDO_REVISION Revision = &PdoRevision[Index];
 
-fail1:
-    Error("fail1 (%08x)\n", status);
+        ASSERT3U(Revision->CacheInterfaceVersion, >=, XENBUS_CACHE_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->CacheInterfaceVersion, <=, XENBUS_CACHE_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->CacheInterfaceVersion == XENBUS_CACHE_INTERFACE_VERSION_MAX));
 
-    if (Pdo->Revision != NULL) {
-        __PdoFree(Pdo->Revision);
-        Pdo->Revision = NULL;
-    }
+        ASSERT3U(Revision->VifInterfaceVersion, >=, XENVIF_VIF_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->VifInterfaceVersion, <=, XENVIF_VIF_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->VifInterfaceVersion == XENVIF_VIF_INTERFACE_VERSION_MAX));
 
-    Pdo->Count = 0;
+        ASSERT3U(Revision->Number >> 24, ==, MAJOR_VERSION);
 
-    return status;
+        Info("%08X -> "
+             "CACHE v%u "
+             "VIF v%u\n",
+             Revision->Number,
+             Revision->CacheInterfaceVersion,
+             Revision->VifInterfaceVersion);
+    }
 }
 
 static FORCEINLINE PDEVICE_OBJECT
@@ -1823,12 +1774,12 @@ PdoQueryId(
 
     case BusQueryHardwareIDs:
         Trace("BusQueryHardwareIDs\n");
-        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * Pdo->Count) * sizeof (WCHAR);
+        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * ARRAYSIZE(PdoRevision)) * sizeof (WCHAR);
         break;
 
     case BusQueryCompatibleIDs:
         Trace("BusQueryCompatibleIDs\n");
-        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * Pdo->Count) * sizeof (WCHAR);
+        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * ARRAYSIZE(PdoRevision)) * sizeof (WCHAR);
         break;
 
         break;
@@ -1880,16 +1831,18 @@ PdoQueryId(
         break;
 
     case BusQueryDeviceID: {
-        ULONG   Index;
+        ULONG                   Index;
+        PXENVIF_PDO_REVISION    Revision;
 
         Type = REG_SZ;
-        Index = Pdo->Count - 1;
+        Index = ARRAYSIZE(PdoRevision) - 1;
+        Revision = &PdoRevision[Index];
 
         status = RtlStringCbPrintfW(Buffer,
                                     Id.MaximumLength,
                                     L"XENVIF\\VEN_%hs&DEV_NET&REV_%08X",
                                     __PdoGetVendorName(Pdo),
-                                    Pdo->Revision[Index]);
+                                    Revision->Number);
         ASSERT(NT_SUCCESS(status));
 
         Buffer += wcslen(Buffer);
@@ -1904,12 +1857,14 @@ PdoQueryId(
         Type = REG_MULTI_SZ;
         Length = Id.MaximumLength;
 
-        for (Index = 0; Index < Pdo->Count; Index++) {
+        for (Index = 0; Index < ARRAYSIZE(PdoRevision); Index++) {
+            PXENVIF_PDO_REVISION    Revision = &PdoRevision[Index];
+
             status = RtlStringCbPrintfW(Buffer,
                                         Length,
                                         L"XENVIF\\VEN_%hs&DEV_NET&REV_%08X",
                                         __PdoGetVendorName(Pdo),
-                                        Pdo->Revision[Index]);
+                                        Revision->Number);
             ASSERT(NT_SUCCESS(status));
 
             Buffer += wcslen(Buffer);
@@ -2569,21 +2524,17 @@ PdoCreate(
     if (!NT_SUCCESS(status))
         goto fail6;
 
-    status = PdoSetRevisions(Pdo);
-    if (!NT_SUCCESS(status))
-        goto fail7;
-
     status = BusInitialize(Pdo, &Pdo->BusInterface);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail7;
 
     status = VifInitialize(Pdo, &Pdo->VifContext);
     if (!NT_SUCCESS(status))
-        goto fail9;
+        goto fail8;
 
     status = FrontendInitialize(Pdo, &Pdo->Frontend);
     if (!NT_SUCCESS(status))
-        goto fail10;
+        goto fail9;
 
     FdoGetSuspendInterface(Fdo,&Pdo->SuspendInterface);
 
@@ -2591,27 +2542,28 @@ PdoCreate(
 
     status = FdoAddPhysicalDeviceObject(Fdo, Pdo);
     if (!NT_SUCCESS(status))
-        goto fail11;
+        goto fail10;
 
     status = STATUS_UNSUCCESSFUL;
     if (__PdoIsEjectRequested(Pdo))
-        goto fail12;
+        goto fail11;
 
-    Info("%p (%s: Highest Revision = %08X)\n",
+    Info("%p (%s)\n",
          PhysicalDeviceObject,
-         __PdoGetName(Pdo),
-         Pdo->Revision[Pdo->Count - 1]);
+         __PdoGetName(Pdo));
+
+    PdoDumpRevisions(Pdo);
 
     PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
     return STATUS_SUCCESS;
 
-fail12:
-    Error("fail12\n");
+fail11:
+    Error("fail11\n");
 
     FdoRemovePhysicalDeviceObject(Fdo, Pdo);
 
-fail11:
-    Error("fail11\n");
+fail10:
+    Error("fail10\n");
 
     (VOID) __PdoClearEjectRequested(Pdo);
 
@@ -2623,23 +2575,16 @@ fail11:
     FrontendTeardown(__PdoGetFrontend(Pdo));
     Pdo->Frontend = NULL;
 
-fail10:
-    Error("fail10\n");
-
-    VifTeardown(Pdo->VifContext);
-    Pdo->VifContext = NULL;    
-
 fail9:
     Error("fail9\n");
 
-    BusTeardown(&Pdo->BusInterface);
+    VifTeardown(Pdo->VifContext);
+    Pdo->VifContext = NULL;
 
 fail8:
     Error("fail8\n");
 
-    __PdoFree(Pdo->Revision);
-    Pdo->Revision = NULL;
-    Pdo->Count = 0;
+    BusTeardown(&Pdo->BusInterface);
 
 fail7:
     Error("fail7\n");
@@ -2724,10 +2669,6 @@ PdoDestroy(
 
     BusTeardown(&Pdo->BusInterface);
 
-    __PdoFree(Pdo->Revision);
-    Pdo->Revision = NULL;
-    Pdo->Count = 0;
-
     RtlFreeUnicodeString(&Pdo->ContainerID);
     RtlZeroMemory(&Pdo->ContainerID, sizeof (UNICODE_STRING));
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:21:43 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:21:43 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7GZ-0001yv-FK; Mon, 20 Jul 2015 09:21:43 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7GY-0001yZ-0F
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:21:42 +0000
Received: from [85.158.137.68] by server-17.bemta-3.messagelabs.com id
	59/3F-16276-5ADBCA55; Mon, 20 Jul 2015 09:21:41 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-31.messagelabs.com!1437384098!27357112!1
X-Originating-IP: [74.125.82.42]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27240 invoked from network); 20 Jul 2015 09:21:38 -0000
Received: from mail-wg0-f42.google.com (HELO mail-wg0-f42.google.com)
	(74.125.82.42)
	by server-10.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:21:38 -0000
Received: by wgkl9 with SMTP id l9so125442012wgk.1
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:21:38 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=zn8XqKLYrIe/EZ6OvcOi3v43UMb1m9aM+z97F5j5Abo=;
	b=YlCkCt8bhMl4n5oj62+jS0OW0ThpiV/YEN/nAfRfbNMtuq00FMA620yuyLZJ4skf+h
	UbZFZ0nhoLz76AYlojy7lAjSM6gAx8yLnBpdF3nIYaX+6v/deGgZDPrgyslEA7mNS1B3
	/mFnVP0ssze1zfBroccrlenACTt1JSU7i9SWA8C1VJTYevsAVGzJih1GsexzjUkWGWam
	CTOz1gE7H8CSnUKxxBOTxI5JJdTU8ZLN+4T7z1ZWsiJAmAZBd/2y+uKoqq5jlB+T+euW
	hbSyttgyrsI0GP1TG4YdW52ItxQQh9D3dEagY8lUgTaCE2M4Kf01J4mWvHOEggUigAfQ
	eB5g==
X-Received: by 10.194.86.161 with SMTP id q1mr55959975wjz.18.1437384098622;
	Mon, 20 Jul 2015 02:21:38 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id n6sm10871100wix.1.2015.07.20.02.21.37
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:21:38 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:21:30 +0100
Message-Id: <1437384092-17504-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437384092-17504-1-git-send-email-paul.durrant@citrix.com>
References: <1437384092-17504-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/4] Apply new PDO revision numbering policy
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/revision.h |  43 +++++++++++++
 src/xenvif/pdo.c   | 181 ++++++++++++++++++-----------------------------------
 2 files changed, 104 insertions(+), 120 deletions(-)
 create mode 100644 include/revision.h

diff --git a/include/revision.h b/include/revision.h
new file mode 100644
index 0000000..6ae273c
--- /dev/null
+++ b/include/revision.h
@@ -0,0 +1,43 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _REVISION_H
+#define _REVISION_H
+
+// Key:
+// C  - XENBUS_CACHE_INTERFACE
+// V  - XENVIF_VIF_INTERFACE
+
+//                    REVISION   C   V
+#define DEFINE_REVISION_TABLE                                      \
+    DEFINE_REVISION(0x08000002,  1,  2)
+
+#endif  // _REVISION_H
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index ec4a248..1470c8a 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -58,6 +58,7 @@
 #include "assert.h"
 #include "util.h"
 #include "version.h"
+#include "revision.h"
 
 #define PDO_POOL 'ODP'
 
@@ -76,9 +77,6 @@ struct _XENVIF_PDO {
 
     UNICODE_STRING              ContainerID;
 
-    PULONG                      Revision;
-    ULONG                       Count;
-
     ETHERNET_ADDRESS            PermanentAddress;
     ETHERNET_ADDRESS            CurrentAddress;
 
@@ -528,99 +526,52 @@ fail1:
 
 #define MAXTEXTLEN  1024
 
-static NTSTATUS
-PdoAddRevision(
-    IN  PXENVIF_PDO Pdo,
-    IN  ULONG       Revision
-    )
-{
-    PVOID           Buffer;
-    ULONG           Count;
-    NTSTATUS        status;
-
-    Count = Pdo->Count + 1;
-
-    Buffer = __PdoAllocate(sizeof (ULONG) * Count);
-
-    status = STATUS_NO_MEMORY;
-    if (Buffer == NULL)
-        goto fail1;
-
-    if (Pdo->Revision != NULL) {
-        RtlCopyMemory(Buffer,
-                      Pdo->Revision,
-                      sizeof (ULONG) * Pdo->Count);
-        __PdoFree(Pdo->Revision);
-    }
+typedef struct _XENVIF_PDO_REVISION {
+    ULONG   Number;
+    ULONG   CacheInterfaceVersion;
+    ULONG   VifInterfaceVersion;
+} XENVIF_PDO_REVISION, *PXENVIF_PDO_REVISION;
 
-    Pdo->Revision = Buffer;
-    Pdo->Revision[Pdo->Count] = Revision;
+#define DEFINE_REVISION(_N, _C, _V) \
+    { (_N), (_C), (_V) }
 
-    Pdo->Count++;
-    ASSERT3U(Pdo->Count, <=, 64);
-
-    return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
+static XENVIF_PDO_REVISION PdoRevision[] = {
+    DEFINE_REVISION_TABLE
+};
 
-    return status;
-}
+#undef DEFINE_REVISION
 
-static NTSTATUS
-PdoSetRevisions(
+static VOID
+PdoDumpRevisions(
     IN  PXENVIF_PDO Pdo
     )
 {
-    ULONG           Cache;
-    ULONG           Revision;
-    NTSTATUS        status;
+    ULONG           Index;
 
-    Revision = MAJOR_VERSION << 24;
-
-    // Enumerate all possible combinations of exported interface versions since v1
-    // and add a PDO revsion for each combination that's currently supported. Note that
-    // the exported interfaces include any interface queries we pass through.
-    // We must enumerate from v1 to ensure that revision numbers don't change
-    // even when a particular combination of interface versions becomes
-    // unsupported. (See README.md for API versioning policy).
-
-    for (Cache = 1; Cache <= XENBUS_CACHE_INTERFACE_VERSION_MAX; Cache++) {
-        ULONG       Vif;
-
-        for (Vif = 1; Vif <= XENVIF_VIF_INTERFACE_VERSION_MAX; Vif++) {
-            Revision++;
-
-            if (Cache >= XENBUS_CACHE_INTERFACE_VERSION_MIN &&
-                Vif >= XENVIF_VIF_INTERFACE_VERSION_MIN) {
-                Info("%08X -> "
-                     "CACHE v%u "
-                     "VIF v%u\n",
-                     Revision,
-                     Cache,
-                     Vif);
-
-                status = PdoAddRevision(Pdo, Revision);
-                if (!NT_SUCCESS(status))
-                    goto fail1;
-            }
-        }
-    }
+    UNREFERENCED_PARAMETER(Pdo);
 
-    ASSERT(Pdo->Count > 0);
-    return STATUS_SUCCESS;
+    for (Index = 0; Index < ARRAYSIZE(PdoRevision); Index++) {
+        PXENVIF_PDO_REVISION Revision = &PdoRevision[Index];
 
-fail1:
-    Error("fail1 (%08x)\n", status);
+        ASSERT3U(Revision->CacheInterfaceVersion, >=, XENBUS_CACHE_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->CacheInterfaceVersion, <=, XENBUS_CACHE_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->CacheInterfaceVersion == XENBUS_CACHE_INTERFACE_VERSION_MAX));
 
-    if (Pdo->Revision != NULL) {
-        __PdoFree(Pdo->Revision);
-        Pdo->Revision = NULL;
-    }
+        ASSERT3U(Revision->VifInterfaceVersion, >=, XENVIF_VIF_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->VifInterfaceVersion, <=, XENVIF_VIF_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->VifInterfaceVersion == XENVIF_VIF_INTERFACE_VERSION_MAX));
 
-    Pdo->Count = 0;
+        ASSERT3U(Revision->Number >> 24, ==, MAJOR_VERSION);
 
-    return status;
+        Info("%08X -> "
+             "CACHE v%u "
+             "VIF v%u\n",
+             Revision->Number,
+             Revision->CacheInterfaceVersion,
+             Revision->VifInterfaceVersion);
+    }
 }
 
 static FORCEINLINE PDEVICE_OBJECT
@@ -1823,12 +1774,12 @@ PdoQueryId(
 
     case BusQueryHardwareIDs:
         Trace("BusQueryHardwareIDs\n");
-        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * Pdo->Count) * sizeof (WCHAR);
+        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * ARRAYSIZE(PdoRevision)) * sizeof (WCHAR);
         break;
 
     case BusQueryCompatibleIDs:
         Trace("BusQueryCompatibleIDs\n");
-        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * Pdo->Count) * sizeof (WCHAR);
+        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * ARRAYSIZE(PdoRevision)) * sizeof (WCHAR);
         break;
 
         break;
@@ -1880,16 +1831,18 @@ PdoQueryId(
         break;
 
     case BusQueryDeviceID: {
-        ULONG   Index;
+        ULONG                   Index;
+        PXENVIF_PDO_REVISION    Revision;
 
         Type = REG_SZ;
-        Index = Pdo->Count - 1;
+        Index = ARRAYSIZE(PdoRevision) - 1;
+        Revision = &PdoRevision[Index];
 
         status = RtlStringCbPrintfW(Buffer,
                                     Id.MaximumLength,
                                     L"XENVIF\\VEN_%hs&DEV_NET&REV_%08X",
                                     __PdoGetVendorName(Pdo),
-                                    Pdo->Revision[Index]);
+                                    Revision->Number);
         ASSERT(NT_SUCCESS(status));
 
         Buffer += wcslen(Buffer);
@@ -1904,12 +1857,14 @@ PdoQueryId(
         Type = REG_MULTI_SZ;
         Length = Id.MaximumLength;
 
-        for (Index = 0; Index < Pdo->Count; Index++) {
+        for (Index = 0; Index < ARRAYSIZE(PdoRevision); Index++) {
+            PXENVIF_PDO_REVISION    Revision = &PdoRevision[Index];
+
             status = RtlStringCbPrintfW(Buffer,
                                         Length,
                                         L"XENVIF\\VEN_%hs&DEV_NET&REV_%08X",
                                         __PdoGetVendorName(Pdo),
-                                        Pdo->Revision[Index]);
+                                        Revision->Number);
             ASSERT(NT_SUCCESS(status));
 
             Buffer += wcslen(Buffer);
@@ -2569,21 +2524,17 @@ PdoCreate(
     if (!NT_SUCCESS(status))
         goto fail6;
 
-    status = PdoSetRevisions(Pdo);
-    if (!NT_SUCCESS(status))
-        goto fail7;
-
     status = BusInitialize(Pdo, &Pdo->BusInterface);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail7;
 
     status = VifInitialize(Pdo, &Pdo->VifContext);
     if (!NT_SUCCESS(status))
-        goto fail9;
+        goto fail8;
 
     status = FrontendInitialize(Pdo, &Pdo->Frontend);
     if (!NT_SUCCESS(status))
-        goto fail10;
+        goto fail9;
 
     FdoGetSuspendInterface(Fdo,&Pdo->SuspendInterface);
 
@@ -2591,27 +2542,28 @@ PdoCreate(
 
     status = FdoAddPhysicalDeviceObject(Fdo, Pdo);
     if (!NT_SUCCESS(status))
-        goto fail11;
+        goto fail10;
 
     status = STATUS_UNSUCCESSFUL;
     if (__PdoIsEjectRequested(Pdo))
-        goto fail12;
+        goto fail11;
 
-    Info("%p (%s: Highest Revision = %08X)\n",
+    Info("%p (%s)\n",
          PhysicalDeviceObject,
-         __PdoGetName(Pdo),
-         Pdo->Revision[Pdo->Count - 1]);
+         __PdoGetName(Pdo));
+
+    PdoDumpRevisions(Pdo);
 
     PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
     return STATUS_SUCCESS;
 
-fail12:
-    Error("fail12\n");
+fail11:
+    Error("fail11\n");
 
     FdoRemovePhysicalDeviceObject(Fdo, Pdo);
 
-fail11:
-    Error("fail11\n");
+fail10:
+    Error("fail10\n");
 
     (VOID) __PdoClearEjectRequested(Pdo);
 
@@ -2623,23 +2575,16 @@ fail11:
     FrontendTeardown(__PdoGetFrontend(Pdo));
     Pdo->Frontend = NULL;
 
-fail10:
-    Error("fail10\n");
-
-    VifTeardown(Pdo->VifContext);
-    Pdo->VifContext = NULL;    
-
 fail9:
     Error("fail9\n");
 
-    BusTeardown(&Pdo->BusInterface);
+    VifTeardown(Pdo->VifContext);
+    Pdo->VifContext = NULL;
 
 fail8:
     Error("fail8\n");
 
-    __PdoFree(Pdo->Revision);
-    Pdo->Revision = NULL;
-    Pdo->Count = 0;
+    BusTeardown(&Pdo->BusInterface);
 
 fail7:
     Error("fail7\n");
@@ -2724,10 +2669,6 @@ PdoDestroy(
 
     BusTeardown(&Pdo->BusInterface);
 
-    __PdoFree(Pdo->Revision);
-    Pdo->Revision = NULL;
-    Pdo->Count = 0;
-
     RtlFreeUnicodeString(&Pdo->ContainerID);
     RtlZeroMemory(&Pdo->ContainerID, sizeof (UNICODE_STRING));
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:21:45 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:21:45 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7Gb-0001zo-HG; Mon, 20 Jul 2015 09:21:45 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7GZ-0001yn-I5
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:21:43 +0000
Received: from [193.109.254.147] by server-6.bemta-14.messagelabs.com id
	88/AD-13047-6ADBCA55; Mon, 20 Jul 2015 09:21:42 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1437384101!33563777!1
X-Originating-IP: [209.85.212.175]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1961 invoked from network); 20 Jul 2015 09:21:41 -0000
Received: from mail-wi0-f175.google.com (HELO mail-wi0-f175.google.com)
	(209.85.212.175)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:21:41 -0000
Received: by wicgb10 with SMTP id gb10so21144082wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:21:41 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=QvcKjTK49F98BSGS/rv3FRw4k149pw7II/q50PzSAJk=;
	b=owjdA0cmFpyXi6aoU6ROOiku8y6UnEmgQXDZEFbwVjeTwAmzPF0mZoG+ew3oyN3YAn
	a1WdJAutTpaXKuchRbj+C6L57eUmsyek7KQEUg7SV2pepm8955x8WSW7yNFG1zPsGVOK
	ABXEvKUekRTeM7rWWmzxgWJRCmS4DeO3KDiKseXI2C1yaYrsKZMXRsQwdrVHZoBHesqt
	sXc/8w0hRx1K9w1LoyxwiehVjceu+Ig+vpUY1Zsmf2iVGVLvhVzoipiUHZHNBhWSzSbP
	97yCe7q1cQcoZXAynJ1Sl/Mp9QTSJ+ib2ehsbOK2ixBrk3O4589IwXRDa0f5eP40Sacb
	UmzQ==
X-Received: by 10.194.23.194 with SMTP id o2mr55951120wjf.63.1437384101033;
	Mon, 20 Jul 2015 02:21:41 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id n6sm10871100wix.1.2015.07.20.02.21.39
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:21:40 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:21:32 +0100
Message-Id: <1437384092-17504-4-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437384092-17504-1-git-send-email-paul.durrant@citrix.com>
References: <1437384092-17504-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 4/4] Use new unplug mechanism
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/emulated_interface.h | 129 -------------------------------------------
 include/unplug_interface.h   | 116 ++++++++++++++++++++++++++++++++++++++
 src/xenvif.inf               |   6 +-
 src/xenvif/fdo.c             |  22 +++++++-
 src/xenvif/fdo.h             |   4 +-
 src/xenvif/pdo.c             |  69 +++++++++++++++++------
 6 files changed, 195 insertions(+), 151 deletions(-)
 delete mode 100644 include/emulated_interface.h
 create mode 100644 include/unplug_interface.h

diff --git a/include/emulated_interface.h b/include/emulated_interface.h
deleted file mode 100644
index 9361f8d..0000000
--- a/include/emulated_interface.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Copyright (c) Citrix Systems Inc.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, 
- * with or without modification, are permitted provided 
- * that the following conditions are met:
- * 
- * *   Redistributions of source code must retain the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer.
- * *   Redistributions in binary form must reproduce the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer in the documentation and/or other 
- *     materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
- * SUCH DAMAGE.
- */
-
-/*! \file emulated_interface.h
-    \brief XENFILT EMULATED Interface
-
-    This interface provides primitives to determine whether emulated
-    devices or disks are present in the VM
-*/
-
-#ifndef _XENFILT_EMULATED_INTERFACE_H
-#define _XENFILT_EMULATED_INTERFACE_H
-
-#ifndef _WINDLL
-
-/*! \typedef XENFILT_EMULATED_ACQUIRE
-    \brief Acquire a reference to the EMULATED interface
-
-    \param Interface The interface header
-*/  
-typedef NTSTATUS
-(*XENFILT_EMULATED_ACQUIRE)(
-    IN  PINTERFACE  Interface
-    );
-
-/*! \typedef XENFILT_EMULATED_RELEASE
-    \brief Release a reference to the EMULATED interface
-
-    \param Interface The interface header
-*/  
-typedef VOID
-(*XENFILT_EMULATED_RELEASE)(
-    IN  PINTERFACE  Interface
-    );
-
-/*! \typedef XENFILT_EMULATED_IS_DEVICE_PRESENT
-    \brief Determine whether a given device is present in the VM
-
-    \param Interface The interface header
-    \param DeviceID The DeviceID of the device
-    \param InstanceID The (un-prefixed) InstanceID of the device or
-           NULL to match any device instance
-    \return TRUE if the specified device is present in the system or
-    FALSE if it is not
-*/  
-typedef BOOLEAN
-(*XENFILT_EMULATED_IS_DEVICE_PRESENT)(
-    IN  PVOID   Context,
-    IN  PCHAR   DeviceID,
-    IN  PCHAR   InstanceID OPTIONAL
-    );
-
-/*! \typedef XENFILT_EMULATED_IS_DISK_PRESENT
-    \brief Determine whether a given disk is present in the VM
-
-    \param Interface The interface header
-    \param Controller The controller index of the HBA
-    \param Target The target index of the disk
-    \param Lun The Logical Unit Number of the disk within the target
-    \return TRUE if the specified disk is present in the system or
-    FALSE if it is not
-*/  
-typedef BOOLEAN
-(*XENFILT_EMULATED_IS_DISK_PRESENT)(
-    IN  PVOID   Context,
-    IN  ULONG   Controller,
-    IN  ULONG   Target,
-    IN  ULONG   Lun
-    );
-
-// {959027A1-FCCE-4E78-BCF4-637384F499C5}
-DEFINE_GUID(GUID_XENFILT_EMULATED_INTERFACE, 
-0x959027a1, 0xfcce, 0x4e78, 0xbc, 0xf4, 0x63, 0x73, 0x84, 0xf4, 0x99, 0xc5);
-
-/*! \struct _XENFILT_EMULATED_INTERFACE_V1
-    \brief EMULATED interface version 1
-    \ingroup interfaces
-*/
-struct _XENFILT_EMULATED_INTERFACE_V1 {
-    INTERFACE                           Interface;
-    XENFILT_EMULATED_ACQUIRE            EmulatedAcquire;
-    XENFILT_EMULATED_RELEASE            EmulatedRelease;
-    XENFILT_EMULATED_IS_DEVICE_PRESENT  EmulatedIsDevicePresent;
-    XENFILT_EMULATED_IS_DISK_PRESENT    EmulatedIsDiskPresent;
-};
-
-typedef struct _XENFILT_EMULATED_INTERFACE_V1 XENFILT_EMULATED_INTERFACE, *PXENFILT_EMULATED_INTERFACE;
-
-/*! \def XENFILT_EMULATED
-    \brief Macro at assist in method invocation
-*/
-#define XENFILT_EMULATED(_Method, _Interface, ...)    \
-    (_Interface)->Emulated ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
-
-#endif  // _WINDLL
-
-#define XENFILT_EMULATED_INTERFACE_VERSION_MIN  1
-#define XENFILT_EMULATED_INTERFACE_VERSION_MAX  1
-
-#endif  // _XENFILT_EMULATED_INTERFACE_H
-
diff --git a/include/unplug_interface.h b/include/unplug_interface.h
new file mode 100644
index 0000000..6f45975
--- /dev/null
+++ b/include/unplug_interface.h
@@ -0,0 +1,116 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, 
+ * with or without modification, are permitted provided 
+ * that the following conditions are met:
+ * 
+ * *   Redistributions of source code must retain the above 
+ *     copyright notice, this list of conditions and the 
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above 
+ *     copyright notice, this list of conditions and the 
+ *     following disclaimer in the documentation and/or other 
+ *     materials provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
+ * SUCH DAMAGE.
+ */
+
+/*! \file unplug_interface.h
+    \brief XENBUS UNPLUG Interface
+
+    This interface provides a method to request emulated device unplug
+*/
+
+#ifndef _XENBUS_UNPLUG_INTERFACE_H
+#define _XENBUS_UNPLUG_INTERFACE_H
+
+#ifndef _WINDLL
+
+/*! \typedef XENBUS_UNPLUG_ACQUIRE
+    \brief Acquire a reference to the UNPLUG interface
+
+    \param Interface The interface header
+*/  
+typedef NTSTATUS
+(*XENBUS_UNPLUG_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_UNPLUG_RELEASE
+    \brief Release a reference to the UNPLUG interface
+
+    \param Interface The interface header
+*/  
+typedef VOID
+(*XENBUS_UNPLUG_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \enum _XENBUS_UNPLUG_DEVICE_TYPE
+    \brief Type of device to be unplugged
+*/
+typedef enum _XENBUS_UNPLUG_DEVICE_TYPE {
+    XENBUS_UNPLUG_DEVICE_TYPE_INVALID = 0,
+    XENBUS_UNPLUG_DEVICE_TYPE_NICS,     /*!< NICs */
+    XENBUS_UNPLUG_DEVICE_TYPE_DISKS,    /*!< Disks */
+} XENBUS_UNPLUG_DEVICE_TYPE, *PXENBUS_UNPLUG_DEVICE_TYPE;
+
+/*! \typedef XENBUS_UNPLUG_REQUEST
+    \brief Request unplug of a type of emulated device
+
+    \param Interface The interface header
+    \param Type The type of device
+    \param Make Set to TRUE if the request is being made, FALSE if it is
+           being revoked.
+*/  
+typedef VOID
+(*XENBUS_UNPLUG_REQUEST)(
+    IN  PINTERFACE                  Interface,
+    IN  XENBUS_UNPLUG_DEVICE_TYPE   Type,
+    IN  BOOLEAN                     Make
+    );
+
+// {73db6517-3d06-4937-989f-199b7501e229}
+DEFINE_GUID(GUID_XENBUS_UNPLUG_INTERFACE, 
+0x73db6517, 0x3d06, 0x4937, 0x98, 0x9f, 0x19, 0x9b, 0x75, 0x01, 0xe2, 0x29);
+
+/*! \struct _XENBUS_UNPLUG_INTERFACE_V1
+    \brief UNPLUG interface version 1
+    \ingroup interfaces
+*/
+struct _XENBUS_UNPLUG_INTERFACE_V1 {
+    INTERFACE               Interface;
+    XENBUS_UNPLUG_ACQUIRE   UnplugAcquire;
+    XENBUS_UNPLUG_RELEASE   UnplugRelease;
+    XENBUS_UNPLUG_REQUEST   UnplugRequest;
+};
+
+typedef struct _XENBUS_UNPLUG_INTERFACE_V1 XENBUS_UNPLUG_INTERFACE, *PXENBUS_UNPLUG_INTERFACE;
+
+/*! \def XENBUS_UNPLUG
+    \brief Macro at assist in method invocation
+*/
+#define XENBUS_UNPLUG(_Method, _Interface, ...)    \
+    (_Interface)->Unplug ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENBUS_UNPLUG_INTERFACE_VERSION_MIN  1
+#define XENBUS_UNPLUG_INTERFACE_VERSION_MAX  1
+
+#endif  // _XENBUS_UNPLUG_INTERFACE_H
+
diff --git a/src/xenvif.inf b/src/xenvif.inf
index ab1fd36..727fbcc 100644
--- a/src/xenvif.inf
+++ b/src/xenvif.inf
@@ -58,9 +58,9 @@ xenvif_coinst_@MAJOR_VERSION@_@MINOR_VERSION@_@MICRO_VERSION@_@BUILD_NUMBER@.dll
 ; DisplayName		Section		DeviceID
 ; -----------		-------		--------
 
-%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XSC000&DEV_VIF&REV_08000008
-%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XS0001&DEV_VIF&REV_08000008
-%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XS0002&DEV_VIF&REV_08000008
+%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XSC000&DEV_VIF&REV_08000009
+%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XS0001&DEV_VIF&REV_08000009
+%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XS0002&DEV_VIF&REV_08000009
 
 [XenVif_Inst] 
 CopyFiles=XenVif_Copyfiles
diff --git a/src/xenvif/fdo.c b/src/xenvif/fdo.c
index aabc9c1..65d1b55 100644
--- a/src/xenvif/fdo.c
+++ b/src/xenvif/fdo.c
@@ -41,7 +41,7 @@
 #include <store_interface.h>
 #include <gnttab_interface.h>
 #include <suspend_interface.h>
-#include <emulated_interface.h>
+#include <unplug_interface.h>
 
 #include "driver.h"
 #include "registry.h"
@@ -101,6 +101,7 @@ struct _XENVIF_FDO {
     XENBUS_RANGE_SET_INTERFACE  RangeSetInterface;
     XENBUS_CACHE_INTERFACE      CacheInterface;
     XENBUS_GNTTAB_INTERFACE     GnttabInterface;
+    XENBUS_UNPLUG_INTERFACE     UnplugInterface;
 
     PXENBUS_SUSPEND_CALLBACK    SuspendCallbackLate;
 };
@@ -2772,6 +2773,7 @@ DEFINE_FDO_GET_INTERFACE(Store, PXENBUS_STORE_INTERFACE)
 DEFINE_FDO_GET_INTERFACE(RangeSet, PXENBUS_RANGE_SET_INTERFACE)
 DEFINE_FDO_GET_INTERFACE(Cache, PXENBUS_CACHE_INTERFACE)
 DEFINE_FDO_GET_INTERFACE(Gnttab, PXENBUS_GNTTAB_INTERFACE)
+DEFINE_FDO_GET_INTERFACE(Unplug, PXENBUS_UNPLUG_INTERFACE)
 
 NTSTATUS
 FdoCreate(
@@ -2901,6 +2903,15 @@ FdoCreate(
     if (!NT_SUCCESS(status))
         goto fail13;
 
+    status = FDO_QUERY_INTERFACE(Fdo,
+                                 XENBUS,
+                                 UNPLUG,
+                                 (PINTERFACE)&Fdo->UnplugInterface,
+                                 sizeof (Fdo->UnplugInterface),
+                                 FALSE);
+    if (!NT_SUCCESS(status))
+        goto fail14;
+
     Dx->Fdo = Fdo;
 
     InitializeMutex(&Fdo->Mutex);
@@ -2914,6 +2925,12 @@ FdoCreate(
     FunctionDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
     return STATUS_SUCCESS;
 
+fail14:
+    Error("fail14\n");
+
+    RtlZeroMemory(&Fdo->UnplugInterface,
+                  sizeof (XENBUS_UNPLUG_INTERFACE));
+
 fail13:
     Error("fail13\n");
 
@@ -3020,6 +3037,9 @@ FdoDestroy(
 
     Dx->Fdo = NULL;
 
+    RtlZeroMemory(&Fdo->UnplugInterface,
+                  sizeof (XENBUS_UNPLUG_INTERFACE));
+
     RtlZeroMemory(&Fdo->GnttabInterface,
                   sizeof (XENBUS_GNTTAB_INTERFACE));
 
diff --git a/src/xenvif/fdo.h b/src/xenvif/fdo.h
index 68d7b4a..23f07cb 100644
--- a/src/xenvif/fdo.h
+++ b/src/xenvif/fdo.h
@@ -40,7 +40,7 @@
 #include <range_set_interface.h>
 #include <cache_interface.h>
 #include <gnttab_interface.h>
-#include <emulated_interface.h>
+#include <unplug_interface.h>
 
 #include "driver.h"
 #include "types.h"
@@ -142,7 +142,7 @@ DECLARE_FDO_GET_INTERFACE(Store, PXENBUS_STORE_INTERFACE)
 DECLARE_FDO_GET_INTERFACE(RangeSet, PXENBUS_RANGE_SET_INTERFACE)
 DECLARE_FDO_GET_INTERFACE(Cache, PXENBUS_CACHE_INTERFACE)
 DECLARE_FDO_GET_INTERFACE(Gnttab, PXENBUS_GNTTAB_INTERFACE)
-DECLARE_FDO_GET_INTERFACE(Emulated, PXENFILT_EMULATED_INTERFACE)
+DECLARE_FDO_GET_INTERFACE(Unplug, PXENBUS_UNPLUG_INTERFACE)
 
 extern NTSTATUS
 FdoCreate(
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 1470c8a..c61f7e8 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -40,8 +40,8 @@
 #include <bcrypt.h>
 #include <xen.h>
 
-#include <store_interface.h>
-#include <emulated_interface.h>
+#include <suspend_interface.h>
+#include <unplug_interface.h>
 
 #include "names.h"
 #include "fdo.h"
@@ -85,6 +85,8 @@ struct _XENVIF_PDO {
     XENBUS_SUSPEND_INTERFACE    SuspendInterface;
     PXENBUS_SUSPEND_CALLBACK    SuspendCallbackLate;
 
+    XENBUS_UNPLUG_INTERFACE     UnplugInterface;
+
     PXENVIF_FRONTEND            Frontend;
 
     PXENVIF_VIF_CONTEXT         VifContext;
@@ -947,6 +949,11 @@ PdoD3ToD0(
 
     KeLowerIrql(Irql);
 
+    XENBUS_UNPLUG(Request,
+                  &Pdo->UnplugInterface,
+                  XENBUS_UNPLUG_DEVICE_TYPE_NICS,
+                  TRUE);
+
     return STATUS_SUCCESS;
 
 fail3:
@@ -977,6 +984,11 @@ PdoD0ToD3(
 
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
 
+    XENBUS_UNPLUG(Request,
+                  &Pdo->UnplugInterface,
+                  XENBUS_UNPLUG_DEVICE_TYPE_NICS,
+                  FALSE);
+
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
     XENBUS_SUSPEND(Deregister,
@@ -1092,31 +1104,35 @@ PdoStartDevice(
     if (DriverIsRebootRequested())
         goto fail1;
 
+    status = XENBUS_UNPLUG(Acquire, &Pdo->UnplugInterface);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
     status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo),
                                      KEY_ALL_ACCESS,
                                      &Key);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail3;
 
     status = __PdoSetCurrentAddress(Pdo, Key);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail4;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "GetIfTable2",
                                    (PVOID *)&__GetIfTable2);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail5;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "FreeMibTable",
                                    (PVOID *)&__FreeMibTable);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail6;
 
     status = __GetIfTable2(&Table);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail7;
 
     //
     // Look for a network interface with the same permanent address
@@ -1142,7 +1158,7 @@ PdoStartDevice(
             continue;
 
         status = STATUS_UNSUCCESSFUL;
-        goto fail7;
+        goto fail8;
     }
 
     //
@@ -1170,7 +1186,7 @@ PdoStartDevice(
 
     status = PdoD3ToD0(Pdo);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail9;
 
     __PdoSetDevicePnpState(Pdo, Started);
 
@@ -1183,15 +1199,15 @@ PdoStartDevice(
 
     return STATUS_SUCCESS;
 
-fail8:
-    Error("fail8\n");
+fail9:
+    Error("fail9\n");
 
     __FreeMibTable(Table);
 
     goto fail6;
 
-fail7:
-    Error("fail7\n");
+fail8:
+    Error("fail8\n");
 
     (VOID) SettingsSave(Key,
                         Row->Alias,
@@ -1199,24 +1215,34 @@ fail7:
                         &Row->InterfaceGuid,
                         &Row->InterfaceLuid);
 
+    XENBUS_UNPLUG(Request,
+                  &Pdo->UnplugInterface,
+                  XENBUS_UNPLUG_DEVICE_TYPE_NICS,
+                  TRUE);
+
     DriverRequestReboot();
     __FreeMibTable(Table);
 
+fail7:
+    Error("fail7\n");
+
 fail6:
     Error("fail6\n");
 
 fail5:
     Error("fail5\n");
 
+    RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
+
 fail4:
     Error("fail4\n");
 
-    RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
+    RegistryCloseKey(Key);
 
 fail3:
     Error("fail3\n");
 
-    RegistryCloseKey(Key);
+    XENBUS_UNPLUG(Release, &Pdo->UnplugInterface);
 
 fail2:
     Error("fail2\n");
@@ -1277,6 +1303,8 @@ PdoStopDevice(
 
     RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
 
+    XENBUS_UNPLUG(Release, &Pdo->UnplugInterface);
+
     __PdoSetDevicePnpState(Pdo, Stopped);
     status = STATUS_SUCCESS;
 
@@ -1361,6 +1389,8 @@ PdoRemoveDevice(
 done:
     RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
 
+    XENBUS_UNPLUG(Release, &Pdo->UnplugInterface);
+
     NeedInvalidate = FALSE;
 
     FdoAcquireMutex(Fdo);
@@ -2536,7 +2566,8 @@ PdoCreate(
     if (!NT_SUCCESS(status))
         goto fail9;
 
-    FdoGetSuspendInterface(Fdo,&Pdo->SuspendInterface);
+    FdoGetSuspendInterface(Fdo, &Pdo->SuspendInterface);
+    FdoGetUnplugInterface(Fdo, &Pdo->UnplugInterface);
 
     Dx->Pdo = Pdo;
 
@@ -2569,6 +2600,9 @@ fail10:
 
     Dx->Pdo = NULL;
 
+    RtlZeroMemory(&Pdo->UnplugInterface,
+                  sizeof (XENBUS_UNPLUG_INTERFACE));
+
     RtlZeroMemory(&Pdo->SuspendInterface,
                   sizeof (XENBUS_SUSPEND_INTERFACE));
 
@@ -2658,6 +2692,9 @@ PdoDestroy(
 
     Dx->Pdo = NULL;
 
+    RtlZeroMemory(&Pdo->UnplugInterface,
+                  sizeof (XENBUS_UNPLUG_INTERFACE));
+
     RtlZeroMemory(&Pdo->SuspendInterface,
                   sizeof (XENBUS_SUSPEND_INTERFACE));
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:21:45 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:21:45 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7Gb-0001zo-HG; Mon, 20 Jul 2015 09:21:45 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7GZ-0001yn-I5
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:21:43 +0000
Received: from [193.109.254.147] by server-6.bemta-14.messagelabs.com id
	88/AD-13047-6ADBCA55; Mon, 20 Jul 2015 09:21:42 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1437384101!33563777!1
X-Originating-IP: [209.85.212.175]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1961 invoked from network); 20 Jul 2015 09:21:41 -0000
Received: from mail-wi0-f175.google.com (HELO mail-wi0-f175.google.com)
	(209.85.212.175)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:21:41 -0000
Received: by wicgb10 with SMTP id gb10so21144082wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:21:41 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=QvcKjTK49F98BSGS/rv3FRw4k149pw7II/q50PzSAJk=;
	b=owjdA0cmFpyXi6aoU6ROOiku8y6UnEmgQXDZEFbwVjeTwAmzPF0mZoG+ew3oyN3YAn
	a1WdJAutTpaXKuchRbj+C6L57eUmsyek7KQEUg7SV2pepm8955x8WSW7yNFG1zPsGVOK
	ABXEvKUekRTeM7rWWmzxgWJRCmS4DeO3KDiKseXI2C1yaYrsKZMXRsQwdrVHZoBHesqt
	sXc/8w0hRx1K9w1LoyxwiehVjceu+Ig+vpUY1Zsmf2iVGVLvhVzoipiUHZHNBhWSzSbP
	97yCe7q1cQcoZXAynJ1Sl/Mp9QTSJ+ib2ehsbOK2ixBrk3O4589IwXRDa0f5eP40Sacb
	UmzQ==
X-Received: by 10.194.23.194 with SMTP id o2mr55951120wjf.63.1437384101033;
	Mon, 20 Jul 2015 02:21:41 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id n6sm10871100wix.1.2015.07.20.02.21.39
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:21:40 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:21:32 +0100
Message-Id: <1437384092-17504-4-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437384092-17504-1-git-send-email-paul.durrant@citrix.com>
References: <1437384092-17504-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 4/4] Use new unplug mechanism
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/emulated_interface.h | 129 -------------------------------------------
 include/unplug_interface.h   | 116 ++++++++++++++++++++++++++++++++++++++
 src/xenvif.inf               |   6 +-
 src/xenvif/fdo.c             |  22 +++++++-
 src/xenvif/fdo.h             |   4 +-
 src/xenvif/pdo.c             |  69 +++++++++++++++++------
 6 files changed, 195 insertions(+), 151 deletions(-)
 delete mode 100644 include/emulated_interface.h
 create mode 100644 include/unplug_interface.h

diff --git a/include/emulated_interface.h b/include/emulated_interface.h
deleted file mode 100644
index 9361f8d..0000000
--- a/include/emulated_interface.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/* Copyright (c) Citrix Systems Inc.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, 
- * with or without modification, are permitted provided 
- * that the following conditions are met:
- * 
- * *   Redistributions of source code must retain the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer.
- * *   Redistributions in binary form must reproduce the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer in the documentation and/or other 
- *     materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
- * SUCH DAMAGE.
- */
-
-/*! \file emulated_interface.h
-    \brief XENFILT EMULATED Interface
-
-    This interface provides primitives to determine whether emulated
-    devices or disks are present in the VM
-*/
-
-#ifndef _XENFILT_EMULATED_INTERFACE_H
-#define _XENFILT_EMULATED_INTERFACE_H
-
-#ifndef _WINDLL
-
-/*! \typedef XENFILT_EMULATED_ACQUIRE
-    \brief Acquire a reference to the EMULATED interface
-
-    \param Interface The interface header
-*/  
-typedef NTSTATUS
-(*XENFILT_EMULATED_ACQUIRE)(
-    IN  PINTERFACE  Interface
-    );
-
-/*! \typedef XENFILT_EMULATED_RELEASE
-    \brief Release a reference to the EMULATED interface
-
-    \param Interface The interface header
-*/  
-typedef VOID
-(*XENFILT_EMULATED_RELEASE)(
-    IN  PINTERFACE  Interface
-    );
-
-/*! \typedef XENFILT_EMULATED_IS_DEVICE_PRESENT
-    \brief Determine whether a given device is present in the VM
-
-    \param Interface The interface header
-    \param DeviceID The DeviceID of the device
-    \param InstanceID The (un-prefixed) InstanceID of the device or
-           NULL to match any device instance
-    \return TRUE if the specified device is present in the system or
-    FALSE if it is not
-*/  
-typedef BOOLEAN
-(*XENFILT_EMULATED_IS_DEVICE_PRESENT)(
-    IN  PVOID   Context,
-    IN  PCHAR   DeviceID,
-    IN  PCHAR   InstanceID OPTIONAL
-    );
-
-/*! \typedef XENFILT_EMULATED_IS_DISK_PRESENT
-    \brief Determine whether a given disk is present in the VM
-
-    \param Interface The interface header
-    \param Controller The controller index of the HBA
-    \param Target The target index of the disk
-    \param Lun The Logical Unit Number of the disk within the target
-    \return TRUE if the specified disk is present in the system or
-    FALSE if it is not
-*/  
-typedef BOOLEAN
-(*XENFILT_EMULATED_IS_DISK_PRESENT)(
-    IN  PVOID   Context,
-    IN  ULONG   Controller,
-    IN  ULONG   Target,
-    IN  ULONG   Lun
-    );
-
-// {959027A1-FCCE-4E78-BCF4-637384F499C5}
-DEFINE_GUID(GUID_XENFILT_EMULATED_INTERFACE, 
-0x959027a1, 0xfcce, 0x4e78, 0xbc, 0xf4, 0x63, 0x73, 0x84, 0xf4, 0x99, 0xc5);
-
-/*! \struct _XENFILT_EMULATED_INTERFACE_V1
-    \brief EMULATED interface version 1
-    \ingroup interfaces
-*/
-struct _XENFILT_EMULATED_INTERFACE_V1 {
-    INTERFACE                           Interface;
-    XENFILT_EMULATED_ACQUIRE            EmulatedAcquire;
-    XENFILT_EMULATED_RELEASE            EmulatedRelease;
-    XENFILT_EMULATED_IS_DEVICE_PRESENT  EmulatedIsDevicePresent;
-    XENFILT_EMULATED_IS_DISK_PRESENT    EmulatedIsDiskPresent;
-};
-
-typedef struct _XENFILT_EMULATED_INTERFACE_V1 XENFILT_EMULATED_INTERFACE, *PXENFILT_EMULATED_INTERFACE;
-
-/*! \def XENFILT_EMULATED
-    \brief Macro at assist in method invocation
-*/
-#define XENFILT_EMULATED(_Method, _Interface, ...)    \
-    (_Interface)->Emulated ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
-
-#endif  // _WINDLL
-
-#define XENFILT_EMULATED_INTERFACE_VERSION_MIN  1
-#define XENFILT_EMULATED_INTERFACE_VERSION_MAX  1
-
-#endif  // _XENFILT_EMULATED_INTERFACE_H
-
diff --git a/include/unplug_interface.h b/include/unplug_interface.h
new file mode 100644
index 0000000..6f45975
--- /dev/null
+++ b/include/unplug_interface.h
@@ -0,0 +1,116 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, 
+ * with or without modification, are permitted provided 
+ * that the following conditions are met:
+ * 
+ * *   Redistributions of source code must retain the above 
+ *     copyright notice, this list of conditions and the 
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above 
+ *     copyright notice, this list of conditions and the 
+ *     following disclaimer in the documentation and/or other 
+ *     materials provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
+ * SUCH DAMAGE.
+ */
+
+/*! \file unplug_interface.h
+    \brief XENBUS UNPLUG Interface
+
+    This interface provides a method to request emulated device unplug
+*/
+
+#ifndef _XENBUS_UNPLUG_INTERFACE_H
+#define _XENBUS_UNPLUG_INTERFACE_H
+
+#ifndef _WINDLL
+
+/*! \typedef XENBUS_UNPLUG_ACQUIRE
+    \brief Acquire a reference to the UNPLUG interface
+
+    \param Interface The interface header
+*/  
+typedef NTSTATUS
+(*XENBUS_UNPLUG_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_UNPLUG_RELEASE
+    \brief Release a reference to the UNPLUG interface
+
+    \param Interface The interface header
+*/  
+typedef VOID
+(*XENBUS_UNPLUG_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \enum _XENBUS_UNPLUG_DEVICE_TYPE
+    \brief Type of device to be unplugged
+*/
+typedef enum _XENBUS_UNPLUG_DEVICE_TYPE {
+    XENBUS_UNPLUG_DEVICE_TYPE_INVALID = 0,
+    XENBUS_UNPLUG_DEVICE_TYPE_NICS,     /*!< NICs */
+    XENBUS_UNPLUG_DEVICE_TYPE_DISKS,    /*!< Disks */
+} XENBUS_UNPLUG_DEVICE_TYPE, *PXENBUS_UNPLUG_DEVICE_TYPE;
+
+/*! \typedef XENBUS_UNPLUG_REQUEST
+    \brief Request unplug of a type of emulated device
+
+    \param Interface The interface header
+    \param Type The type of device
+    \param Make Set to TRUE if the request is being made, FALSE if it is
+           being revoked.
+*/  
+typedef VOID
+(*XENBUS_UNPLUG_REQUEST)(
+    IN  PINTERFACE                  Interface,
+    IN  XENBUS_UNPLUG_DEVICE_TYPE   Type,
+    IN  BOOLEAN                     Make
+    );
+
+// {73db6517-3d06-4937-989f-199b7501e229}
+DEFINE_GUID(GUID_XENBUS_UNPLUG_INTERFACE, 
+0x73db6517, 0x3d06, 0x4937, 0x98, 0x9f, 0x19, 0x9b, 0x75, 0x01, 0xe2, 0x29);
+
+/*! \struct _XENBUS_UNPLUG_INTERFACE_V1
+    \brief UNPLUG interface version 1
+    \ingroup interfaces
+*/
+struct _XENBUS_UNPLUG_INTERFACE_V1 {
+    INTERFACE               Interface;
+    XENBUS_UNPLUG_ACQUIRE   UnplugAcquire;
+    XENBUS_UNPLUG_RELEASE   UnplugRelease;
+    XENBUS_UNPLUG_REQUEST   UnplugRequest;
+};
+
+typedef struct _XENBUS_UNPLUG_INTERFACE_V1 XENBUS_UNPLUG_INTERFACE, *PXENBUS_UNPLUG_INTERFACE;
+
+/*! \def XENBUS_UNPLUG
+    \brief Macro at assist in method invocation
+*/
+#define XENBUS_UNPLUG(_Method, _Interface, ...)    \
+    (_Interface)->Unplug ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENBUS_UNPLUG_INTERFACE_VERSION_MIN  1
+#define XENBUS_UNPLUG_INTERFACE_VERSION_MAX  1
+
+#endif  // _XENBUS_UNPLUG_INTERFACE_H
+
diff --git a/src/xenvif.inf b/src/xenvif.inf
index ab1fd36..727fbcc 100644
--- a/src/xenvif.inf
+++ b/src/xenvif.inf
@@ -58,9 +58,9 @@ xenvif_coinst_@MAJOR_VERSION@_@MINOR_VERSION@_@MICRO_VERSION@_@BUILD_NUMBER@.dll
 ; DisplayName		Section		DeviceID
 ; -----------		-------		--------
 
-%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XSC000&DEV_VIF&REV_08000008
-%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XS0001&DEV_VIF&REV_08000008
-%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XS0002&DEV_VIF&REV_08000008
+%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XSC000&DEV_VIF&REV_08000009
+%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XS0001&DEV_VIF&REV_08000009
+%XenVifDesc%		=XenVif_Inst,	XENBUS\VEN_XS0002&DEV_VIF&REV_08000009
 
 [XenVif_Inst] 
 CopyFiles=XenVif_Copyfiles
diff --git a/src/xenvif/fdo.c b/src/xenvif/fdo.c
index aabc9c1..65d1b55 100644
--- a/src/xenvif/fdo.c
+++ b/src/xenvif/fdo.c
@@ -41,7 +41,7 @@
 #include <store_interface.h>
 #include <gnttab_interface.h>
 #include <suspend_interface.h>
-#include <emulated_interface.h>
+#include <unplug_interface.h>
 
 #include "driver.h"
 #include "registry.h"
@@ -101,6 +101,7 @@ struct _XENVIF_FDO {
     XENBUS_RANGE_SET_INTERFACE  RangeSetInterface;
     XENBUS_CACHE_INTERFACE      CacheInterface;
     XENBUS_GNTTAB_INTERFACE     GnttabInterface;
+    XENBUS_UNPLUG_INTERFACE     UnplugInterface;
 
     PXENBUS_SUSPEND_CALLBACK    SuspendCallbackLate;
 };
@@ -2772,6 +2773,7 @@ DEFINE_FDO_GET_INTERFACE(Store, PXENBUS_STORE_INTERFACE)
 DEFINE_FDO_GET_INTERFACE(RangeSet, PXENBUS_RANGE_SET_INTERFACE)
 DEFINE_FDO_GET_INTERFACE(Cache, PXENBUS_CACHE_INTERFACE)
 DEFINE_FDO_GET_INTERFACE(Gnttab, PXENBUS_GNTTAB_INTERFACE)
+DEFINE_FDO_GET_INTERFACE(Unplug, PXENBUS_UNPLUG_INTERFACE)
 
 NTSTATUS
 FdoCreate(
@@ -2901,6 +2903,15 @@ FdoCreate(
     if (!NT_SUCCESS(status))
         goto fail13;
 
+    status = FDO_QUERY_INTERFACE(Fdo,
+                                 XENBUS,
+                                 UNPLUG,
+                                 (PINTERFACE)&Fdo->UnplugInterface,
+                                 sizeof (Fdo->UnplugInterface),
+                                 FALSE);
+    if (!NT_SUCCESS(status))
+        goto fail14;
+
     Dx->Fdo = Fdo;
 
     InitializeMutex(&Fdo->Mutex);
@@ -2914,6 +2925,12 @@ FdoCreate(
     FunctionDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
     return STATUS_SUCCESS;
 
+fail14:
+    Error("fail14\n");
+
+    RtlZeroMemory(&Fdo->UnplugInterface,
+                  sizeof (XENBUS_UNPLUG_INTERFACE));
+
 fail13:
     Error("fail13\n");
 
@@ -3020,6 +3037,9 @@ FdoDestroy(
 
     Dx->Fdo = NULL;
 
+    RtlZeroMemory(&Fdo->UnplugInterface,
+                  sizeof (XENBUS_UNPLUG_INTERFACE));
+
     RtlZeroMemory(&Fdo->GnttabInterface,
                   sizeof (XENBUS_GNTTAB_INTERFACE));
 
diff --git a/src/xenvif/fdo.h b/src/xenvif/fdo.h
index 68d7b4a..23f07cb 100644
--- a/src/xenvif/fdo.h
+++ b/src/xenvif/fdo.h
@@ -40,7 +40,7 @@
 #include <range_set_interface.h>
 #include <cache_interface.h>
 #include <gnttab_interface.h>
-#include <emulated_interface.h>
+#include <unplug_interface.h>
 
 #include "driver.h"
 #include "types.h"
@@ -142,7 +142,7 @@ DECLARE_FDO_GET_INTERFACE(Store, PXENBUS_STORE_INTERFACE)
 DECLARE_FDO_GET_INTERFACE(RangeSet, PXENBUS_RANGE_SET_INTERFACE)
 DECLARE_FDO_GET_INTERFACE(Cache, PXENBUS_CACHE_INTERFACE)
 DECLARE_FDO_GET_INTERFACE(Gnttab, PXENBUS_GNTTAB_INTERFACE)
-DECLARE_FDO_GET_INTERFACE(Emulated, PXENFILT_EMULATED_INTERFACE)
+DECLARE_FDO_GET_INTERFACE(Unplug, PXENBUS_UNPLUG_INTERFACE)
 
 extern NTSTATUS
 FdoCreate(
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 1470c8a..c61f7e8 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -40,8 +40,8 @@
 #include <bcrypt.h>
 #include <xen.h>
 
-#include <store_interface.h>
-#include <emulated_interface.h>
+#include <suspend_interface.h>
+#include <unplug_interface.h>
 
 #include "names.h"
 #include "fdo.h"
@@ -85,6 +85,8 @@ struct _XENVIF_PDO {
     XENBUS_SUSPEND_INTERFACE    SuspendInterface;
     PXENBUS_SUSPEND_CALLBACK    SuspendCallbackLate;
 
+    XENBUS_UNPLUG_INTERFACE     UnplugInterface;
+
     PXENVIF_FRONTEND            Frontend;
 
     PXENVIF_VIF_CONTEXT         VifContext;
@@ -947,6 +949,11 @@ PdoD3ToD0(
 
     KeLowerIrql(Irql);
 
+    XENBUS_UNPLUG(Request,
+                  &Pdo->UnplugInterface,
+                  XENBUS_UNPLUG_DEVICE_TYPE_NICS,
+                  TRUE);
+
     return STATUS_SUCCESS;
 
 fail3:
@@ -977,6 +984,11 @@ PdoD0ToD3(
 
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
 
+    XENBUS_UNPLUG(Request,
+                  &Pdo->UnplugInterface,
+                  XENBUS_UNPLUG_DEVICE_TYPE_NICS,
+                  FALSE);
+
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
     XENBUS_SUSPEND(Deregister,
@@ -1092,31 +1104,35 @@ PdoStartDevice(
     if (DriverIsRebootRequested())
         goto fail1;
 
+    status = XENBUS_UNPLUG(Acquire, &Pdo->UnplugInterface);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
     status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo),
                                      KEY_ALL_ACCESS,
                                      &Key);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail3;
 
     status = __PdoSetCurrentAddress(Pdo, Key);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail4;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "GetIfTable2",
                                    (PVOID *)&__GetIfTable2);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail5;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "FreeMibTable",
                                    (PVOID *)&__FreeMibTable);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail6;
 
     status = __GetIfTable2(&Table);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail7;
 
     //
     // Look for a network interface with the same permanent address
@@ -1142,7 +1158,7 @@ PdoStartDevice(
             continue;
 
         status = STATUS_UNSUCCESSFUL;
-        goto fail7;
+        goto fail8;
     }
 
     //
@@ -1170,7 +1186,7 @@ PdoStartDevice(
 
     status = PdoD3ToD0(Pdo);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail9;
 
     __PdoSetDevicePnpState(Pdo, Started);
 
@@ -1183,15 +1199,15 @@ PdoStartDevice(
 
     return STATUS_SUCCESS;
 
-fail8:
-    Error("fail8\n");
+fail9:
+    Error("fail9\n");
 
     __FreeMibTable(Table);
 
     goto fail6;
 
-fail7:
-    Error("fail7\n");
+fail8:
+    Error("fail8\n");
 
     (VOID) SettingsSave(Key,
                         Row->Alias,
@@ -1199,24 +1215,34 @@ fail7:
                         &Row->InterfaceGuid,
                         &Row->InterfaceLuid);
 
+    XENBUS_UNPLUG(Request,
+                  &Pdo->UnplugInterface,
+                  XENBUS_UNPLUG_DEVICE_TYPE_NICS,
+                  TRUE);
+
     DriverRequestReboot();
     __FreeMibTable(Table);
 
+fail7:
+    Error("fail7\n");
+
 fail6:
     Error("fail6\n");
 
 fail5:
     Error("fail5\n");
 
+    RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
+
 fail4:
     Error("fail4\n");
 
-    RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
+    RegistryCloseKey(Key);
 
 fail3:
     Error("fail3\n");
 
-    RegistryCloseKey(Key);
+    XENBUS_UNPLUG(Release, &Pdo->UnplugInterface);
 
 fail2:
     Error("fail2\n");
@@ -1277,6 +1303,8 @@ PdoStopDevice(
 
     RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
 
+    XENBUS_UNPLUG(Release, &Pdo->UnplugInterface);
+
     __PdoSetDevicePnpState(Pdo, Stopped);
     status = STATUS_SUCCESS;
 
@@ -1361,6 +1389,8 @@ PdoRemoveDevice(
 done:
     RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
 
+    XENBUS_UNPLUG(Release, &Pdo->UnplugInterface);
+
     NeedInvalidate = FALSE;
 
     FdoAcquireMutex(Fdo);
@@ -2536,7 +2566,8 @@ PdoCreate(
     if (!NT_SUCCESS(status))
         goto fail9;
 
-    FdoGetSuspendInterface(Fdo,&Pdo->SuspendInterface);
+    FdoGetSuspendInterface(Fdo, &Pdo->SuspendInterface);
+    FdoGetUnplugInterface(Fdo, &Pdo->UnplugInterface);
 
     Dx->Pdo = Pdo;
 
@@ -2569,6 +2600,9 @@ fail10:
 
     Dx->Pdo = NULL;
 
+    RtlZeroMemory(&Pdo->UnplugInterface,
+                  sizeof (XENBUS_UNPLUG_INTERFACE));
+
     RtlZeroMemory(&Pdo->SuspendInterface,
                   sizeof (XENBUS_SUSPEND_INTERFACE));
 
@@ -2658,6 +2692,9 @@ PdoDestroy(
 
     Dx->Pdo = NULL;
 
+    RtlZeroMemory(&Pdo->UnplugInterface,
+                  sizeof (XENBUS_UNPLUG_INTERFACE));
+
     RtlZeroMemory(&Pdo->SuspendInterface,
                   sizeof (XENBUS_SUSPEND_INTERFACE));
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:28:20 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:28:20 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7My-0002Fq-2l; Mon, 20 Jul 2015 09:28:20 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7Mw-0002Fk-2n
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:28:18 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	E9/02-17050-13FBCA55; Mon, 20 Jul 2015 09:28:17 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1437384495!27438080!1
X-Originating-IP: [209.85.160.176]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3175 invoked from network); 20 Jul 2015 09:28:16 -0000
Received: from mail-yk0-f176.google.com (HELO mail-yk0-f176.google.com)
	(209.85.160.176)
	by server-3.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:28:16 -0000
Received: by ykdu72 with SMTP id u72so134310393ykd.2
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:28:15 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=Wbt4UBrLWL6KWNlgJbKf7Al2+cWudIa7RxoLXw3IMj0=;
	b=uGNDLZY/Hi1CrMnF8vMhJNy3pI5nzu2Fs1x5+tySajK2rqI2c0RcmeqvSt664rEKjn
	4SdUoMTjdGAXxRNrTRPZpi4ze5sV8p7Xceauqqjh1d40vuJI4rTt++RoDbCLe5DwFgxZ
	4pTuo95PrIxj3a9xkIxuZEuGrZXyTPhnY6zKP1IVzM2RZ0P3fQOGpvmMEx02RgZJirOc
	O7lBHfgDDxcHzxLGJZD0TGrnLDR/cSbexVIQXCxYeo4D4zNK/YSBSwsZpYDfq/yR09Ky
	OVBkBnImVE+S6Y7EKgg5UQkWNvpN+nKAI2LhERzb/Pn9CWNVjpaqS0pFuGaL4vtPZtQN
	FYWQ==
X-Received: by 10.129.98.198 with SMTP id w189mr26096553ywb.32.1437384495758; 
	Mon, 20 Jul 2015 02:28:15 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	r203sm19562477ywb.27.2015.07.20.02.28.13
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:28:14 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:28:06 +0100
Message-Id: <1437384487-5596-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/2] Update bindings
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

A recent change to XENBUS to introduce a new unplug mechanism was
incompatible with older drivers so the PDO revisions were deliberately
changed. This patch brings XENIFACE up to date with the new revision
number.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xeniface.inf | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/xeniface.inf b/src/xeniface.inf
index 9bb154a..9d0b805 100644
--- a/src/xeniface.inf
+++ b/src/xeniface.inf
@@ -48,9 +48,9 @@ ServiceDestDir.NT.Copy = 11
 ; DisplayName		    Section	      DeviceID
 ; -----------		    -------	      --------
 
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XSC000&DEV_IFACE&REV_08000008
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XS0001&DEV_IFACE&REV_08000008
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XS0002&DEV_IFACE&REV_08000008
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XSC000&DEV_IFACE&REV_08000009
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XS0001&DEV_IFACE&REV_08000009
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XS0002&DEV_IFACE&REV_08000009
 
 [XenIface_Device.NT$ARCH$]
 CopyFiles=XenIface_Device.NT.Copy, ServiceDestDir.NT.Copy
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:28:20 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:28:20 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7My-0002Fq-2l; Mon, 20 Jul 2015 09:28:20 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7Mw-0002Fk-2n
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:28:18 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	E9/02-17050-13FBCA55; Mon, 20 Jul 2015 09:28:17 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1437384495!27438080!1
X-Originating-IP: [209.85.160.176]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3175 invoked from network); 20 Jul 2015 09:28:16 -0000
Received: from mail-yk0-f176.google.com (HELO mail-yk0-f176.google.com)
	(209.85.160.176)
	by server-3.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:28:16 -0000
Received: by ykdu72 with SMTP id u72so134310393ykd.2
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:28:15 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=Wbt4UBrLWL6KWNlgJbKf7Al2+cWudIa7RxoLXw3IMj0=;
	b=uGNDLZY/Hi1CrMnF8vMhJNy3pI5nzu2Fs1x5+tySajK2rqI2c0RcmeqvSt664rEKjn
	4SdUoMTjdGAXxRNrTRPZpi4ze5sV8p7Xceauqqjh1d40vuJI4rTt++RoDbCLe5DwFgxZ
	4pTuo95PrIxj3a9xkIxuZEuGrZXyTPhnY6zKP1IVzM2RZ0P3fQOGpvmMEx02RgZJirOc
	O7lBHfgDDxcHzxLGJZD0TGrnLDR/cSbexVIQXCxYeo4D4zNK/YSBSwsZpYDfq/yR09Ky
	OVBkBnImVE+S6Y7EKgg5UQkWNvpN+nKAI2LhERzb/Pn9CWNVjpaqS0pFuGaL4vtPZtQN
	FYWQ==
X-Received: by 10.129.98.198 with SMTP id w189mr26096553ywb.32.1437384495758; 
	Mon, 20 Jul 2015 02:28:15 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	r203sm19562477ywb.27.2015.07.20.02.28.13
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:28:14 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:28:06 +0100
Message-Id: <1437384487-5596-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/2] Update bindings
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

A recent change to XENBUS to introduce a new unplug mechanism was
incompatible with older drivers so the PDO revisions were deliberately
changed. This patch brings XENIFACE up to date with the new revision
number.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xeniface.inf | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/xeniface.inf b/src/xeniface.inf
index 9bb154a..9d0b805 100644
--- a/src/xeniface.inf
+++ b/src/xeniface.inf
@@ -48,9 +48,9 @@ ServiceDestDir.NT.Copy = 11
 ; DisplayName		    Section	      DeviceID
 ; -----------		    -------	      --------
 
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XSC000&DEV_IFACE&REV_08000008
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XS0001&DEV_IFACE&REV_08000008
-%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XS0002&DEV_IFACE&REV_08000008
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XSC000&DEV_IFACE&REV_08000009
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XS0001&DEV_IFACE&REV_08000009
+%XenIfaceDevice.DeviceDesc% =XenIface_Device, XENBUS\VEN_XS0002&DEV_IFACE&REV_08000009
 
 [XenIface_Device.NT$ARCH$]
 CopyFiles=XenIface_Device.NT.Copy, ServiceDestDir.NT.Copy
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:28:22 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:28:22 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7N0-0002GJ-3r; Mon, 20 Jul 2015 09:28:22 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7My-0002Fp-Id
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:28:20 +0000
Received: from [193.109.254.147] by server-14.bemta-14.messagelabs.com id
	D3/06-21300-33FBCA55; Mon, 20 Jul 2015 09:28:19 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1437384497!33566219!1
X-Originating-IP: [209.85.160.180]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13441 invoked from network); 20 Jul 2015 09:28:18 -0000
Received: from mail-yk0-f180.google.com (HELO mail-yk0-f180.google.com)
	(209.85.160.180)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:28:18 -0000
Received: by ykdu72 with SMTP id u72so134310823ykd.2
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:28:17 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=zlW6/gT656L7vks9CSPV41TcOfP3ktaodFcLw8ph8cY=;
	b=YQ+cZvTPeBnRjAHEgo8Esytn/L2PW2bstiaYczMsHRLcfZe3mwIDKXM8NAk6L+PVNE
	3EAb3XzkLc8f5FAhwIJ8f9VQUW40BEW4oTZrM62W0UnwEGFuFM7fFHahfZk9r65z/XME
	Ru+5Bnl9VRwR0gCTEASNfy6rOS4nrfFeLJNIRtT0ts16ikZ3p3oFulGv4J45NuxxwbNT
	5vxmPHFI/8mbSzuqT7j7bahOQWppAOgunFnWYDuGsea5/zPx35CB1af8k+mnouYvXoW9
	l4tldivxXTadA+p9uvVIIDxzZ/xAkoAgqZEACCC3EXD1WApJMcNlG8lw9tNOj/9eU6uh
	vDhA==
X-Received: by 10.170.35.74 with SMTP id 71mr27386453ykd.35.1437384497727;
	Mon, 20 Jul 2015 02:28:17 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	r203sm19562477ywb.27.2015.07.20.02.28.15
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:28:16 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:28:07 +0100
Message-Id: <1437384487-5596-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437384487-5596-1-git-send-email-paul.durrant@citrix.com>
References: <1437384487-5596-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Remove use of subscriber keys from
	co-installer
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

They are no longer necessary. The co-installer actually does nothing now
and can probably be removed.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 199 +---------------------------------------------------
 1 file changed, 2 insertions(+), 197 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index dd1aad1..e30631e 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -50,21 +50,6 @@ __user_code;
 
 #define MAXIMUM_BUFFER_SIZE 1024
 
-#define SERVICES_KEY "SYSTEM\\CurrentControlSet\\Services"
-
-#define SERVICE_KEY(_Driver)    \
-        SERVICES_KEY ## "\\" ## #_Driver
-
-#define PARAMETERS_KEY(_Driver) \
-        SERVICE_KEY(_Driver) ## "\\Parameters"
-
-#define CONTROL_KEY "SYSTEM\\CurrentControlSet\\Control"
-
-#define CLASS_KEY   \
-        CONTROL_KEY ## "\\Class"
-
-#define ENUM_KEY    "SYSTEM\\CurrentControlSet\\Enum"
-
 static VOID
 #pragma prefast(suppress:6262) // Function uses '1036' bytes of stack: exceeds /analyze:stacksize'1024'
 __Log(
@@ -193,176 +178,6 @@ FunctionName(
 #undef  _NAME
 }
 
-static HKEY
-OpenInterfacesKey(
-    IN  PTCHAR  ProviderName
-    )
-{
-    HRESULT     Result;
-    TCHAR       KeyName[MAX_PATH];
-    HKEY        Key;
-    HRESULT     Error;
-
-    Result = StringCbPrintf(KeyName,
-                            MAX_PATH,
-                            "%s\\%s\\Interfaces",
-                            SERVICES_KEY,
-                            ProviderName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail1;
-    }
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         KeyName,
-                         0,
-                         KEY_ALL_ACCESS,
-                         &Key);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    return Key;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static BOOLEAN
-SubscribeInterface(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  SubscriberName,
-    IN  PTCHAR  InterfaceName,
-    IN  DWORD   InterfaceVersion
-    )
-{
-    HKEY        Key;
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL)
-        goto fail1;
-
-    Error = RegCreateKeyEx(InterfacesKey,
-                           SubscriberName,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &Key,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    Error = RegSetValueEx(Key,
-                          InterfaceName,
-                          0,
-                          REG_DWORD,
-                          (const BYTE *)&InterfaceVersion,
-                          sizeof(DWORD));
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    Log("%s: %s_%s_INTERFACE_VERSION %u",
-        SubscriberName,
-        ProviderName,
-        InterfaceName,
-        InterfaceVersion);
-
-    RegCloseKey(Key);
-    RegCloseKey(InterfacesKey);
-
-    return TRUE;
-
-fail3:
-    RegCloseKey(Key);
-
-fail2:
-    RegCloseKey(InterfacesKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-#define SUBSCRIBE_INTERFACE(_ProviderName, _SubscriberName, _InterfaceName)                        \
-    do {                                                                                           \
-        (VOID) SubscribeInterface(#_ProviderName,                                                  \
-                                  #_SubscriberName,                                                \
-                                  #_InterfaceName,                                                 \
-                                  _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MAX); \
-    } while (FALSE);
-
-static BOOLEAN
-UnsubscribeInterfaces(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  SubscriberName
-    )
-{
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    Log("%s: %s", SubscriberName, ProviderName);
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL) {
-        goto fail1;
-    }
-
-    Error = RegDeleteTree(InterfacesKey,
-                          SubscriberName);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    RegCloseKey(InterfacesKey);
-
-    return TRUE;
-
-fail2:
-    RegCloseKey(InterfacesKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
 static HRESULT
 DifInstallPreProcess(
     IN  HDEVINFO                    DeviceInfoSet,
@@ -390,13 +205,7 @@ DifInstallPostProcess(
     UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
-    Log("====>");
-
-    SUBSCRIBE_INTERFACE(XENBUS, XENIFACE, SUSPEND);
-    SUBSCRIBE_INTERFACE(XENBUS, XENIFACE, SHARED_INFO);
-    SUBSCRIBE_INTERFACE(XENBUS, XENIFACE, STORE);
-
-    Log("<====");
+    Log("<===>");
 
     return NO_ERROR;
 }
@@ -468,11 +277,7 @@ DifRemovePreProcess(
     UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
-    Log("====>");
-
-    UnsubscribeInterfaces("XENBUS", "XENIFACE");
-
-    Log("<====");
+    Log("<===>");
 
     return NO_ERROR;
 }
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:28:22 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:28:22 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7N0-0002GJ-3r; Mon, 20 Jul 2015 09:28:22 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7My-0002Fp-Id
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:28:20 +0000
Received: from [193.109.254.147] by server-14.bemta-14.messagelabs.com id
	D3/06-21300-33FBCA55; Mon, 20 Jul 2015 09:28:19 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1437384497!33566219!1
X-Originating-IP: [209.85.160.180]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13441 invoked from network); 20 Jul 2015 09:28:18 -0000
Received: from mail-yk0-f180.google.com (HELO mail-yk0-f180.google.com)
	(209.85.160.180)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:28:18 -0000
Received: by ykdu72 with SMTP id u72so134310823ykd.2
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:28:17 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=zlW6/gT656L7vks9CSPV41TcOfP3ktaodFcLw8ph8cY=;
	b=YQ+cZvTPeBnRjAHEgo8Esytn/L2PW2bstiaYczMsHRLcfZe3mwIDKXM8NAk6L+PVNE
	3EAb3XzkLc8f5FAhwIJ8f9VQUW40BEW4oTZrM62W0UnwEGFuFM7fFHahfZk9r65z/XME
	Ru+5Bnl9VRwR0gCTEASNfy6rOS4nrfFeLJNIRtT0ts16ikZ3p3oFulGv4J45NuxxwbNT
	5vxmPHFI/8mbSzuqT7j7bahOQWppAOgunFnWYDuGsea5/zPx35CB1af8k+mnouYvXoW9
	l4tldivxXTadA+p9uvVIIDxzZ/xAkoAgqZEACCC3EXD1WApJMcNlG8lw9tNOj/9eU6uh
	vDhA==
X-Received: by 10.170.35.74 with SMTP id 71mr27386453ykd.35.1437384497727;
	Mon, 20 Jul 2015 02:28:17 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	r203sm19562477ywb.27.2015.07.20.02.28.15
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:28:16 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:28:07 +0100
Message-Id: <1437384487-5596-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437384487-5596-1-git-send-email-paul.durrant@citrix.com>
References: <1437384487-5596-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Remove use of subscriber keys from
	co-installer
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

They are no longer necessary. The co-installer actually does nothing now
and can probably be removed.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 199 +---------------------------------------------------
 1 file changed, 2 insertions(+), 197 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index dd1aad1..e30631e 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -50,21 +50,6 @@ __user_code;
 
 #define MAXIMUM_BUFFER_SIZE 1024
 
-#define SERVICES_KEY "SYSTEM\\CurrentControlSet\\Services"
-
-#define SERVICE_KEY(_Driver)    \
-        SERVICES_KEY ## "\\" ## #_Driver
-
-#define PARAMETERS_KEY(_Driver) \
-        SERVICE_KEY(_Driver) ## "\\Parameters"
-
-#define CONTROL_KEY "SYSTEM\\CurrentControlSet\\Control"
-
-#define CLASS_KEY   \
-        CONTROL_KEY ## "\\Class"
-
-#define ENUM_KEY    "SYSTEM\\CurrentControlSet\\Enum"
-
 static VOID
 #pragma prefast(suppress:6262) // Function uses '1036' bytes of stack: exceeds /analyze:stacksize'1024'
 __Log(
@@ -193,176 +178,6 @@ FunctionName(
 #undef  _NAME
 }
 
-static HKEY
-OpenInterfacesKey(
-    IN  PTCHAR  ProviderName
-    )
-{
-    HRESULT     Result;
-    TCHAR       KeyName[MAX_PATH];
-    HKEY        Key;
-    HRESULT     Error;
-
-    Result = StringCbPrintf(KeyName,
-                            MAX_PATH,
-                            "%s\\%s\\Interfaces",
-                            SERVICES_KEY,
-                            ProviderName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail1;
-    }
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         KeyName,
-                         0,
-                         KEY_ALL_ACCESS,
-                         &Key);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    return Key;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static BOOLEAN
-SubscribeInterface(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  SubscriberName,
-    IN  PTCHAR  InterfaceName,
-    IN  DWORD   InterfaceVersion
-    )
-{
-    HKEY        Key;
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL)
-        goto fail1;
-
-    Error = RegCreateKeyEx(InterfacesKey,
-                           SubscriberName,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &Key,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    Error = RegSetValueEx(Key,
-                          InterfaceName,
-                          0,
-                          REG_DWORD,
-                          (const BYTE *)&InterfaceVersion,
-                          sizeof(DWORD));
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    Log("%s: %s_%s_INTERFACE_VERSION %u",
-        SubscriberName,
-        ProviderName,
-        InterfaceName,
-        InterfaceVersion);
-
-    RegCloseKey(Key);
-    RegCloseKey(InterfacesKey);
-
-    return TRUE;
-
-fail3:
-    RegCloseKey(Key);
-
-fail2:
-    RegCloseKey(InterfacesKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-#define SUBSCRIBE_INTERFACE(_ProviderName, _SubscriberName, _InterfaceName)                        \
-    do {                                                                                           \
-        (VOID) SubscribeInterface(#_ProviderName,                                                  \
-                                  #_SubscriberName,                                                \
-                                  #_InterfaceName,                                                 \
-                                  _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MAX); \
-    } while (FALSE);
-
-static BOOLEAN
-UnsubscribeInterfaces(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  SubscriberName
-    )
-{
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    Log("%s: %s", SubscriberName, ProviderName);
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL) {
-        goto fail1;
-    }
-
-    Error = RegDeleteTree(InterfacesKey,
-                          SubscriberName);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    RegCloseKey(InterfacesKey);
-
-    return TRUE;
-
-fail2:
-    RegCloseKey(InterfacesKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
 static HRESULT
 DifInstallPreProcess(
     IN  HDEVINFO                    DeviceInfoSet,
@@ -390,13 +205,7 @@ DifInstallPostProcess(
     UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
-    Log("====>");
-
-    SUBSCRIBE_INTERFACE(XENBUS, XENIFACE, SUSPEND);
-    SUBSCRIBE_INTERFACE(XENBUS, XENIFACE, SHARED_INFO);
-    SUBSCRIBE_INTERFACE(XENBUS, XENIFACE, STORE);
-
-    Log("<====");
+    Log("<===>");
 
     return NO_ERROR;
 }
@@ -468,11 +277,7 @@ DifRemovePreProcess(
     UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
-    Log("====>");
-
-    UnsubscribeInterfaces("XENBUS", "XENIFACE");
-
-    Log("<====");
+    Log("<===>");
 
     return NO_ERROR;
 }
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:29:07 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:29:07 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7Ni-0002H7-6Z; Mon, 20 Jul 2015 09:29:06 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7Ng-0002H2-TG
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:29:05 +0000
Received: from [193.109.254.147] by server-5.bemta-14.messagelabs.com id
	49/A5-29123-06FBCA55; Mon, 20 Jul 2015 09:29:04 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1437384541!33516754!1
X-Originating-IP: [209.85.160.178]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20017 invoked from network); 20 Jul 2015 09:29:02 -0000
Received: from mail-yk0-f178.google.com (HELO mail-yk0-f178.google.com)
	(209.85.160.178)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:29:02 -0000
Received: by ykdu72 with SMTP id u72so134320478ykd.2
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:29:01 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=TuEJD5klun/23sJZemP6nPaBTxezemWIngc27qriKtQ=;
	b=0KPEwk8ncnMBJMAvww5BCByjMMITLxMXuGFY5po1VPS2aew1ZSS+bTtKXUQVMQ7DCa
	a7+CUDsgFC89qXSoOMDItJtHSHQ7SJ1Wuctf7pZ6DkTYUl95/AC6TqQWf8Ou7v+JL3yN
	nqDfXZPPuuxXnN3vr5cLgs+R4LMhjtS8pgRZC8p417SZ/213hz168wXhIxtZVt/05FoD
	tiUGiXRMLRPZwvE0j5oknoLGxZ/JegslKAR4NAiaei9I9BT7dTol65UllDBBAj2MeHr3
	McYbY/UXASKRt1KhohKfUN7FXnJxYM5g54wTiBXQNeUPQ/OKvuOIHGQIjakf7Yuh+6lj
	pPwg==
X-Received: by 10.170.48.134 with SMTP id 128mr27168559ykq.36.1437384541444;
	Mon, 20 Jul 2015 02:29:01 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	a128sm19550541ywf.48.2015.07.20.02.28.59
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:29:00 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:28:54 +0100
Message-Id: <1437384534-3876-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove interface subscription and unplug
	code from the co-installed...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...and use the new XENBUS_UNPLUG interface to request unplug.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/unplug_interface.h | 115 +++++++++++
 src/coinst/coinst.c        | 504 ++++++---------------------------------------
 src/xenvbd.inf             |   6 +-
 src/xenvbd/driver.c        |  30 ++-
 src/xenvbd/driver.h        |   2 +-
 src/xenvbd/fdo.c           |  55 ++++-
 src/xenvbd/fdo.h           |   6 +
 src/xenvbd/pdo.c           |  58 +++++-
 8 files changed, 312 insertions(+), 464 deletions(-)
 create mode 100644 include/unplug_interface.h

diff --git a/include/unplug_interface.h b/include/unplug_interface.h
new file mode 100644
index 0000000..99d4e7d
--- /dev/null
+++ b/include/unplug_interface.h
@@ -0,0 +1,115 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*! \file unplug_interface.h
+    \brief XENBUS UNPLUG Interface
+
+    This interface provides a method to request emulated device unplug
+*/
+
+#ifndef _XENBUS_UNPLUG_INTERFACE_H
+#define _XENBUS_UNPLUG_INTERFACE_H
+
+#ifndef _WINDLL
+
+/*! \typedef XENBUS_UNPLUG_ACQUIRE
+    \brief Acquire a reference to the UNPLUG interface
+
+    \param Interface The interface header
+*/
+typedef NTSTATUS
+(*XENBUS_UNPLUG_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_UNPLUG_RELEASE
+    \brief Release a reference to the UNPLUG interface
+
+    \param Interface The interface header
+*/
+typedef VOID
+(*XENBUS_UNPLUG_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \enum _XENBUS_UNPLUG_DEVICE_TYPE
+    \brief Type of device to be unplugged
+*/
+typedef enum _XENBUS_UNPLUG_DEVICE_TYPE {
+    XENBUS_UNPLUG_DEVICE_TYPE_INVALID = 0,
+    XENBUS_UNPLUG_DEVICE_TYPE_NICS,     /*!< NICs */
+    XENBUS_UNPLUG_DEVICE_TYPE_DISKS,    /*!< Disks */
+} XENBUS_UNPLUG_DEVICE_TYPE, *PXENBUS_UNPLUG_DEVICE_TYPE;
+
+/*! \typedef XENBUS_UNPLUG_REQUEST
+    \brief Request unplug of a type of emulated device
+
+    \param Interface The interface header
+    \param Type The type of device
+    \param Make Set to TRUE if the request is being made, FALSE if it is
+           being revoked.
+*/
+typedef VOID
+(*XENBUS_UNPLUG_REQUEST)(
+    IN  PINTERFACE                  Interface,
+    IN  XENBUS_UNPLUG_DEVICE_TYPE   Type,
+    IN  BOOLEAN                     Make
+    );
+
+// {73db6517-3d06-4937-989f-199b7501e229}
+DEFINE_GUID(GUID_XENBUS_UNPLUG_INTERFACE,
+0x73db6517, 0x3d06, 0x4937, 0x98, 0x9f, 0x19, 0x9b, 0x75, 0x01, 0xe2, 0x29);
+
+/*! \struct _XENBUS_UNPLUG_INTERFACE_V1
+    \brief UNPLUG interface version 1
+    \ingroup interfaces
+*/
+struct _XENBUS_UNPLUG_INTERFACE_V1 {
+    INTERFACE               Interface;
+    XENBUS_UNPLUG_ACQUIRE   UnplugAcquire;
+    XENBUS_UNPLUG_RELEASE   UnplugRelease;
+    XENBUS_UNPLUG_REQUEST   UnplugRequest;
+};
+
+typedef struct _XENBUS_UNPLUG_INTERFACE_V1 XENBUS_UNPLUG_INTERFACE, *PXENBUS_UNPLUG_INTERFACE;
+
+/*! \def XENBUS_UNPLUG
+    \brief Macro at assist in method invocation
+*/
+#define XENBUS_UNPLUG(_Method, _Interface, ...)    \
+    (_Interface)->Unplug ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENBUS_UNPLUG_INTERFACE_VERSION_MIN  1
+#define XENBUS_UNPLUG_INTERFACE_VERSION_MAX  1
+
+#endif  // _XENBUS_UNPLUG_INTERFACE_H
diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 7233b9b..9069435 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -35,13 +35,6 @@
 #include <stdlib.h>
 #include <strsafe.h>
 
-#include <debug_interface.h>
-#include <suspend_interface.h>
-#include <evtchn_interface.h>
-#include <store_interface.h>
-#include <gnttab_interface.h>
-#include <emulated_interface.h>
-
 #include <version.h>
 
 __user_code;
@@ -53,8 +46,8 @@ __user_code;
 #define SERVICE_KEY(_Driver)    \
         SERVICES_KEY ## "\\" ## #_Driver
 
-#define UNPLUG_KEY \
-        SERVICE_KEY(XENFILT) ## "\\Unplug"
+#define STATUS_KEY  \
+        SERVICE_KEY(XENVBD) ## "\\Status"
 
 #define CONTROL_KEY "SYSTEM\\CurrentControlSet\\Control"
 
@@ -190,271 +183,6 @@ __FunctionName(
 }
 
 static BOOLEAN
-InstallUnplugService(
-    IN  PTCHAR      ClassName,
-    IN  PTCHAR      ServiceName
-    )
-{
-    HKEY            UnplugKey;
-    HRESULT         Error;
-    DWORD           Type;
-    DWORD           OldLength;
-    DWORD           NewLength;
-    PTCHAR          ServiceNames;
-    ULONG           Offset;
-
-    Error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
-                           UNPLUG_KEY,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &UnplugKey,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Error = RegQueryValueEx(UnplugKey,
-                            ClassName,
-                            NULL,
-                            &Type,
-                            NULL,
-                            &OldLength);
-    if (Error != ERROR_SUCCESS) {
-        if (Error == ERROR_FILE_NOT_FOUND) {
-            Type = REG_MULTI_SZ;
-            OldLength = sizeof (TCHAR);
-        } else {
-            SetLastError(Error);
-            goto fail2;
-        }
-    }
-
-    if (Type != REG_MULTI_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail3;
-    }
-
-    NewLength = OldLength + (DWORD)((strlen(ServiceName) + 1) * sizeof (TCHAR));
-
-    ServiceNames = calloc(1, NewLength);
-    if (ServiceNames == NULL)
-        goto fail4;
-
-    Offset = 0;
-    if (OldLength != sizeof (TCHAR)) {
-        Error = RegQueryValueEx(UnplugKey,
-                                ClassName,
-                                NULL,
-                                &Type,
-                                (LPBYTE)ServiceNames,
-                                &OldLength);
-        if (Error != ERROR_SUCCESS) {
-            SetLastError(ERROR_BAD_FORMAT);
-            goto fail5;
-        }
-
-        while (ServiceNames[Offset] != '\0') {
-            ULONG   ServiceNameLength;
-
-            ServiceNameLength = (ULONG)strlen(&ServiceNames[Offset]) / sizeof (TCHAR);
-
-            if (_stricmp(&ServiceNames[Offset], ServiceName) == 0) {
-                Log("%s already present", ServiceName);
-                goto done;
-            }
-
-            Offset += ServiceNameLength + 1;
-        }
-    }
-
-    memmove(&ServiceNames[Offset], ServiceName, strlen(ServiceName));
-    Log("added %s", ServiceName);
-
-    Error = RegSetValueEx(UnplugKey,
-                          ClassName,
-                          0,
-                          REG_MULTI_SZ,
-                          (LPBYTE)ServiceNames,
-                          NewLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail6;
-    }
-
-done:
-    free(ServiceNames);
-
-    RegCloseKey(UnplugKey);
-
-    return TRUE;
-
-fail6:
-    Log("fail5");
-
-fail5:
-    Log("fail5");
-
-    free(ServiceNames);
-
-fail4:
-    Log("fail5");
-
-fail3:
-    Log("fail5");
-
-fail2:
-    Log("fail5");
-
-    RegCloseKey(UnplugKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-RemoveUnplugService(
-    IN  PTCHAR      ClassName,
-    IN  PTCHAR      ServiceName
-    )
-{
-    HKEY            UnplugKey;
-    HRESULT         Error;
-    DWORD           Type;
-    DWORD           OldLength;
-    DWORD           NewLength;
-    PTCHAR          ServiceNames;
-    ULONG           Offset;
-    ULONG           ServiceNameLength;
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         UNPLUG_KEY,
-                         0,
-                         KEY_ALL_ACCESS,
-                         &UnplugKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Error = RegQueryValueEx(UnplugKey,
-                            ClassName,
-                            NULL,
-                            &Type,
-                            NULL,
-                            &OldLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    if (Type != REG_MULTI_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail3;
-    }
-
-    ServiceNames = calloc(1, OldLength);
-    if (ServiceNames == NULL)
-        goto fail4;
-
-    Error = RegQueryValueEx(UnplugKey,
-                            ClassName,
-                            NULL,
-                            &Type,
-                            (LPBYTE)ServiceNames,
-                            &OldLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail5;
-    }
-
-    Offset = 0;
-    ServiceNameLength = 0;
-    while (ServiceNames[Offset] != '\0') {
-        ServiceNameLength = (ULONG)strlen(&ServiceNames[Offset]) / sizeof (TCHAR);
-
-        if (_stricmp(&ServiceNames[Offset], ServiceName) == 0)
-            goto remove;
-
-        Offset += ServiceNameLength + 1;
-    }
-
-    goto done;
-
-remove:
-    NewLength = OldLength - ((ServiceNameLength + 1) * sizeof (TCHAR));
-
-    memmove(&ServiceNames[Offset],
-            &ServiceNames[Offset + ServiceNameLength + 1],
-            (NewLength - Offset) * sizeof (TCHAR));
-
-    Log("removed %s", ServiceName);
-
-    Error = RegSetValueEx(UnplugKey,
-                          ClassName,
-                          0,
-                          REG_MULTI_SZ,
-                          (LPBYTE)ServiceNames,
-                          NewLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail6;
-    }
-
-done:
-    free(ServiceNames);
-
-    RegCloseKey(UnplugKey);
-
-    return TRUE;
-
-fail6:
-    Log("fail6");
-
-fail5:
-    Log("fail5");
-
-    free(ServiceNames);
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(UnplugKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
 OverrideGroupPolicyOptions(
     )
 {
@@ -610,154 +338,65 @@ fail1:
 }
 
 static BOOLEAN
-RequestReboot(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData
+CheckStatus(
+    OUT PBOOLEAN    NeedReboot
     )
 {
-    SP_DEVINSTALL_PARAMS    DeviceInstallParams;
-    HRESULT                 Error;
-
-    DeviceInstallParams.cbSize = sizeof (DeviceInstallParams);
-
-    if (!SetupDiGetDeviceInstallParams(DeviceInfoSet,
-                                       DeviceInfoData,
-                                       &DeviceInstallParams))
-        goto fail1;
-
-    DeviceInstallParams.Flags |= DI_NEEDREBOOT;
-
-    Log("Flags = %08x", DeviceInstallParams.Flags);
-
-    if (!SetupDiSetDeviceInstallParams(DeviceInfoSet,
-                                       DeviceInfoData,
-                                       &DeviceInstallParams))
-        goto fail2;
-
-    return TRUE;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static HKEY
-OpenInterfacesKey(
-    IN  PTCHAR  ProviderName
-    )
-{
-    HRESULT     Result;
-    TCHAR       KeyName[MAX_PATH];
-    HKEY        Key;
-    HRESULT     Error;
-
-    Result = StringCbPrintf(KeyName,
-                            MAX_PATH,
-                            "%s\\%s\\Interfaces",
-                            SERVICES_KEY,
-                            ProviderName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail1;
-    }
+    HKEY            StatusKey;
+    HRESULT         Error;
+    DWORD           ValueLength;
+    DWORD           Value;
+    DWORD           Type;
 
     Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         KeyName,
+                         STATUS_KEY,
                          0,
-                         KEY_ALL_ACCESS,
-                         &Key);
+                         KEY_READ,
+                         &StatusKey);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
-        goto fail2;
-    }
-
-    return Key;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
+        goto fail1;
     }
 
-    return NULL;
-}
-
-static BOOLEAN
-SubscribeInterface(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  SubscriberName,
-    IN  PTCHAR  InterfaceName,
-    IN  DWORD   InterfaceVersion
-    )
-{
-    HKEY        Key;
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL)
-        goto fail1;
+    ValueLength = sizeof (Value);
 
-    Error = RegCreateKeyEx(InterfacesKey,
-                           SubscriberName,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &Key,
-                           NULL);
+    Error = RegQueryValueEx(StatusKey,
+                            "NeedReboot",
+                            NULL,
+                            &Type,
+                            (LPBYTE)&Value,
+                            &ValueLength);
     if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Type = REG_DWORD;
+            Value = 0;
+        } else {
+            SetLastError(Error);
+            goto fail2;
+        }
     }
 
-    Error = RegSetValueEx(Key,
-                          InterfaceName,
-                          0,
-                          REG_DWORD,
-                          (const BYTE *)&InterfaceVersion,
-                          sizeof(DWORD));
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
+    if (Type != REG_DWORD) {
+        SetLastError(ERROR_BAD_FORMAT);
         goto fail3;
     }
 
-    Log("%s: %s_%s_INTERFACE_VERSION %u",
-        SubscriberName,
-        ProviderName,
-        InterfaceName,
-        InterfaceVersion);
+    *NeedReboot = (Value != 0) ? TRUE : FALSE;
 
-    RegCloseKey(Key);
-    RegCloseKey(InterfacesKey);
+    if (*NeedReboot)
+        Log("NeedReboot");
+
+    RegCloseKey(StatusKey);
 
     return TRUE;
 
 fail3:
-    RegCloseKey(Key);
+    Log("fail3");
 
 fail2:
-    RegCloseKey(InterfacesKey);
+    Log("fail2");
+
+    RegCloseKey(StatusKey);
 
 fail1:
     Error = GetLastError();
@@ -772,49 +411,42 @@ fail1:
     return FALSE;
 }
 
-#define SUBSCRIBE_INTERFACE(_ProviderName, _SubscriberName, _InterfaceName)                        \
-    do {                                                                                           \
-        (VOID) SubscribeInterface(#_ProviderName,                                                  \
-                                  #_SubscriberName,                                                \
-                                  #_InterfaceName,                                                 \
-                                  _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MAX); \
-    } while (FALSE);
-
 static BOOLEAN
-UnsubscribeInterfaces(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  SubscriberName
+RequestReboot(
+    IN  HDEVINFO            DeviceInfoSet,
+    IN  PSP_DEVINFO_DATA    DeviceInfoData
     )
 {
-    HKEY        InterfacesKey;
-    HRESULT     Error;
+    SP_DEVINSTALL_PARAMS    DeviceInstallParams;
+    HRESULT                 Error;
 
-    Log("%s: %s", SubscriberName, ProviderName);
+    DeviceInstallParams.cbSize = sizeof (DeviceInstallParams);
 
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL) {
+    if (!SetupDiGetDeviceInstallParams(DeviceInfoSet,
+                                       DeviceInfoData,
+                                       &DeviceInstallParams))
         goto fail1;
-    }
 
-    Error = RegDeleteTree(InterfacesKey,
-                          SubscriberName);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
+    DeviceInstallParams.Flags |= DI_NEEDREBOOT;
 
-    RegCloseKey(InterfacesKey);
+    Log("Flags = %08x", DeviceInstallParams.Flags);
+
+    if (!SetupDiSetDeviceInstallParams(DeviceInfoSet,
+                                       DeviceInfoData,
+                                       &DeviceInstallParams))
+        goto fail2;
 
     return TRUE;
 
 fail2:
-    RegCloseKey(InterfacesKey);
+    Log("fail2");
 
 fail1:
     Error = GetLastError();
 
     {
         PTCHAR  Message;
+
         Message = __GetErrorMessage(Error);
         Log("fail1 (%s)", Message);
         LocalFree(Message);
@@ -846,26 +478,21 @@ __DifInstallPostProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
-    UNREFERENCED_PARAMETER(DeviceInfoSet);
-    UNREFERENCED_PARAMETER(DeviceInfoData);
+    BOOLEAN                         Success;
+    BOOLEAN                         NeedReboot;
+
     UNREFERENCED_PARAMETER(Context);
 
     Log("====>");
 
-    SUBSCRIBE_INTERFACE(XENBUS, XENVBD, STORE);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVBD, EVTCHN);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVBD, GNTTAB);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVBD, SUSPEND);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVBD, DEBUG);
-
-    SUBSCRIBE_INTERFACE(XENFILT, XENVBD, EMULATED);
-
     (VOID) OverrideGroupPolicyOptions();
     (VOID) IncreaseDiskTimeOut();
 
-    (VOID) InstallUnplugService("DISKS", "XENVBD");
+    NeedReboot = FALSE;
 
-    (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData);
+    Success = CheckStatus(&NeedReboot);
+    if (Success && NeedReboot)
+        (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData);
 
     Log("<====");
 
@@ -941,11 +568,6 @@ __DifRemovePreProcess(
 
     Log("====>");
 
-    (VOID) RemoveUnplugService("DISKS", "XENVBD");
-
-    UnsubscribeInterfaces("XENFILT", "XENVBD");
-    UnsubscribeInterfaces("XENBUS", "XENVBD");
-
     return NO_ERROR; 
 }
 
diff --git a/src/xenvbd.inf b/src/xenvbd.inf
index dc7ca24..e92d3fb 100644
--- a/src/xenvbd.inf
+++ b/src/xenvbd.inf
@@ -53,9 +53,9 @@ xenvbd_coinst.dll=0,,
 %Company%=Inst,NT$ARCH$
 
 [Inst.NT$ARCH$]
-%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XSC000&DEV_VBD&REV_08000008
-%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XS0001&DEV_VBD&REV_08000008
-%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XS0002&DEV_VBD&REV_08000008
+%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XSC000&DEV_VBD&REV_08000009
+%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XS0001&DEV_VBD&REV_08000009
+%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XS0002&DEV_VBD&REV_08000009
 
 [XenVbd_Inst] 
 CopyFiles=XenVbd_Copyfiles
diff --git a/src/xenvbd/driver.c b/src/xenvbd/driver.c
index f5f73ca..2a41c8c 100644
--- a/src/xenvbd/driver.c
+++ b/src/xenvbd/driver.c
@@ -47,7 +47,7 @@
 #define IS_PDO          ((ULONG)'odp')
 //=============================================================================
 XENVBD_PARAMETERS   DriverParameters;
-HANDLE              DriverServiceKey;
+HANDLE              DriverStatusKey;
 
 #define XENVBD_POOL_TAG     'dbvX'
 
@@ -615,7 +615,7 @@ DriverUnload(
          DAY_STR "/" MONTH_STR "/" YEAR_STR);
     StorPortDriverUnload(_DriverObject);
     BufferTerminate();
-    ZwClose(DriverServiceKey);
+    ZwClose(DriverStatusKey);
     Trace("<=== (Irql=%d)\n", KeGetCurrentIrql());
 }
 
@@ -631,6 +631,7 @@ DriverEntry(
     OBJECT_ATTRIBUTES       Attributes;
     UNICODE_STRING          Unicode;
     HW_INITIALIZATION_DATA  InitData;
+    HANDLE                  ServiceKey;
 
     // RegistryPath == NULL if crashing!
     if (RegistryPath == NULL) {
@@ -655,14 +656,33 @@ DriverEntry(
                                NULL,
                                NULL);
 
-    Status = ZwOpenKey(&DriverServiceKey,
+    Status = ZwOpenKey(&ServiceKey,
                        KEY_ALL_ACCESS,
                        &Attributes);
     if (!NT_SUCCESS(Status))
         goto done;
 
-    RtlInitUnicodeString(&Unicode, L"NeedReboot");
-    (VOID)ZwDeleteValueKey(DriverServiceKey, &Unicode);
+    RtlInitUnicodeString(&Unicode, L"Status");
+
+    InitializeObjectAttributes(&Attributes,
+                               &Unicode,
+                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
+                               ServiceKey,
+                               NULL);
+
+    Status = ZwCreateKey(&DriverStatusKey,
+                         KEY_ALL_ACCESS,
+                         &Attributes,
+                         0,
+                         NULL,
+                         REG_OPTION_VOLATILE,
+                         NULL
+                         );
+
+    ZwClose(ServiceKey);
+
+    if (!NT_SUCCESS(Status))
+        goto done;
 
     KeInitializeSpinLock(&__XenvbdLock);
     __XenvbdFdo = NULL;
diff --git a/src/xenvbd/driver.h b/src/xenvbd/driver.h
index bfb6277..0bbf6cb 100644
--- a/src/xenvbd/driver.h
+++ b/src/xenvbd/driver.h
@@ -56,7 +56,7 @@ typedef struct _XENVBD_PARAMETERS {
 
 extern XENVBD_PARAMETERS    DriverParameters;
 
-extern HANDLE               DriverServiceKey;
+extern HANDLE               DriverStatusKey;
 
 // Fdo Device Extension management
 extern VOID
diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index b146f7c..3a569f3 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -76,6 +76,7 @@ struct _XENVBD_FDO {
     XENBUS_GNTTAB_INTERFACE     Gnttab;
     XENBUS_DEBUG_INTERFACE      Debug;
     XENBUS_SUSPEND_INTERFACE    Suspend;
+    XENBUS_UNPLUG_INTERFACE     Unplug;
     XENFILT_EMULATED_INTERFACE  Emulated;
     
     // Debug Callback
@@ -583,7 +584,7 @@ __FdoNotifyInstaller(
 
     RtlInitUnicodeString(&Unicode, L"NeedReboot");
 
-    status = ZwSetValueKey(DriverServiceKey,
+    status = ZwSetValueKey(DriverStatusKey,
                            &Unicode,
                            Partial->TitleIndex,
                            Partial->Type,
@@ -759,8 +760,20 @@ FdoScan(
             StorPortNotification(BusChangeDetected, Fdo, 0);
         }
 
-        if (NeedReboot)
+        if (NeedReboot) {
+            PXENBUS_UNPLUG_INTERFACE    Unplug;
+
+            Unplug = FdoAcquireUnplug(Fdo);
+            ASSERT(Unplug != NULL);
+
+            XENBUS_UNPLUG(Request,
+                          Unplug,
+                          XENBUS_UNPLUG_DEVICE_TYPE_DISKS,
+                          TRUE);
+            XENBUS_UNPLUG(Release, Unplug);
+
             __FdoNotifyInstaller(Fdo);
+        }
     }
 
     return STATUS_SUCCESS;
@@ -891,6 +904,16 @@ __FdoQueryInterfaces(
     if (!NT_SUCCESS(Status))
         goto fail5;
 
+    // Get UNPLUG Interface
+    Status = QUERY_INTERFACE(Fdo,
+                             XENBUS,
+                             UNPLUG,
+                             (PINTERFACE)&Fdo->Unplug,
+                             sizeof (Fdo->Unplug),
+                             FALSE);
+    if (!NT_SUCCESS(Status))
+        goto fail6;
+
     // Get EMULATED Interface (optional)
     Status = QUERY_INTERFACE(Fdo,
                              XENFILT,
@@ -899,10 +922,13 @@ __FdoQueryInterfaces(
                              sizeof (Fdo->Emulated),
                              TRUE);
     if (!NT_SUCCESS(Status))
-        goto fail6;
+        goto fail7;
 
     return STATUS_SUCCESS;
 
+fail7:
+    RtlZeroMemory(&Fdo->Unplug,
+                  sizeof (XENBUS_UNPLUG_INTERFACE));
 fail6:
     RtlZeroMemory(&Fdo->Debug,
                   sizeof (XENBUS_DEBUG_INTERFACE));
@@ -928,6 +954,8 @@ __FdoZeroInterfaces(
 {
     RtlZeroMemory(&Fdo->Emulated,
                   sizeof (XENFILT_EMULATED_INTERFACE));
+    RtlZeroMemory(&Fdo->Unplug,
+                  sizeof (XENBUS_UNPLUG_INTERFACE));
     RtlZeroMemory(&Fdo->Debug,
                   sizeof (XENBUS_DEBUG_INTERFACE));
     RtlZeroMemory(&Fdo->Suspend,
@@ -972,8 +1000,14 @@ __FdoAcquire(
     if (!NT_SUCCESS(status))
         goto fail6;
 
+    status = XENBUS_UNPLUG(Acquire, &Fdo->Unplug);
+    if (!NT_SUCCESS(status))
+        goto fail7;
+
     return STATUS_SUCCESS;
 
+fail7:
+    XENBUS_UNPLUG(Release, &Fdo->Unplug);
 fail6:
     XENBUS_EVTCHN(Release, &Fdo->Evtchn);
 fail5:
@@ -993,6 +1027,7 @@ __FdoRelease(
     __in PXENVBD_FDO             Fdo
     )
 {
+    XENBUS_UNPLUG(Release, &Fdo->Unplug);
     XENBUS_STORE(Release, &Fdo->Store);
     XENBUS_EVTCHN(Release, &Fdo->Evtchn);
     XENBUS_GNTTAB(Release, &Fdo->Gnttab);
@@ -1927,3 +1962,17 @@ FdoAcquireSuspend(
 
     return &Fdo->Suspend;
 }
+
+PXENBUS_UNPLUG_INTERFACE
+FdoAcquireUnplug(
+    __in PXENVBD_FDO    Fdo
+    )
+{
+    NTSTATUS            status;
+
+    status = XENBUS_UNPLUG(Acquire, &Fdo->Unplug);
+    if (!NT_SUCCESS(status))
+        return NULL;
+
+    return &Fdo->Unplug;
+}
diff --git a/src/xenvbd/fdo.h b/src/xenvbd/fdo.h
index fcb5803..981ffbb 100644
--- a/src/xenvbd/fdo.h
+++ b/src/xenvbd/fdo.h
@@ -43,6 +43,7 @@ typedef struct _XENVBD_FDO XENVBD_FDO, *PXENVBD_FDO;
 #include <gnttab_interface.h>
 #include <debug_interface.h>
 #include <suspend_interface.h>
+#include <unplug_interface.h>
 
 // Reference Counting
 extern LONG
@@ -192,4 +193,9 @@ FdoAcquireSuspend(
     __in PXENVBD_FDO                 Fdo
     );
 
+extern PXENBUS_UNPLUG_INTERFACE
+FdoAcquireUnplug(
+    __in PXENVBD_FDO                 Fdo
+    );
+
 #endif // _XENVBD_FDO_H
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index a77aeed..587b2f2 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -652,11 +652,11 @@ PdoDestroy(
 __checkReturn
 NTSTATUS
 PdoD3ToD0(
-    __in PXENVBD_PDO             Pdo
+    __in PXENVBD_PDO            Pdo
     )
 {
-    NTSTATUS    Status;
-    const ULONG TargetId = PdoGetTargetId(Pdo);
+    NTSTATUS                    Status;
+    const ULONG                 TargetId = PdoGetTargetId(Pdo);
 
     if (!PdoSetDevicePowerState(Pdo, PowerDeviceD0))
         return STATUS_SUCCESS;
@@ -694,10 +694,10 @@ fail1:
 
 VOID
 PdoD0ToD3(
-    __in PXENVBD_PDO             Pdo
+    __in PXENVBD_PDO            Pdo
     )
 {
-    const ULONG TargetId = PdoGetTargetId(Pdo);
+    const ULONG                 TargetId = PdoGetTargetId(Pdo);
 
     if (!PdoSetDevicePowerState(Pdo, PowerDeviceD3))
         return;
@@ -2588,11 +2588,23 @@ PdoDispatchPnp(
     __PdoCheckEjectPending(Pdo);
 
     switch (Stack->MinorFunction) {
-    case IRP_MN_START_DEVICE:
+    case IRP_MN_START_DEVICE: {
+        PXENBUS_UNPLUG_INTERFACE    Unplug;
+
+        Unplug = FdoAcquireUnplug(PdoGetFdo(Pdo));
+        ASSERT(Unplug != NULL);
+
+        XENBUS_UNPLUG(Request,
+                      Unplug,
+                      XENBUS_UNPLUG_DEVICE_TYPE_DISKS,
+                      TRUE);
+        XENBUS_UNPLUG(Release, Unplug);
+
         (VOID) PdoD3ToD0(Pdo);
+
         PdoSetDevicePnpState(Pdo, Started);
         break;
-
+    }
     case IRP_MN_QUERY_STOP_DEVICE:
         PdoSetDevicePnpState(Pdo, StopPending);
         break;
@@ -2601,10 +2613,22 @@ PdoDispatchPnp(
         __PdoRestoreDevicePnpState(Pdo, StopPending);
         break;
 
-    case IRP_MN_STOP_DEVICE:
+    case IRP_MN_STOP_DEVICE: {
+        PXENBUS_UNPLUG_INTERFACE    Unplug;
+
+        Unplug = FdoAcquireUnplug(PdoGetFdo(Pdo));
+        ASSERT(Unplug != NULL);
+
         PdoSetDevicePnpState(Pdo, Stopped);
-        break;
 
+        XENBUS_UNPLUG(Request,
+                      Unplug,
+                      XENBUS_UNPLUG_DEVICE_TYPE_DISKS,
+                      FALSE);
+        XENBUS_UNPLUG(Release, Unplug);
+
+        break;
+    }
     case IRP_MN_QUERY_REMOVE_DEVICE:
         PdoSetDevicePnpState(Pdo, RemovePending);
         break;
@@ -2618,10 +2642,22 @@ PdoDispatchPnp(
         PdoSetDevicePnpState(Pdo, SurpriseRemovePending);
         break;
 
-    case IRP_MN_REMOVE_DEVICE:
+    case IRP_MN_REMOVE_DEVICE: {
+        PXENBUS_UNPLUG_INTERFACE    Unplug;
+
+        Unplug = FdoAcquireUnplug(PdoGetFdo(Pdo));
+        ASSERT(Unplug != NULL);
+
         __PdoRemoveDevice(Pdo);
-        break;
 
+        XENBUS_UNPLUG(Request,
+                      Unplug,
+                      XENBUS_UNPLUG_DEVICE_TYPE_DISKS,
+                      FALSE);
+        XENBUS_UNPLUG(Release, Unplug);
+
+        break;
+    }
     case IRP_MN_EJECT:
         __PdoEject(Pdo);
         break;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:29:07 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:29:07 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7Ni-0002H7-6Z; Mon, 20 Jul 2015 09:29:06 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7Ng-0002H2-TG
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:29:05 +0000
Received: from [193.109.254.147] by server-5.bemta-14.messagelabs.com id
	49/A5-29123-06FBCA55; Mon, 20 Jul 2015 09:29:04 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1437384541!33516754!1
X-Originating-IP: [209.85.160.178]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20017 invoked from network); 20 Jul 2015 09:29:02 -0000
Received: from mail-yk0-f178.google.com (HELO mail-yk0-f178.google.com)
	(209.85.160.178)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:29:02 -0000
Received: by ykdu72 with SMTP id u72so134320478ykd.2
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:29:01 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=TuEJD5klun/23sJZemP6nPaBTxezemWIngc27qriKtQ=;
	b=0KPEwk8ncnMBJMAvww5BCByjMMITLxMXuGFY5po1VPS2aew1ZSS+bTtKXUQVMQ7DCa
	a7+CUDsgFC89qXSoOMDItJtHSHQ7SJ1Wuctf7pZ6DkTYUl95/AC6TqQWf8Ou7v+JL3yN
	nqDfXZPPuuxXnN3vr5cLgs+R4LMhjtS8pgRZC8p417SZ/213hz168wXhIxtZVt/05FoD
	tiUGiXRMLRPZwvE0j5oknoLGxZ/JegslKAR4NAiaei9I9BT7dTol65UllDBBAj2MeHr3
	McYbY/UXASKRt1KhohKfUN7FXnJxYM5g54wTiBXQNeUPQ/OKvuOIHGQIjakf7Yuh+6lj
	pPwg==
X-Received: by 10.170.48.134 with SMTP id 128mr27168559ykq.36.1437384541444;
	Mon, 20 Jul 2015 02:29:01 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	a128sm19550541ywf.48.2015.07.20.02.28.59
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:29:00 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:28:54 +0100
Message-Id: <1437384534-3876-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove interface subscription and unplug
	code from the co-installed...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...and use the new XENBUS_UNPLUG interface to request unplug.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/unplug_interface.h | 115 +++++++++++
 src/coinst/coinst.c        | 504 ++++++---------------------------------------
 src/xenvbd.inf             |   6 +-
 src/xenvbd/driver.c        |  30 ++-
 src/xenvbd/driver.h        |   2 +-
 src/xenvbd/fdo.c           |  55 ++++-
 src/xenvbd/fdo.h           |   6 +
 src/xenvbd/pdo.c           |  58 +++++-
 8 files changed, 312 insertions(+), 464 deletions(-)
 create mode 100644 include/unplug_interface.h

diff --git a/include/unplug_interface.h b/include/unplug_interface.h
new file mode 100644
index 0000000..99d4e7d
--- /dev/null
+++ b/include/unplug_interface.h
@@ -0,0 +1,115 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*! \file unplug_interface.h
+    \brief XENBUS UNPLUG Interface
+
+    This interface provides a method to request emulated device unplug
+*/
+
+#ifndef _XENBUS_UNPLUG_INTERFACE_H
+#define _XENBUS_UNPLUG_INTERFACE_H
+
+#ifndef _WINDLL
+
+/*! \typedef XENBUS_UNPLUG_ACQUIRE
+    \brief Acquire a reference to the UNPLUG interface
+
+    \param Interface The interface header
+*/
+typedef NTSTATUS
+(*XENBUS_UNPLUG_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENBUS_UNPLUG_RELEASE
+    \brief Release a reference to the UNPLUG interface
+
+    \param Interface The interface header
+*/
+typedef VOID
+(*XENBUS_UNPLUG_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \enum _XENBUS_UNPLUG_DEVICE_TYPE
+    \brief Type of device to be unplugged
+*/
+typedef enum _XENBUS_UNPLUG_DEVICE_TYPE {
+    XENBUS_UNPLUG_DEVICE_TYPE_INVALID = 0,
+    XENBUS_UNPLUG_DEVICE_TYPE_NICS,     /*!< NICs */
+    XENBUS_UNPLUG_DEVICE_TYPE_DISKS,    /*!< Disks */
+} XENBUS_UNPLUG_DEVICE_TYPE, *PXENBUS_UNPLUG_DEVICE_TYPE;
+
+/*! \typedef XENBUS_UNPLUG_REQUEST
+    \brief Request unplug of a type of emulated device
+
+    \param Interface The interface header
+    \param Type The type of device
+    \param Make Set to TRUE if the request is being made, FALSE if it is
+           being revoked.
+*/
+typedef VOID
+(*XENBUS_UNPLUG_REQUEST)(
+    IN  PINTERFACE                  Interface,
+    IN  XENBUS_UNPLUG_DEVICE_TYPE   Type,
+    IN  BOOLEAN                     Make
+    );
+
+// {73db6517-3d06-4937-989f-199b7501e229}
+DEFINE_GUID(GUID_XENBUS_UNPLUG_INTERFACE,
+0x73db6517, 0x3d06, 0x4937, 0x98, 0x9f, 0x19, 0x9b, 0x75, 0x01, 0xe2, 0x29);
+
+/*! \struct _XENBUS_UNPLUG_INTERFACE_V1
+    \brief UNPLUG interface version 1
+    \ingroup interfaces
+*/
+struct _XENBUS_UNPLUG_INTERFACE_V1 {
+    INTERFACE               Interface;
+    XENBUS_UNPLUG_ACQUIRE   UnplugAcquire;
+    XENBUS_UNPLUG_RELEASE   UnplugRelease;
+    XENBUS_UNPLUG_REQUEST   UnplugRequest;
+};
+
+typedef struct _XENBUS_UNPLUG_INTERFACE_V1 XENBUS_UNPLUG_INTERFACE, *PXENBUS_UNPLUG_INTERFACE;
+
+/*! \def XENBUS_UNPLUG
+    \brief Macro at assist in method invocation
+*/
+#define XENBUS_UNPLUG(_Method, _Interface, ...)    \
+    (_Interface)->Unplug ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENBUS_UNPLUG_INTERFACE_VERSION_MIN  1
+#define XENBUS_UNPLUG_INTERFACE_VERSION_MAX  1
+
+#endif  // _XENBUS_UNPLUG_INTERFACE_H
diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 7233b9b..9069435 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -35,13 +35,6 @@
 #include <stdlib.h>
 #include <strsafe.h>
 
-#include <debug_interface.h>
-#include <suspend_interface.h>
-#include <evtchn_interface.h>
-#include <store_interface.h>
-#include <gnttab_interface.h>
-#include <emulated_interface.h>
-
 #include <version.h>
 
 __user_code;
@@ -53,8 +46,8 @@ __user_code;
 #define SERVICE_KEY(_Driver)    \
         SERVICES_KEY ## "\\" ## #_Driver
 
-#define UNPLUG_KEY \
-        SERVICE_KEY(XENFILT) ## "\\Unplug"
+#define STATUS_KEY  \
+        SERVICE_KEY(XENVBD) ## "\\Status"
 
 #define CONTROL_KEY "SYSTEM\\CurrentControlSet\\Control"
 
@@ -190,271 +183,6 @@ __FunctionName(
 }
 
 static BOOLEAN
-InstallUnplugService(
-    IN  PTCHAR      ClassName,
-    IN  PTCHAR      ServiceName
-    )
-{
-    HKEY            UnplugKey;
-    HRESULT         Error;
-    DWORD           Type;
-    DWORD           OldLength;
-    DWORD           NewLength;
-    PTCHAR          ServiceNames;
-    ULONG           Offset;
-
-    Error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
-                           UNPLUG_KEY,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &UnplugKey,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Error = RegQueryValueEx(UnplugKey,
-                            ClassName,
-                            NULL,
-                            &Type,
-                            NULL,
-                            &OldLength);
-    if (Error != ERROR_SUCCESS) {
-        if (Error == ERROR_FILE_NOT_FOUND) {
-            Type = REG_MULTI_SZ;
-            OldLength = sizeof (TCHAR);
-        } else {
-            SetLastError(Error);
-            goto fail2;
-        }
-    }
-
-    if (Type != REG_MULTI_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail3;
-    }
-
-    NewLength = OldLength + (DWORD)((strlen(ServiceName) + 1) * sizeof (TCHAR));
-
-    ServiceNames = calloc(1, NewLength);
-    if (ServiceNames == NULL)
-        goto fail4;
-
-    Offset = 0;
-    if (OldLength != sizeof (TCHAR)) {
-        Error = RegQueryValueEx(UnplugKey,
-                                ClassName,
-                                NULL,
-                                &Type,
-                                (LPBYTE)ServiceNames,
-                                &OldLength);
-        if (Error != ERROR_SUCCESS) {
-            SetLastError(ERROR_BAD_FORMAT);
-            goto fail5;
-        }
-
-        while (ServiceNames[Offset] != '\0') {
-            ULONG   ServiceNameLength;
-
-            ServiceNameLength = (ULONG)strlen(&ServiceNames[Offset]) / sizeof (TCHAR);
-
-            if (_stricmp(&ServiceNames[Offset], ServiceName) == 0) {
-                Log("%s already present", ServiceName);
-                goto done;
-            }
-
-            Offset += ServiceNameLength + 1;
-        }
-    }
-
-    memmove(&ServiceNames[Offset], ServiceName, strlen(ServiceName));
-    Log("added %s", ServiceName);
-
-    Error = RegSetValueEx(UnplugKey,
-                          ClassName,
-                          0,
-                          REG_MULTI_SZ,
-                          (LPBYTE)ServiceNames,
-                          NewLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail6;
-    }
-
-done:
-    free(ServiceNames);
-
-    RegCloseKey(UnplugKey);
-
-    return TRUE;
-
-fail6:
-    Log("fail5");
-
-fail5:
-    Log("fail5");
-
-    free(ServiceNames);
-
-fail4:
-    Log("fail5");
-
-fail3:
-    Log("fail5");
-
-fail2:
-    Log("fail5");
-
-    RegCloseKey(UnplugKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-RemoveUnplugService(
-    IN  PTCHAR      ClassName,
-    IN  PTCHAR      ServiceName
-    )
-{
-    HKEY            UnplugKey;
-    HRESULT         Error;
-    DWORD           Type;
-    DWORD           OldLength;
-    DWORD           NewLength;
-    PTCHAR          ServiceNames;
-    ULONG           Offset;
-    ULONG           ServiceNameLength;
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         UNPLUG_KEY,
-                         0,
-                         KEY_ALL_ACCESS,
-                         &UnplugKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Error = RegQueryValueEx(UnplugKey,
-                            ClassName,
-                            NULL,
-                            &Type,
-                            NULL,
-                            &OldLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    if (Type != REG_MULTI_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail3;
-    }
-
-    ServiceNames = calloc(1, OldLength);
-    if (ServiceNames == NULL)
-        goto fail4;
-
-    Error = RegQueryValueEx(UnplugKey,
-                            ClassName,
-                            NULL,
-                            &Type,
-                            (LPBYTE)ServiceNames,
-                            &OldLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail5;
-    }
-
-    Offset = 0;
-    ServiceNameLength = 0;
-    while (ServiceNames[Offset] != '\0') {
-        ServiceNameLength = (ULONG)strlen(&ServiceNames[Offset]) / sizeof (TCHAR);
-
-        if (_stricmp(&ServiceNames[Offset], ServiceName) == 0)
-            goto remove;
-
-        Offset += ServiceNameLength + 1;
-    }
-
-    goto done;
-
-remove:
-    NewLength = OldLength - ((ServiceNameLength + 1) * sizeof (TCHAR));
-
-    memmove(&ServiceNames[Offset],
-            &ServiceNames[Offset + ServiceNameLength + 1],
-            (NewLength - Offset) * sizeof (TCHAR));
-
-    Log("removed %s", ServiceName);
-
-    Error = RegSetValueEx(UnplugKey,
-                          ClassName,
-                          0,
-                          REG_MULTI_SZ,
-                          (LPBYTE)ServiceNames,
-                          NewLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail6;
-    }
-
-done:
-    free(ServiceNames);
-
-    RegCloseKey(UnplugKey);
-
-    return TRUE;
-
-fail6:
-    Log("fail6");
-
-fail5:
-    Log("fail5");
-
-    free(ServiceNames);
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(UnplugKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
 OverrideGroupPolicyOptions(
     )
 {
@@ -610,154 +338,65 @@ fail1:
 }
 
 static BOOLEAN
-RequestReboot(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData
+CheckStatus(
+    OUT PBOOLEAN    NeedReboot
     )
 {
-    SP_DEVINSTALL_PARAMS    DeviceInstallParams;
-    HRESULT                 Error;
-
-    DeviceInstallParams.cbSize = sizeof (DeviceInstallParams);
-
-    if (!SetupDiGetDeviceInstallParams(DeviceInfoSet,
-                                       DeviceInfoData,
-                                       &DeviceInstallParams))
-        goto fail1;
-
-    DeviceInstallParams.Flags |= DI_NEEDREBOOT;
-
-    Log("Flags = %08x", DeviceInstallParams.Flags);
-
-    if (!SetupDiSetDeviceInstallParams(DeviceInfoSet,
-                                       DeviceInfoData,
-                                       &DeviceInstallParams))
-        goto fail2;
-
-    return TRUE;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static HKEY
-OpenInterfacesKey(
-    IN  PTCHAR  ProviderName
-    )
-{
-    HRESULT     Result;
-    TCHAR       KeyName[MAX_PATH];
-    HKEY        Key;
-    HRESULT     Error;
-
-    Result = StringCbPrintf(KeyName,
-                            MAX_PATH,
-                            "%s\\%s\\Interfaces",
-                            SERVICES_KEY,
-                            ProviderName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail1;
-    }
+    HKEY            StatusKey;
+    HRESULT         Error;
+    DWORD           ValueLength;
+    DWORD           Value;
+    DWORD           Type;
 
     Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         KeyName,
+                         STATUS_KEY,
                          0,
-                         KEY_ALL_ACCESS,
-                         &Key);
+                         KEY_READ,
+                         &StatusKey);
     if (Error != ERROR_SUCCESS) {
         SetLastError(Error);
-        goto fail2;
-    }
-
-    return Key;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
+        goto fail1;
     }
 
-    return NULL;
-}
-
-static BOOLEAN
-SubscribeInterface(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  SubscriberName,
-    IN  PTCHAR  InterfaceName,
-    IN  DWORD   InterfaceVersion
-    )
-{
-    HKEY        Key;
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL)
-        goto fail1;
+    ValueLength = sizeof (Value);
 
-    Error = RegCreateKeyEx(InterfacesKey,
-                           SubscriberName,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &Key,
-                           NULL);
+    Error = RegQueryValueEx(StatusKey,
+                            "NeedReboot",
+                            NULL,
+                            &Type,
+                            (LPBYTE)&Value,
+                            &ValueLength);
     if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Type = REG_DWORD;
+            Value = 0;
+        } else {
+            SetLastError(Error);
+            goto fail2;
+        }
     }
 
-    Error = RegSetValueEx(Key,
-                          InterfaceName,
-                          0,
-                          REG_DWORD,
-                          (const BYTE *)&InterfaceVersion,
-                          sizeof(DWORD));
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
+    if (Type != REG_DWORD) {
+        SetLastError(ERROR_BAD_FORMAT);
         goto fail3;
     }
 
-    Log("%s: %s_%s_INTERFACE_VERSION %u",
-        SubscriberName,
-        ProviderName,
-        InterfaceName,
-        InterfaceVersion);
+    *NeedReboot = (Value != 0) ? TRUE : FALSE;
 
-    RegCloseKey(Key);
-    RegCloseKey(InterfacesKey);
+    if (*NeedReboot)
+        Log("NeedReboot");
+
+    RegCloseKey(StatusKey);
 
     return TRUE;
 
 fail3:
-    RegCloseKey(Key);
+    Log("fail3");
 
 fail2:
-    RegCloseKey(InterfacesKey);
+    Log("fail2");
+
+    RegCloseKey(StatusKey);
 
 fail1:
     Error = GetLastError();
@@ -772,49 +411,42 @@ fail1:
     return FALSE;
 }
 
-#define SUBSCRIBE_INTERFACE(_ProviderName, _SubscriberName, _InterfaceName)                        \
-    do {                                                                                           \
-        (VOID) SubscribeInterface(#_ProviderName,                                                  \
-                                  #_SubscriberName,                                                \
-                                  #_InterfaceName,                                                 \
-                                  _ProviderName ## _ ## _InterfaceName ## _INTERFACE_VERSION_MAX); \
-    } while (FALSE);
-
 static BOOLEAN
-UnsubscribeInterfaces(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  SubscriberName
+RequestReboot(
+    IN  HDEVINFO            DeviceInfoSet,
+    IN  PSP_DEVINFO_DATA    DeviceInfoData
     )
 {
-    HKEY        InterfacesKey;
-    HRESULT     Error;
+    SP_DEVINSTALL_PARAMS    DeviceInstallParams;
+    HRESULT                 Error;
 
-    Log("%s: %s", SubscriberName, ProviderName);
+    DeviceInstallParams.cbSize = sizeof (DeviceInstallParams);
 
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL) {
+    if (!SetupDiGetDeviceInstallParams(DeviceInfoSet,
+                                       DeviceInfoData,
+                                       &DeviceInstallParams))
         goto fail1;
-    }
 
-    Error = RegDeleteTree(InterfacesKey,
-                          SubscriberName);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
+    DeviceInstallParams.Flags |= DI_NEEDREBOOT;
 
-    RegCloseKey(InterfacesKey);
+    Log("Flags = %08x", DeviceInstallParams.Flags);
+
+    if (!SetupDiSetDeviceInstallParams(DeviceInfoSet,
+                                       DeviceInfoData,
+                                       &DeviceInstallParams))
+        goto fail2;
 
     return TRUE;
 
 fail2:
-    RegCloseKey(InterfacesKey);
+    Log("fail2");
 
 fail1:
     Error = GetLastError();
 
     {
         PTCHAR  Message;
+
         Message = __GetErrorMessage(Error);
         Log("fail1 (%s)", Message);
         LocalFree(Message);
@@ -846,26 +478,21 @@ __DifInstallPostProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
-    UNREFERENCED_PARAMETER(DeviceInfoSet);
-    UNREFERENCED_PARAMETER(DeviceInfoData);
+    BOOLEAN                         Success;
+    BOOLEAN                         NeedReboot;
+
     UNREFERENCED_PARAMETER(Context);
 
     Log("====>");
 
-    SUBSCRIBE_INTERFACE(XENBUS, XENVBD, STORE);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVBD, EVTCHN);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVBD, GNTTAB);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVBD, SUSPEND);
-    SUBSCRIBE_INTERFACE(XENBUS, XENVBD, DEBUG);
-
-    SUBSCRIBE_INTERFACE(XENFILT, XENVBD, EMULATED);
-
     (VOID) OverrideGroupPolicyOptions();
     (VOID) IncreaseDiskTimeOut();
 
-    (VOID) InstallUnplugService("DISKS", "XENVBD");
+    NeedReboot = FALSE;
 
-    (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData);
+    Success = CheckStatus(&NeedReboot);
+    if (Success && NeedReboot)
+        (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData);
 
     Log("<====");
 
@@ -941,11 +568,6 @@ __DifRemovePreProcess(
 
     Log("====>");
 
-    (VOID) RemoveUnplugService("DISKS", "XENVBD");
-
-    UnsubscribeInterfaces("XENFILT", "XENVBD");
-    UnsubscribeInterfaces("XENBUS", "XENVBD");
-
     return NO_ERROR; 
 }
 
diff --git a/src/xenvbd.inf b/src/xenvbd.inf
index dc7ca24..e92d3fb 100644
--- a/src/xenvbd.inf
+++ b/src/xenvbd.inf
@@ -53,9 +53,9 @@ xenvbd_coinst.dll=0,,
 %Company%=Inst,NT$ARCH$
 
 [Inst.NT$ARCH$]
-%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XSC000&DEV_VBD&REV_08000008
-%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XS0001&DEV_VBD&REV_08000008
-%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XS0002&DEV_VBD&REV_08000008
+%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XSC000&DEV_VBD&REV_08000009
+%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XS0001&DEV_VBD&REV_08000009
+%XenVbdDesc%=XenVbd_Inst,XENBUS\VEN_XS0002&DEV_VBD&REV_08000009
 
 [XenVbd_Inst] 
 CopyFiles=XenVbd_Copyfiles
diff --git a/src/xenvbd/driver.c b/src/xenvbd/driver.c
index f5f73ca..2a41c8c 100644
--- a/src/xenvbd/driver.c
+++ b/src/xenvbd/driver.c
@@ -47,7 +47,7 @@
 #define IS_PDO          ((ULONG)'odp')
 //=============================================================================
 XENVBD_PARAMETERS   DriverParameters;
-HANDLE              DriverServiceKey;
+HANDLE              DriverStatusKey;
 
 #define XENVBD_POOL_TAG     'dbvX'
 
@@ -615,7 +615,7 @@ DriverUnload(
          DAY_STR "/" MONTH_STR "/" YEAR_STR);
     StorPortDriverUnload(_DriverObject);
     BufferTerminate();
-    ZwClose(DriverServiceKey);
+    ZwClose(DriverStatusKey);
     Trace("<=== (Irql=%d)\n", KeGetCurrentIrql());
 }
 
@@ -631,6 +631,7 @@ DriverEntry(
     OBJECT_ATTRIBUTES       Attributes;
     UNICODE_STRING          Unicode;
     HW_INITIALIZATION_DATA  InitData;
+    HANDLE                  ServiceKey;
 
     // RegistryPath == NULL if crashing!
     if (RegistryPath == NULL) {
@@ -655,14 +656,33 @@ DriverEntry(
                                NULL,
                                NULL);
 
-    Status = ZwOpenKey(&DriverServiceKey,
+    Status = ZwOpenKey(&ServiceKey,
                        KEY_ALL_ACCESS,
                        &Attributes);
     if (!NT_SUCCESS(Status))
         goto done;
 
-    RtlInitUnicodeString(&Unicode, L"NeedReboot");
-    (VOID)ZwDeleteValueKey(DriverServiceKey, &Unicode);
+    RtlInitUnicodeString(&Unicode, L"Status");
+
+    InitializeObjectAttributes(&Attributes,
+                               &Unicode,
+                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
+                               ServiceKey,
+                               NULL);
+
+    Status = ZwCreateKey(&DriverStatusKey,
+                         KEY_ALL_ACCESS,
+                         &Attributes,
+                         0,
+                         NULL,
+                         REG_OPTION_VOLATILE,
+                         NULL
+                         );
+
+    ZwClose(ServiceKey);
+
+    if (!NT_SUCCESS(Status))
+        goto done;
 
     KeInitializeSpinLock(&__XenvbdLock);
     __XenvbdFdo = NULL;
diff --git a/src/xenvbd/driver.h b/src/xenvbd/driver.h
index bfb6277..0bbf6cb 100644
--- a/src/xenvbd/driver.h
+++ b/src/xenvbd/driver.h
@@ -56,7 +56,7 @@ typedef struct _XENVBD_PARAMETERS {
 
 extern XENVBD_PARAMETERS    DriverParameters;
 
-extern HANDLE               DriverServiceKey;
+extern HANDLE               DriverStatusKey;
 
 // Fdo Device Extension management
 extern VOID
diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index b146f7c..3a569f3 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -76,6 +76,7 @@ struct _XENVBD_FDO {
     XENBUS_GNTTAB_INTERFACE     Gnttab;
     XENBUS_DEBUG_INTERFACE      Debug;
     XENBUS_SUSPEND_INTERFACE    Suspend;
+    XENBUS_UNPLUG_INTERFACE     Unplug;
     XENFILT_EMULATED_INTERFACE  Emulated;
     
     // Debug Callback
@@ -583,7 +584,7 @@ __FdoNotifyInstaller(
 
     RtlInitUnicodeString(&Unicode, L"NeedReboot");
 
-    status = ZwSetValueKey(DriverServiceKey,
+    status = ZwSetValueKey(DriverStatusKey,
                            &Unicode,
                            Partial->TitleIndex,
                            Partial->Type,
@@ -759,8 +760,20 @@ FdoScan(
             StorPortNotification(BusChangeDetected, Fdo, 0);
         }
 
-        if (NeedReboot)
+        if (NeedReboot) {
+            PXENBUS_UNPLUG_INTERFACE    Unplug;
+
+            Unplug = FdoAcquireUnplug(Fdo);
+            ASSERT(Unplug != NULL);
+
+            XENBUS_UNPLUG(Request,
+                          Unplug,
+                          XENBUS_UNPLUG_DEVICE_TYPE_DISKS,
+                          TRUE);
+            XENBUS_UNPLUG(Release, Unplug);
+
             __FdoNotifyInstaller(Fdo);
+        }
     }
 
     return STATUS_SUCCESS;
@@ -891,6 +904,16 @@ __FdoQueryInterfaces(
     if (!NT_SUCCESS(Status))
         goto fail5;
 
+    // Get UNPLUG Interface
+    Status = QUERY_INTERFACE(Fdo,
+                             XENBUS,
+                             UNPLUG,
+                             (PINTERFACE)&Fdo->Unplug,
+                             sizeof (Fdo->Unplug),
+                             FALSE);
+    if (!NT_SUCCESS(Status))
+        goto fail6;
+
     // Get EMULATED Interface (optional)
     Status = QUERY_INTERFACE(Fdo,
                              XENFILT,
@@ -899,10 +922,13 @@ __FdoQueryInterfaces(
                              sizeof (Fdo->Emulated),
                              TRUE);
     if (!NT_SUCCESS(Status))
-        goto fail6;
+        goto fail7;
 
     return STATUS_SUCCESS;
 
+fail7:
+    RtlZeroMemory(&Fdo->Unplug,
+                  sizeof (XENBUS_UNPLUG_INTERFACE));
 fail6:
     RtlZeroMemory(&Fdo->Debug,
                   sizeof (XENBUS_DEBUG_INTERFACE));
@@ -928,6 +954,8 @@ __FdoZeroInterfaces(
 {
     RtlZeroMemory(&Fdo->Emulated,
                   sizeof (XENFILT_EMULATED_INTERFACE));
+    RtlZeroMemory(&Fdo->Unplug,
+                  sizeof (XENBUS_UNPLUG_INTERFACE));
     RtlZeroMemory(&Fdo->Debug,
                   sizeof (XENBUS_DEBUG_INTERFACE));
     RtlZeroMemory(&Fdo->Suspend,
@@ -972,8 +1000,14 @@ __FdoAcquire(
     if (!NT_SUCCESS(status))
         goto fail6;
 
+    status = XENBUS_UNPLUG(Acquire, &Fdo->Unplug);
+    if (!NT_SUCCESS(status))
+        goto fail7;
+
     return STATUS_SUCCESS;
 
+fail7:
+    XENBUS_UNPLUG(Release, &Fdo->Unplug);
 fail6:
     XENBUS_EVTCHN(Release, &Fdo->Evtchn);
 fail5:
@@ -993,6 +1027,7 @@ __FdoRelease(
     __in PXENVBD_FDO             Fdo
     )
 {
+    XENBUS_UNPLUG(Release, &Fdo->Unplug);
     XENBUS_STORE(Release, &Fdo->Store);
     XENBUS_EVTCHN(Release, &Fdo->Evtchn);
     XENBUS_GNTTAB(Release, &Fdo->Gnttab);
@@ -1927,3 +1962,17 @@ FdoAcquireSuspend(
 
     return &Fdo->Suspend;
 }
+
+PXENBUS_UNPLUG_INTERFACE
+FdoAcquireUnplug(
+    __in PXENVBD_FDO    Fdo
+    )
+{
+    NTSTATUS            status;
+
+    status = XENBUS_UNPLUG(Acquire, &Fdo->Unplug);
+    if (!NT_SUCCESS(status))
+        return NULL;
+
+    return &Fdo->Unplug;
+}
diff --git a/src/xenvbd/fdo.h b/src/xenvbd/fdo.h
index fcb5803..981ffbb 100644
--- a/src/xenvbd/fdo.h
+++ b/src/xenvbd/fdo.h
@@ -43,6 +43,7 @@ typedef struct _XENVBD_FDO XENVBD_FDO, *PXENVBD_FDO;
 #include <gnttab_interface.h>
 #include <debug_interface.h>
 #include <suspend_interface.h>
+#include <unplug_interface.h>
 
 // Reference Counting
 extern LONG
@@ -192,4 +193,9 @@ FdoAcquireSuspend(
     __in PXENVBD_FDO                 Fdo
     );
 
+extern PXENBUS_UNPLUG_INTERFACE
+FdoAcquireUnplug(
+    __in PXENVBD_FDO                 Fdo
+    );
+
 #endif // _XENVBD_FDO_H
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index a77aeed..587b2f2 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -652,11 +652,11 @@ PdoDestroy(
 __checkReturn
 NTSTATUS
 PdoD3ToD0(
-    __in PXENVBD_PDO             Pdo
+    __in PXENVBD_PDO            Pdo
     )
 {
-    NTSTATUS    Status;
-    const ULONG TargetId = PdoGetTargetId(Pdo);
+    NTSTATUS                    Status;
+    const ULONG                 TargetId = PdoGetTargetId(Pdo);
 
     if (!PdoSetDevicePowerState(Pdo, PowerDeviceD0))
         return STATUS_SUCCESS;
@@ -694,10 +694,10 @@ fail1:
 
 VOID
 PdoD0ToD3(
-    __in PXENVBD_PDO             Pdo
+    __in PXENVBD_PDO            Pdo
     )
 {
-    const ULONG TargetId = PdoGetTargetId(Pdo);
+    const ULONG                 TargetId = PdoGetTargetId(Pdo);
 
     if (!PdoSetDevicePowerState(Pdo, PowerDeviceD3))
         return;
@@ -2588,11 +2588,23 @@ PdoDispatchPnp(
     __PdoCheckEjectPending(Pdo);
 
     switch (Stack->MinorFunction) {
-    case IRP_MN_START_DEVICE:
+    case IRP_MN_START_DEVICE: {
+        PXENBUS_UNPLUG_INTERFACE    Unplug;
+
+        Unplug = FdoAcquireUnplug(PdoGetFdo(Pdo));
+        ASSERT(Unplug != NULL);
+
+        XENBUS_UNPLUG(Request,
+                      Unplug,
+                      XENBUS_UNPLUG_DEVICE_TYPE_DISKS,
+                      TRUE);
+        XENBUS_UNPLUG(Release, Unplug);
+
         (VOID) PdoD3ToD0(Pdo);
+
         PdoSetDevicePnpState(Pdo, Started);
         break;
-
+    }
     case IRP_MN_QUERY_STOP_DEVICE:
         PdoSetDevicePnpState(Pdo, StopPending);
         break;
@@ -2601,10 +2613,22 @@ PdoDispatchPnp(
         __PdoRestoreDevicePnpState(Pdo, StopPending);
         break;
 
-    case IRP_MN_STOP_DEVICE:
+    case IRP_MN_STOP_DEVICE: {
+        PXENBUS_UNPLUG_INTERFACE    Unplug;
+
+        Unplug = FdoAcquireUnplug(PdoGetFdo(Pdo));
+        ASSERT(Unplug != NULL);
+
         PdoSetDevicePnpState(Pdo, Stopped);
-        break;
 
+        XENBUS_UNPLUG(Request,
+                      Unplug,
+                      XENBUS_UNPLUG_DEVICE_TYPE_DISKS,
+                      FALSE);
+        XENBUS_UNPLUG(Release, Unplug);
+
+        break;
+    }
     case IRP_MN_QUERY_REMOVE_DEVICE:
         PdoSetDevicePnpState(Pdo, RemovePending);
         break;
@@ -2618,10 +2642,22 @@ PdoDispatchPnp(
         PdoSetDevicePnpState(Pdo, SurpriseRemovePending);
         break;
 
-    case IRP_MN_REMOVE_DEVICE:
+    case IRP_MN_REMOVE_DEVICE: {
+        PXENBUS_UNPLUG_INTERFACE    Unplug;
+
+        Unplug = FdoAcquireUnplug(PdoGetFdo(Pdo));
+        ASSERT(Unplug != NULL);
+
         __PdoRemoveDevice(Pdo);
-        break;
 
+        XENBUS_UNPLUG(Request,
+                      Unplug,
+                      XENBUS_UNPLUG_DEVICE_TYPE_DISKS,
+                      FALSE);
+        XENBUS_UNPLUG(Release, Unplug);
+
+        break;
+    }
     case IRP_MN_EJECT:
         __PdoEject(Pdo);
         break;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:30:14 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:30:14 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7Oo-0002Hp-Az; Mon, 20 Jul 2015 09:30:14 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7Om-0002Hk-HJ
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:30:12 +0000
Received: from [193.109.254.147] by server-9.bemta-14.messagelabs.com id
	1A/3E-03371-3AFBCA55; Mon, 20 Jul 2015 09:30:11 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1437384609!33517162!1
X-Originating-IP: [209.85.160.178]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30846 invoked from network); 20 Jul 2015 09:30:09 -0000
Received: from mail-yk0-f178.google.com (HELO mail-yk0-f178.google.com)
	(209.85.160.178)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:30:09 -0000
Received: by ykax123 with SMTP id x123so134666151yka.1
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:30:08 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=6bHd2TAv3Pbp4ZHbwGX4AyWb+EMm0J4pNHKfgOlZ06A=;
	b=vzw4BHLT2L1yOKx5mGIJCCUKg7SsA+4F0djknP8nRghDJ6pUpadNy28moyACjGvgyc
	gfYao7TzCI4vGQ6McKB5M01oprKwy8e1cHaWjIuKCg8FmdK8hJBllmGXVltf4Cm9XRcB
	1ify0FrKKz1/scTe/PHVpLGszZ7dzVMZ3yOUYDjKWqyJs0xI9mgidGmQeD/EYSQMaDKU
	6HPlPcD6mkKy55me+qitO7bbbzNuz4bEGXeapAlaZ67qB3BOaTjhst7/Q6/2eFGtxfot
	FFS0IM97bvTgD5yRPUKKaFeMAe4DCFaFkX6UAfsPZTigch82auonoGm4VhjYpAeACHVc
	rVHw==
X-Received: by 10.13.238.71 with SMTP id x68mr27655336ywe.168.1437384608843;
	Mon, 20 Jul 2015 02:30:08 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	g63sm19553445ywd.50.2015.07.20.02.30.06
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:30:08 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:30:00 +0100
Message-Id: <1437384600-8976-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove use of interface subscription keys
	and unplug key
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Neither of these are required any more.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 527 +---------------------------------------------------
 1 file changed, 1 insertion(+), 526 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index fce8abd..a4bbd53 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -59,29 +59,9 @@ __user_code;
 #define SERVICE_KEY(_Driver)    \
         SERVICES_KEY ## "\\" ## #_Driver
 
-#define PARAMETERS_KEY(_Driver) \
-        SERVICE_KEY(_Driver) ## "\\Parameters"
-
-#define ADDRESSES_KEY   \
-        SERVICE_KEY(XENVIF) ## "\\Addresses"
-
 #define STATUS_KEY  \
         SERVICE_KEY(XENVIF) ## "\\Status"
 
-#define ENUM_KEY  \
-        SERVICE_KEY(XENVIF) ## "\\Enum"
-
-#define UNPLUG_KEY  \
-        SERVICE_KEY(XENFILT) ## "\\Unplug"
-
-#define CONTROL_KEY "SYSTEM\\CurrentControlSet\\Control"
-
-#define CLASS_KEY   \
-        CONTROL_KEY ## "\\Class"
-
-#define NSI_KEY \
-        CONTROL_KEY ## "\\Nsi"
-
 static VOID
 #pragma prefast(suppress:6262) // Function uses '1036' bytes of stack: exceeds /analyze:stacksize'1024'
 __Log(
@@ -356,488 +336,6 @@ fail1:
 }
 
 static BOOLEAN
-InstallUnplugService(
-    IN  PTCHAR      ClassName,
-    IN  PTCHAR      ServiceName
-    )
-{
-    HKEY            UnplugKey;
-    HRESULT         Error;
-    DWORD           Type;
-    DWORD           OldLength;
-    DWORD           NewLength;
-    PTCHAR          ServiceNames;
-    ULONG           Offset;
-
-    Error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
-                           UNPLUG_KEY,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &UnplugKey,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Error = RegQueryValueEx(UnplugKey,
-                            ClassName,
-                            NULL,
-                            &Type,
-                            NULL,
-                            &OldLength);
-    if (Error != ERROR_SUCCESS) {
-        if (Error == ERROR_FILE_NOT_FOUND) {
-            Type = REG_MULTI_SZ;
-            OldLength = sizeof (TCHAR);
-        } else {
-            SetLastError(Error);
-            goto fail2;
-        }
-    }
-
-    if (Type != REG_MULTI_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail3;
-    }
-
-    NewLength = OldLength + (DWORD)((strlen(ServiceName) + 1) * sizeof (TCHAR));
-
-    ServiceNames = calloc(1, NewLength);
-    if (ServiceNames == NULL)
-        goto fail4;
-
-    Offset = 0;
-    if (OldLength != sizeof (TCHAR)) {
-        Error = RegQueryValueEx(UnplugKey,
-                                ClassName,
-                                NULL,
-                                &Type,
-                                (LPBYTE)ServiceNames,
-                                &OldLength);
-        if (Error != ERROR_SUCCESS) {
-            SetLastError(ERROR_BAD_FORMAT);
-            goto fail5;
-        }
-
-        while (ServiceNames[Offset] != '\0') {
-            ULONG   ServiceNameLength;
-
-            ServiceNameLength = (ULONG)strlen(&ServiceNames[Offset]) / sizeof (TCHAR);
-
-            if (_stricmp(&ServiceNames[Offset], ServiceName) == 0) {
-                Log("%s already present", ServiceName);
-                goto done;
-            }
-
-            Offset += ServiceNameLength + 1;
-        }
-    }
-
-    memmove(&ServiceNames[Offset], ServiceName, strlen(ServiceName));
-    Log("added %s", ServiceName);
-
-    Error = RegSetValueEx(UnplugKey,
-                          ClassName,
-                          0,
-                          REG_MULTI_SZ,
-                          (LPBYTE)ServiceNames,
-                          NewLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail6;
-    }
-
-done:
-    free(ServiceNames);
-
-    RegCloseKey(UnplugKey);
-
-    return TRUE;
-
-fail6:
-    Log("fail5");
-
-fail5:
-    Log("fail5");
-
-    free(ServiceNames);
-
-fail4:
-    Log("fail5");
-
-fail3:
-    Log("fail5");
-
-fail2:
-    Log("fail5");
-
-    RegCloseKey(UnplugKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-RemoveUnplugService(
-    IN  PTCHAR      ClassName,
-    IN  PTCHAR      ServiceName
-    )
-{
-    HKEY            UnplugKey;
-    HRESULT         Error;
-    DWORD           Type;
-    DWORD           OldLength;
-    DWORD           NewLength;
-    PTCHAR          ServiceNames;
-    ULONG           Offset;
-    ULONG           ServiceNameLength;
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         UNPLUG_KEY,
-                         0,
-                         KEY_ALL_ACCESS,
-                         &UnplugKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Error = RegQueryValueEx(UnplugKey,
-                            ClassName,
-                            NULL,
-                            &Type,
-                            NULL,
-                            &OldLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    if (Type != REG_MULTI_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail3;
-    }
-
-    ServiceNames = calloc(1, OldLength);
-    if (ServiceNames == NULL)
-        goto fail4;
-
-    Error = RegQueryValueEx(UnplugKey,
-                            ClassName,
-                            NULL,
-                            &Type,
-                            (LPBYTE)ServiceNames,
-                            &OldLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail5;
-    }
-
-    Offset = 0;
-    ServiceNameLength = 0;
-    while (ServiceNames[Offset] != '\0') {
-        ServiceNameLength = (ULONG)strlen(&ServiceNames[Offset]) / sizeof (TCHAR);
-
-        if (_stricmp(&ServiceNames[Offset], ServiceName) == 0)
-            goto remove;
-
-        Offset += ServiceNameLength + 1;
-    }
-
-    goto done;
-
-remove:
-    NewLength = OldLength - ((ServiceNameLength + 1) * sizeof (TCHAR));
-
-    memmove(&ServiceNames[Offset],
-            &ServiceNames[Offset + ServiceNameLength + 1],
-            (NewLength - Offset) * sizeof (TCHAR));
-
-    Log("removed %s", ServiceName);
-
-    Error = RegSetValueEx(UnplugKey,
-                          ClassName,
-                          0,
-                          REG_MULTI_SZ,
-                          (LPBYTE)ServiceNames,
-                          NewLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail6;
-    }
-
-done:
-    free(ServiceNames);
-
-    RegCloseKey(UnplugKey);
-
-    return TRUE;
-
-fail6:
-    Log("fail6");
-
-fail5:
-    Log("fail5");
-
-    free(ServiceNames);
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(UnplugKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static HKEY
-OpenInterfacesKey(
-    IN  PTCHAR  ProviderName
-    )
-{
-    HRESULT     Result;
-    TCHAR       KeyName[MAX_PATH];
-    HKEY        Key;
-    HRESULT     Error;
-
-    Result = StringCbPrintf(KeyName,
-                            MAX_PATH,
-                            "%s\\%s\\Interfaces",
-                            SERVICES_KEY,
-                            ProviderName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail1;
-    }
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         KeyName,
-                         0,
-                         KEY_ALL_ACCESS,
-                         &Key);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    return Key;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static BOOLEAN
-RegisterInterface(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  InterfaceName,
-    IN  DWORD   InterfaceVersion
-    )
-{
-    HKEY        Key;
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL)
-        goto fail1;
-
-    Error = RegCreateKeyEx(InterfacesKey,
-                           "XENNET",
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &Key,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    Error = RegSetValueEx(Key,
-                          InterfaceName,
-                          0,
-                          REG_DWORD,
-                          (const BYTE *)&InterfaceVersion,
-                          sizeof(DWORD));
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    RegCloseKey(Key);
-    RegCloseKey(InterfacesKey);
-    return TRUE;
-
-fail3:
-    RegCloseKey(Key);
-
-fail2:
-    RegCloseKey(InterfacesKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-DeregisterAllInterfaces(
-    IN  PTCHAR  ProviderName
-    )
-{
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL) {
-        goto fail1;
-    }
-
-    Error = RegDeleteTree(InterfacesKey,
-                          "XENNET");
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    RegCloseKey(InterfacesKey);
-    return TRUE;
-
-fail2:
-    RegCloseKey(InterfacesKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-GetEnumCount(
-    OUT PDWORD  Count
-    )
-{
-    HKEY        EnumKey;
-    HRESULT     Error;
-    DWORD       ValueLength;
-    DWORD       Value;
-    DWORD       Type;
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         ENUM_KEY,
-                         0,
-                         KEY_READ,
-                         &EnumKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    ValueLength = sizeof (Value);
-
-    Error = RegQueryValueEx(EnumKey,
-                            "Count",
-                            NULL,
-                            &Type,
-                            (LPBYTE)&Value,
-                            &ValueLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    if (Type != REG_DWORD) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail3;
-    }
-
-    *Count = Value;
-    Log("%u", *Count);
-
-    RegCloseKey(EnumKey);
-
-    return TRUE;
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(EnumKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
 CheckStatus(
     OUT PBOOLEAN    NeedReboot
     )
@@ -991,13 +489,6 @@ __DifInstallPostProcess(
     if (!Success)
         goto fail1;
 
-    Success = InstallUnplugService("NICS", "XENNET");
-    if (!Success)
-        goto fail2;
-
-    RegisterInterface("XENVIF", "VIF", XENVIF_VIF_INTERFACE_VERSION_MAX);
-    RegisterInterface("XENBUS", "CACHE", XENBUS_CACHE_INTERFACE_VERSION_MAX);
-
     NeedReboot = FALSE;
 
     Success = CheckStatus(&NeedReboot);
@@ -1008,9 +499,6 @@ __DifInstallPostProcess(
 
     return NO_ERROR;
 
-fail2:
-    Log("fail2");
-
 fail1:
     Error = GetLastError();
 
@@ -1062,24 +550,11 @@ __DifRemovePreProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
-    BOOLEAN                         Success;
-    DWORD                           Count;
-
     UNREFERENCED_PARAMETER(DeviceInfoSet);
     UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
-    Log("====>");
-
-    Success = GetEnumCount(&Count);
-
-    if (Success && Count == 1) {
-        (VOID) DeregisterAllInterfaces("XENVIF");
-        (VOID) DeregisterAllInterfaces("XENBUS");
-        (VOID) RemoveUnplugService("NICS", "XENNET");
-    }
-
-    Log("<====");
+    Log("<===>");
 
     return NO_ERROR;
 }
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 20 09:30:14 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 20 Jul 2015 09:30:14 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZH7Oo-0002Hp-Az; Mon, 20 Jul 2015 09:30:14 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZH7Om-0002Hk-HJ
	for win-pv-devel@lists.xenproject.org; Mon, 20 Jul 2015 09:30:12 +0000
Received: from [193.109.254.147] by server-9.bemta-14.messagelabs.com id
	1A/3E-03371-3AFBCA55; Mon, 20 Jul 2015 09:30:11 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1437384609!33517162!1
X-Originating-IP: [209.85.160.178]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30846 invoked from network); 20 Jul 2015 09:30:09 -0000
Received: from mail-yk0-f178.google.com (HELO mail-yk0-f178.google.com)
	(209.85.160.178)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Jul 2015 09:30:09 -0000
Received: by ykax123 with SMTP id x123so134666151yka.1
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 20 Jul 2015 02:30:08 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=6bHd2TAv3Pbp4ZHbwGX4AyWb+EMm0J4pNHKfgOlZ06A=;
	b=vzw4BHLT2L1yOKx5mGIJCCUKg7SsA+4F0djknP8nRghDJ6pUpadNy28moyACjGvgyc
	gfYao7TzCI4vGQ6McKB5M01oprKwy8e1cHaWjIuKCg8FmdK8hJBllmGXVltf4Cm9XRcB
	1ify0FrKKz1/scTe/PHVpLGszZ7dzVMZ3yOUYDjKWqyJs0xI9mgidGmQeD/EYSQMaDKU
	6HPlPcD6mkKy55me+qitO7bbbzNuz4bEGXeapAlaZ67qB3BOaTjhst7/Q6/2eFGtxfot
	FFS0IM97bvTgD5yRPUKKaFeMAe4DCFaFkX6UAfsPZTigch82auonoGm4VhjYpAeACHVc
	rVHw==
X-Received: by 10.13.238.71 with SMTP id x68mr27655336ywe.168.1437384608843;
	Mon, 20 Jul 2015 02:30:08 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	g63sm19553445ywd.50.2015.07.20.02.30.06
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Mon, 20 Jul 2015 02:30:08 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Mon, 20 Jul 2015 10:30:00 +0100
Message-Id: <1437384600-8976-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove use of interface subscription keys
	and unplug key
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Neither of these are required any more.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 527 +---------------------------------------------------
 1 file changed, 1 insertion(+), 526 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index fce8abd..a4bbd53 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -59,29 +59,9 @@ __user_code;
 #define SERVICE_KEY(_Driver)    \
         SERVICES_KEY ## "\\" ## #_Driver
 
-#define PARAMETERS_KEY(_Driver) \
-        SERVICE_KEY(_Driver) ## "\\Parameters"
-
-#define ADDRESSES_KEY   \
-        SERVICE_KEY(XENVIF) ## "\\Addresses"
-
 #define STATUS_KEY  \
         SERVICE_KEY(XENVIF) ## "\\Status"
 
-#define ENUM_KEY  \
-        SERVICE_KEY(XENVIF) ## "\\Enum"
-
-#define UNPLUG_KEY  \
-        SERVICE_KEY(XENFILT) ## "\\Unplug"
-
-#define CONTROL_KEY "SYSTEM\\CurrentControlSet\\Control"
-
-#define CLASS_KEY   \
-        CONTROL_KEY ## "\\Class"
-
-#define NSI_KEY \
-        CONTROL_KEY ## "\\Nsi"
-
 static VOID
 #pragma prefast(suppress:6262) // Function uses '1036' bytes of stack: exceeds /analyze:stacksize'1024'
 __Log(
@@ -356,488 +336,6 @@ fail1:
 }
 
 static BOOLEAN
-InstallUnplugService(
-    IN  PTCHAR      ClassName,
-    IN  PTCHAR      ServiceName
-    )
-{
-    HKEY            UnplugKey;
-    HRESULT         Error;
-    DWORD           Type;
-    DWORD           OldLength;
-    DWORD           NewLength;
-    PTCHAR          ServiceNames;
-    ULONG           Offset;
-
-    Error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
-                           UNPLUG_KEY,
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &UnplugKey,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Error = RegQueryValueEx(UnplugKey,
-                            ClassName,
-                            NULL,
-                            &Type,
-                            NULL,
-                            &OldLength);
-    if (Error != ERROR_SUCCESS) {
-        if (Error == ERROR_FILE_NOT_FOUND) {
-            Type = REG_MULTI_SZ;
-            OldLength = sizeof (TCHAR);
-        } else {
-            SetLastError(Error);
-            goto fail2;
-        }
-    }
-
-    if (Type != REG_MULTI_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail3;
-    }
-
-    NewLength = OldLength + (DWORD)((strlen(ServiceName) + 1) * sizeof (TCHAR));
-
-    ServiceNames = calloc(1, NewLength);
-    if (ServiceNames == NULL)
-        goto fail4;
-
-    Offset = 0;
-    if (OldLength != sizeof (TCHAR)) {
-        Error = RegQueryValueEx(UnplugKey,
-                                ClassName,
-                                NULL,
-                                &Type,
-                                (LPBYTE)ServiceNames,
-                                &OldLength);
-        if (Error != ERROR_SUCCESS) {
-            SetLastError(ERROR_BAD_FORMAT);
-            goto fail5;
-        }
-
-        while (ServiceNames[Offset] != '\0') {
-            ULONG   ServiceNameLength;
-
-            ServiceNameLength = (ULONG)strlen(&ServiceNames[Offset]) / sizeof (TCHAR);
-
-            if (_stricmp(&ServiceNames[Offset], ServiceName) == 0) {
-                Log("%s already present", ServiceName);
-                goto done;
-            }
-
-            Offset += ServiceNameLength + 1;
-        }
-    }
-
-    memmove(&ServiceNames[Offset], ServiceName, strlen(ServiceName));
-    Log("added %s", ServiceName);
-
-    Error = RegSetValueEx(UnplugKey,
-                          ClassName,
-                          0,
-                          REG_MULTI_SZ,
-                          (LPBYTE)ServiceNames,
-                          NewLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail6;
-    }
-
-done:
-    free(ServiceNames);
-
-    RegCloseKey(UnplugKey);
-
-    return TRUE;
-
-fail6:
-    Log("fail5");
-
-fail5:
-    Log("fail5");
-
-    free(ServiceNames);
-
-fail4:
-    Log("fail5");
-
-fail3:
-    Log("fail5");
-
-fail2:
-    Log("fail5");
-
-    RegCloseKey(UnplugKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-RemoveUnplugService(
-    IN  PTCHAR      ClassName,
-    IN  PTCHAR      ServiceName
-    )
-{
-    HKEY            UnplugKey;
-    HRESULT         Error;
-    DWORD           Type;
-    DWORD           OldLength;
-    DWORD           NewLength;
-    PTCHAR          ServiceNames;
-    ULONG           Offset;
-    ULONG           ServiceNameLength;
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         UNPLUG_KEY,
-                         0,
-                         KEY_ALL_ACCESS,
-                         &UnplugKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Error = RegQueryValueEx(UnplugKey,
-                            ClassName,
-                            NULL,
-                            &Type,
-                            NULL,
-                            &OldLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    if (Type != REG_MULTI_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail3;
-    }
-
-    ServiceNames = calloc(1, OldLength);
-    if (ServiceNames == NULL)
-        goto fail4;
-
-    Error = RegQueryValueEx(UnplugKey,
-                            ClassName,
-                            NULL,
-                            &Type,
-                            (LPBYTE)ServiceNames,
-                            &OldLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail5;
-    }
-
-    Offset = 0;
-    ServiceNameLength = 0;
-    while (ServiceNames[Offset] != '\0') {
-        ServiceNameLength = (ULONG)strlen(&ServiceNames[Offset]) / sizeof (TCHAR);
-
-        if (_stricmp(&ServiceNames[Offset], ServiceName) == 0)
-            goto remove;
-
-        Offset += ServiceNameLength + 1;
-    }
-
-    goto done;
-
-remove:
-    NewLength = OldLength - ((ServiceNameLength + 1) * sizeof (TCHAR));
-
-    memmove(&ServiceNames[Offset],
-            &ServiceNames[Offset + ServiceNameLength + 1],
-            (NewLength - Offset) * sizeof (TCHAR));
-
-    Log("removed %s", ServiceName);
-
-    Error = RegSetValueEx(UnplugKey,
-                          ClassName,
-                          0,
-                          REG_MULTI_SZ,
-                          (LPBYTE)ServiceNames,
-                          NewLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail6;
-    }
-
-done:
-    free(ServiceNames);
-
-    RegCloseKey(UnplugKey);
-
-    return TRUE;
-
-fail6:
-    Log("fail6");
-
-fail5:
-    Log("fail5");
-
-    free(ServiceNames);
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(UnplugKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static HKEY
-OpenInterfacesKey(
-    IN  PTCHAR  ProviderName
-    )
-{
-    HRESULT     Result;
-    TCHAR       KeyName[MAX_PATH];
-    HKEY        Key;
-    HRESULT     Error;
-
-    Result = StringCbPrintf(KeyName,
-                            MAX_PATH,
-                            "%s\\%s\\Interfaces",
-                            SERVICES_KEY,
-                            ProviderName);
-    if (!SUCCEEDED(Result)) {
-        SetLastError(ERROR_BUFFER_OVERFLOW);
-        goto fail1;
-    }
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         KeyName,
-                         0,
-                         KEY_ALL_ACCESS,
-                         &Key);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    return Key;
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static BOOLEAN
-RegisterInterface(
-    IN  PTCHAR  ProviderName,
-    IN  PTCHAR  InterfaceName,
-    IN  DWORD   InterfaceVersion
-    )
-{
-    HKEY        Key;
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL)
-        goto fail1;
-
-    Error = RegCreateKeyEx(InterfacesKey,
-                           "XENNET",
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &Key,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    Error = RegSetValueEx(Key,
-                          InterfaceName,
-                          0,
-                          REG_DWORD,
-                          (const BYTE *)&InterfaceVersion,
-                          sizeof(DWORD));
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    RegCloseKey(Key);
-    RegCloseKey(InterfacesKey);
-    return TRUE;
-
-fail3:
-    RegCloseKey(Key);
-
-fail2:
-    RegCloseKey(InterfacesKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-DeregisterAllInterfaces(
-    IN  PTCHAR  ProviderName
-    )
-{
-    HKEY        InterfacesKey;
-    HRESULT     Error;
-
-    InterfacesKey = OpenInterfacesKey(ProviderName);
-    if (InterfacesKey == NULL) {
-        goto fail1;
-    }
-
-    Error = RegDeleteTree(InterfacesKey,
-                          "XENNET");
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    RegCloseKey(InterfacesKey);
-    return TRUE;
-
-fail2:
-    RegCloseKey(InterfacesKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-GetEnumCount(
-    OUT PDWORD  Count
-    )
-{
-    HKEY        EnumKey;
-    HRESULT     Error;
-    DWORD       ValueLength;
-    DWORD       Value;
-    DWORD       Type;
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         ENUM_KEY,
-                         0,
-                         KEY_READ,
-                         &EnumKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    ValueLength = sizeof (Value);
-
-    Error = RegQueryValueEx(EnumKey,
-                            "Count",
-                            NULL,
-                            &Type,
-                            (LPBYTE)&Value,
-                            &ValueLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    if (Type != REG_DWORD) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail3;
-    }
-
-    *Count = Value;
-    Log("%u", *Count);
-
-    RegCloseKey(EnumKey);
-
-    return TRUE;
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(EnumKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
 CheckStatus(
     OUT PBOOLEAN    NeedReboot
     )
@@ -991,13 +489,6 @@ __DifInstallPostProcess(
     if (!Success)
         goto fail1;
 
-    Success = InstallUnplugService("NICS", "XENNET");
-    if (!Success)
-        goto fail2;
-
-    RegisterInterface("XENVIF", "VIF", XENVIF_VIF_INTERFACE_VERSION_MAX);
-    RegisterInterface("XENBUS", "CACHE", XENBUS_CACHE_INTERFACE_VERSION_MAX);
-
     NeedReboot = FALSE;
 
     Success = CheckStatus(&NeedReboot);
@@ -1008,9 +499,6 @@ __DifInstallPostProcess(
 
     return NO_ERROR;
 
-fail2:
-    Log("fail2");
-
 fail1:
     Error = GetLastError();
 
@@ -1062,24 +550,11 @@ __DifRemovePreProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
-    BOOLEAN                         Success;
-    DWORD                           Count;
-
     UNREFERENCED_PARAMETER(DeviceInfoSet);
     UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
-    Log("====>");
-
-    Success = GetEnumCount(&Count);
-
-    if (Success && Count == 1) {
-        (VOID) DeregisterAllInterfaces("XENVIF");
-        (VOID) DeregisterAllInterfaces("XENBUS");
-        (VOID) RemoveUnplugService("NICS", "XENNET");
-    }
-
-    Log("<====");
+    Log("<===>");
 
     return NO_ERROR;
 }
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:51:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:51:42 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwJ3-0004k7-Nj; Wed, 22 Jul 2015 15:51:41 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwJ2-0004jn-4V
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:51:40 +0000
Received: from [193.109.254.147] by server-1.bemta-14.messagelabs.com id
	1B/8E-06739-B0CBFA55; Wed, 22 Jul 2015 15:51:39 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1437580298!22937072!1
X-Originating-IP: [209.85.212.172]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7722 invoked from network); 22 Jul 2015 15:51:38 -0000
Received: from mail-wi0-f172.google.com (HELO mail-wi0-f172.google.com)
	(209.85.212.172)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:51:38 -0000
Received: by wibxm9 with SMTP id xm9so109205525wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:51:37 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=8mX3fp/RFwDGmvo375/3jN/zehnvWgm0RFlKCSZx+g8=;
	b=gOc29TZsj12xDiMYKGtI5/nOymRToAt6ISKZwFSX4kalDUQfq6tgB16Scf7mennq8P
	7B/Z03UT29n78pfgjz3WSJ2eN561mV+9kg9ThZPscFGiIZ0BIRXNtycrgrzwfKmZMVwQ
	Uej9V7A/4aFIvuDs4cFU4sCDYcr7NGmt5FrwUr5axMQzw2hOq0bI2dNNll/sR/EZi3z1
	qIIYVxBVoINDJBu9VpgqxBJKwuIhXs2AH1NFKRf4kUeQ7DnOOYgN2GbE1TWBZF7JNAm7
	UUDmYQ5/KV459+srjxRIdTX/DqAUrusrwzTpYJHUWD0wrfPtkLO3iAxn+5xHlliIUlO8
	Trng==
X-Received: by 10.181.13.134 with SMTP id ey6mr7924677wid.88.1437580297747;
	Wed, 22 Jul 2015 08:51:37 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	bg6sm3015292wjc.13.2015.07.22.08.51.35
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:51:37 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:51:28 +0100
Message-Id: <1437580291-5576-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/4] Update registry code
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...to bring it in line with XENVIF

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/common/registry.c | 191 +++++++++++++++++++++++++++++++++++++++++++-------
 src/common/registry.h |  31 ++++++--
 2 files changed, 193 insertions(+), 29 deletions(-)

diff --git a/src/common/registry.c b/src/common/registry.c
index cb9e31d..2785020 100644
--- a/src/common/registry.c
+++ b/src/common/registry.c
@@ -389,7 +389,7 @@ fail1:
 NTSTATUS
 RegistryEnumerateSubKeys(
     IN  HANDLE              Key,
-    IN  NTSTATUS            (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS            (*Callback)(PVOID, HANDLE, PANSI_STRING),
     IN  PVOID               Context
     )
 {
@@ -432,6 +432,7 @@ RegistryEnumerateSubKeys(
         goto fail4;
 
     for (Index = 0; Index < Full->SubKeys; Index++) {
+        ULONG           Ignore;
         UNICODE_STRING  Unicode;
         ANSI_STRING     Ansi;
 
@@ -440,7 +441,7 @@ RegistryEnumerateSubKeys(
                                 KeyBasicInformation,
                                 Basic,
                                 Size,
-                                &Size);
+                                &Ignore);
         if (!NT_SUCCESS(status))
             goto fail5;
 
@@ -460,7 +461,7 @@ RegistryEnumerateSubKeys(
 
         Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));        
 
-        status = Callback(Context, Key, Ansi.Buffer);
+        status = Callback(Context, Key, &Ansi);
 
         __RegistryFree(Ansi.Buffer);
         Ansi.Buffer = NULL;
@@ -492,7 +493,7 @@ fail1:
 NTSTATUS
 RegistryEnumerateValues(
     IN  HANDLE                      Key,
-    IN  NTSTATUS                    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS                    (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
     IN  PVOID                       Context
     )
 {
@@ -535,6 +536,7 @@ RegistryEnumerateValues(
         goto fail4;
 
     for (Index = 0; Index < Full->Values; Index++) {
+        ULONG           Ignore;
         UNICODE_STRING  Unicode;
         ANSI_STRING     Ansi;
 
@@ -543,7 +545,7 @@ RegistryEnumerateValues(
                                      KeyValueBasicInformation,
                                      Basic,
                                      Size,
-                                     &Size);
+                                     &Ignore);
         if (!NT_SUCCESS(status))
             goto fail5;
 
@@ -559,7 +561,7 @@ RegistryEnumerateValues(
 
         Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));        
 
-        status = Callback(Context, Key, Ansi.Buffer);
+        status = Callback(Context, Key, &Ansi, Basic->Type);
 
         __RegistryFree(Ansi.Buffer);
 
@@ -928,6 +930,148 @@ fail1:
 }
 
 NTSTATUS
+RegistryQueryBinaryValue(
+    IN  HANDLE                      Key,
+    IN  PCHAR                       Name,
+    OUT PVOID                       *Buffer,
+    OUT PULONG                      Length
+    )
+{
+    ANSI_STRING                     Ansi;
+    UNICODE_STRING                  Unicode;
+    PKEY_VALUE_PARTIAL_INFORMATION  Partial;
+    ULONG                           Size;
+    NTSTATUS                        status;
+
+    RtlInitAnsiString(&Ansi, Name);
+
+    status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = ZwQueryValueKey(Key,
+                             &Unicode,
+                             KeyValuePartialInformation,
+                             NULL,
+                             0,
+                             &Size);
+    if (status != STATUS_BUFFER_OVERFLOW &&
+        status != STATUS_BUFFER_TOO_SMALL)
+        goto fail2;
+
+#pragma prefast(suppress:6102)
+    Partial = __RegistryAllocate(Size);
+
+    status = STATUS_NO_MEMORY;
+    if (Partial == NULL)
+        goto fail3;
+
+    status = ZwQueryValueKey(Key,
+                             &Unicode,
+                             KeyValuePartialInformation,
+                             Partial,
+                             Size,
+                             &Size);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    switch (Partial->Type) {
+    case REG_BINARY:
+        *Buffer = __RegistryAllocate(Partial->DataLength);
+
+        status = STATUS_NO_MEMORY;
+        if (*Buffer == NULL)
+            break;
+
+        *Length = Partial->DataLength;
+        RtlCopyMemory(*Buffer, Partial->Data, Partial->DataLength);
+        break;
+
+    default:
+        status = STATUS_INVALID_PARAMETER;
+        *Buffer = NULL;
+        break;
+    }
+
+    if (*Buffer == NULL)
+        goto fail5;
+
+    __RegistryFree(Partial);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    return STATUS_SUCCESS;
+
+fail5:
+fail4:
+    __RegistryFree(Partial);
+
+fail3:
+fail2:
+    RtlFreeUnicodeString(&Unicode);
+
+fail1:
+    return status;
+}
+
+NTSTATUS
+RegistryUpdateBinaryValue(
+    IN  HANDLE                      Key,
+    IN  PCHAR                       Name,
+    IN  PVOID                       Buffer,
+    IN  ULONG                       Length
+    )
+{
+    ANSI_STRING                     Ansi;
+    UNICODE_STRING                  Unicode;
+    PKEY_VALUE_PARTIAL_INFORMATION  Partial;
+    NTSTATUS                        status;
+
+    RtlInitAnsiString(&Ansi, Name);
+
+    status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Partial = __RegistryAllocate(FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data) +
+                                 Length);
+
+    status = STATUS_NO_MEMORY;
+    if (Partial == NULL)
+        goto fail2;
+
+    Partial->TitleIndex = 0;
+    Partial->Type = REG_BINARY;
+    Partial->DataLength = Length;
+    RtlCopyMemory(Partial->Data, Buffer, Partial->DataLength);
+
+    status = ZwSetValueKey(Key,
+                           &Unicode,
+                           Partial->TitleIndex,
+                           Partial->Type,
+                           Partial->Data,
+                           Partial->DataLength);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    __RegistryFree(Partial);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    return STATUS_SUCCESS;
+
+fail3:
+    __RegistryFree(Partial);
+
+fail2:
+    RtlFreeUnicodeString(&Unicode);
+
+fail1:
+
+    return status;
+}
+
+NTSTATUS
 RegistryQueryKeyName(
     IN  HANDLE              Key,
     OUT PANSI_STRING        *Array
@@ -1156,13 +1300,12 @@ NTSTATUS
 RegistryUpdateSzValue(
     IN  HANDLE                      Key,
     IN  PCHAR                       Name,
-    IN  ULONG                       Type,
-    ...
+    IN  PANSI_STRING                Array
     )
 {
     ANSI_STRING                     Ansi;
     UNICODE_STRING                  Unicode;
-    va_list                         Arguments;
+    ULONG                           Type;
     PKEY_VALUE_PARTIAL_INFORMATION  Partial;
     NTSTATUS                        status;
 
@@ -1171,33 +1314,25 @@ RegistryUpdateSzValue(
     status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
     if (!NT_SUCCESS(status))
         goto fail1;
-        
-    va_start(Arguments, Type);
-    switch (Type) {
-    case REG_SZ: {
-        PANSI_STRING    Argument;
 
-        Argument = va_arg(Arguments, PANSI_STRING);
+    Type = (Array[1].Buffer != NULL) ? REG_MULTI_SZ : REG_SZ;
 
+    switch (Type) {
+    case REG_SZ:
         status = STATUS_NO_MEMORY;
-        Partial = RegistryAnsiToSz(Argument);        
+        Partial = RegistryAnsiToSz(Array);
         break;
-    }
-    case REG_MULTI_SZ: {
-        PANSI_STRING    Argument;
-
-        Argument = va_arg(Arguments, PANSI_STRING);
 
+    case REG_MULTI_SZ:
         status = STATUS_NO_MEMORY;
-        Partial = RegistryAnsiToMultiSz(Argument);        
+        Partial = RegistryAnsiToMultiSz(Array);
         break;
-    }
+
     default:
         status = STATUS_INVALID_PARAMETER;
         Partial = NULL;
         break;
     }
-    va_end(Arguments);
 
     if (Partial == NULL)
         goto fail2;
@@ -1244,6 +1379,14 @@ RegistryFreeSzValue(
 }
 
 VOID
+RegistryFreeBinaryValue(
+    IN  PVOID   Buffer
+    )
+{
+    __RegistryFree(Buffer);
+}
+
+VOID
 RegistryCloseKey(
     IN  HANDLE  Key
     )
diff --git a/src/common/registry.h b/src/common/registry.h
index 3920b6d..06e9bd6 100644
--- a/src/common/registry.h
+++ b/src/common/registry.h
@@ -96,7 +96,8 @@ RegistryOpenSubKey(
 extern NTSTATUS
 RegistryCreateSubKey(
     IN  HANDLE      Key,
-    IN  PCHAR       Name,    IN  ULONG       Options,
+    IN  PCHAR       Name,
+    IN  ULONG       Options,
     OUT PHANDLE     SubKey
     );
 
@@ -109,14 +110,14 @@ RegistryDeleteSubKey(
 extern NTSTATUS
 RegistryEnumerateSubKeys(
     IN  HANDLE      Key,
-    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PANSI_STRING),
     IN  PVOID       Context
     );
 
 extern NTSTATUS
 RegistryEnumerateValues(
     IN  HANDLE      Key,
-    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
     IN  PVOID       Context
     );
 
@@ -148,6 +149,22 @@ RegistryQuerySzValue(
     );
 
 extern NTSTATUS
+RegistryQueryBinaryValue(
+    IN  HANDLE          Key,
+    IN  PCHAR           Name,
+    OUT PVOID           *Buffer,
+    OUT PULONG          Length
+    );
+
+extern NTSTATUS
+RegistryUpdateBinaryValue(
+    IN  HANDLE          Key,
+    IN  PCHAR           Name,
+    IN  PVOID           Buffer,
+    IN  ULONG           Length
+    );
+
+extern NTSTATUS
 RegistryQueryKeyName(
     IN  HANDLE              Key,
     OUT PANSI_STRING        *Array
@@ -164,12 +181,16 @@ RegistryFreeSzValue(
     IN  PANSI_STRING    Array
     );
 
+extern VOID
+RegistryFreeBinaryValue(
+    IN  PVOID           Buffer
+    );
+
 extern NTSTATUS
 RegistryUpdateSzValue(
     IN  HANDLE          Key,
     IN  PCHAR           Name,
-    IN  ULONG           Type,
-    ...
+    IN  PANSI_STRING    Array
     );
 
 extern VOID
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:51:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:51:42 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwJ3-0004k7-Nj; Wed, 22 Jul 2015 15:51:41 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwJ2-0004jn-4V
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:51:40 +0000
Received: from [193.109.254.147] by server-1.bemta-14.messagelabs.com id
	1B/8E-06739-B0CBFA55; Wed, 22 Jul 2015 15:51:39 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1437580298!22937072!1
X-Originating-IP: [209.85.212.172]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7722 invoked from network); 22 Jul 2015 15:51:38 -0000
Received: from mail-wi0-f172.google.com (HELO mail-wi0-f172.google.com)
	(209.85.212.172)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:51:38 -0000
Received: by wibxm9 with SMTP id xm9so109205525wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:51:37 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=8mX3fp/RFwDGmvo375/3jN/zehnvWgm0RFlKCSZx+g8=;
	b=gOc29TZsj12xDiMYKGtI5/nOymRToAt6ISKZwFSX4kalDUQfq6tgB16Scf7mennq8P
	7B/Z03UT29n78pfgjz3WSJ2eN561mV+9kg9ThZPscFGiIZ0BIRXNtycrgrzwfKmZMVwQ
	Uej9V7A/4aFIvuDs4cFU4sCDYcr7NGmt5FrwUr5axMQzw2hOq0bI2dNNll/sR/EZi3z1
	qIIYVxBVoINDJBu9VpgqxBJKwuIhXs2AH1NFKRf4kUeQ7DnOOYgN2GbE1TWBZF7JNAm7
	UUDmYQ5/KV459+srjxRIdTX/DqAUrusrwzTpYJHUWD0wrfPtkLO3iAxn+5xHlliIUlO8
	Trng==
X-Received: by 10.181.13.134 with SMTP id ey6mr7924677wid.88.1437580297747;
	Wed, 22 Jul 2015 08:51:37 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	bg6sm3015292wjc.13.2015.07.22.08.51.35
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:51:37 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:51:28 +0100
Message-Id: <1437580291-5576-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/4] Update registry code
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...to bring it in line with XENVIF

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/common/registry.c | 191 +++++++++++++++++++++++++++++++++++++++++++-------
 src/common/registry.h |  31 ++++++--
 2 files changed, 193 insertions(+), 29 deletions(-)

diff --git a/src/common/registry.c b/src/common/registry.c
index cb9e31d..2785020 100644
--- a/src/common/registry.c
+++ b/src/common/registry.c
@@ -389,7 +389,7 @@ fail1:
 NTSTATUS
 RegistryEnumerateSubKeys(
     IN  HANDLE              Key,
-    IN  NTSTATUS            (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS            (*Callback)(PVOID, HANDLE, PANSI_STRING),
     IN  PVOID               Context
     )
 {
@@ -432,6 +432,7 @@ RegistryEnumerateSubKeys(
         goto fail4;
 
     for (Index = 0; Index < Full->SubKeys; Index++) {
+        ULONG           Ignore;
         UNICODE_STRING  Unicode;
         ANSI_STRING     Ansi;
 
@@ -440,7 +441,7 @@ RegistryEnumerateSubKeys(
                                 KeyBasicInformation,
                                 Basic,
                                 Size,
-                                &Size);
+                                &Ignore);
         if (!NT_SUCCESS(status))
             goto fail5;
 
@@ -460,7 +461,7 @@ RegistryEnumerateSubKeys(
 
         Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));        
 
-        status = Callback(Context, Key, Ansi.Buffer);
+        status = Callback(Context, Key, &Ansi);
 
         __RegistryFree(Ansi.Buffer);
         Ansi.Buffer = NULL;
@@ -492,7 +493,7 @@ fail1:
 NTSTATUS
 RegistryEnumerateValues(
     IN  HANDLE                      Key,
-    IN  NTSTATUS                    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS                    (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
     IN  PVOID                       Context
     )
 {
@@ -535,6 +536,7 @@ RegistryEnumerateValues(
         goto fail4;
 
     for (Index = 0; Index < Full->Values; Index++) {
+        ULONG           Ignore;
         UNICODE_STRING  Unicode;
         ANSI_STRING     Ansi;
 
@@ -543,7 +545,7 @@ RegistryEnumerateValues(
                                      KeyValueBasicInformation,
                                      Basic,
                                      Size,
-                                     &Size);
+                                     &Ignore);
         if (!NT_SUCCESS(status))
             goto fail5;
 
@@ -559,7 +561,7 @@ RegistryEnumerateValues(
 
         Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));        
 
-        status = Callback(Context, Key, Ansi.Buffer);
+        status = Callback(Context, Key, &Ansi, Basic->Type);
 
         __RegistryFree(Ansi.Buffer);
 
@@ -928,6 +930,148 @@ fail1:
 }
 
 NTSTATUS
+RegistryQueryBinaryValue(
+    IN  HANDLE                      Key,
+    IN  PCHAR                       Name,
+    OUT PVOID                       *Buffer,
+    OUT PULONG                      Length
+    )
+{
+    ANSI_STRING                     Ansi;
+    UNICODE_STRING                  Unicode;
+    PKEY_VALUE_PARTIAL_INFORMATION  Partial;
+    ULONG                           Size;
+    NTSTATUS                        status;
+
+    RtlInitAnsiString(&Ansi, Name);
+
+    status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = ZwQueryValueKey(Key,
+                             &Unicode,
+                             KeyValuePartialInformation,
+                             NULL,
+                             0,
+                             &Size);
+    if (status != STATUS_BUFFER_OVERFLOW &&
+        status != STATUS_BUFFER_TOO_SMALL)
+        goto fail2;
+
+#pragma prefast(suppress:6102)
+    Partial = __RegistryAllocate(Size);
+
+    status = STATUS_NO_MEMORY;
+    if (Partial == NULL)
+        goto fail3;
+
+    status = ZwQueryValueKey(Key,
+                             &Unicode,
+                             KeyValuePartialInformation,
+                             Partial,
+                             Size,
+                             &Size);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    switch (Partial->Type) {
+    case REG_BINARY:
+        *Buffer = __RegistryAllocate(Partial->DataLength);
+
+        status = STATUS_NO_MEMORY;
+        if (*Buffer == NULL)
+            break;
+
+        *Length = Partial->DataLength;
+        RtlCopyMemory(*Buffer, Partial->Data, Partial->DataLength);
+        break;
+
+    default:
+        status = STATUS_INVALID_PARAMETER;
+        *Buffer = NULL;
+        break;
+    }
+
+    if (*Buffer == NULL)
+        goto fail5;
+
+    __RegistryFree(Partial);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    return STATUS_SUCCESS;
+
+fail5:
+fail4:
+    __RegistryFree(Partial);
+
+fail3:
+fail2:
+    RtlFreeUnicodeString(&Unicode);
+
+fail1:
+    return status;
+}
+
+NTSTATUS
+RegistryUpdateBinaryValue(
+    IN  HANDLE                      Key,
+    IN  PCHAR                       Name,
+    IN  PVOID                       Buffer,
+    IN  ULONG                       Length
+    )
+{
+    ANSI_STRING                     Ansi;
+    UNICODE_STRING                  Unicode;
+    PKEY_VALUE_PARTIAL_INFORMATION  Partial;
+    NTSTATUS                        status;
+
+    RtlInitAnsiString(&Ansi, Name);
+
+    status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Partial = __RegistryAllocate(FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data) +
+                                 Length);
+
+    status = STATUS_NO_MEMORY;
+    if (Partial == NULL)
+        goto fail2;
+
+    Partial->TitleIndex = 0;
+    Partial->Type = REG_BINARY;
+    Partial->DataLength = Length;
+    RtlCopyMemory(Partial->Data, Buffer, Partial->DataLength);
+
+    status = ZwSetValueKey(Key,
+                           &Unicode,
+                           Partial->TitleIndex,
+                           Partial->Type,
+                           Partial->Data,
+                           Partial->DataLength);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    __RegistryFree(Partial);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    return STATUS_SUCCESS;
+
+fail3:
+    __RegistryFree(Partial);
+
+fail2:
+    RtlFreeUnicodeString(&Unicode);
+
+fail1:
+
+    return status;
+}
+
+NTSTATUS
 RegistryQueryKeyName(
     IN  HANDLE              Key,
     OUT PANSI_STRING        *Array
@@ -1156,13 +1300,12 @@ NTSTATUS
 RegistryUpdateSzValue(
     IN  HANDLE                      Key,
     IN  PCHAR                       Name,
-    IN  ULONG                       Type,
-    ...
+    IN  PANSI_STRING                Array
     )
 {
     ANSI_STRING                     Ansi;
     UNICODE_STRING                  Unicode;
-    va_list                         Arguments;
+    ULONG                           Type;
     PKEY_VALUE_PARTIAL_INFORMATION  Partial;
     NTSTATUS                        status;
 
@@ -1171,33 +1314,25 @@ RegistryUpdateSzValue(
     status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
     if (!NT_SUCCESS(status))
         goto fail1;
-        
-    va_start(Arguments, Type);
-    switch (Type) {
-    case REG_SZ: {
-        PANSI_STRING    Argument;
 
-        Argument = va_arg(Arguments, PANSI_STRING);
+    Type = (Array[1].Buffer != NULL) ? REG_MULTI_SZ : REG_SZ;
 
+    switch (Type) {
+    case REG_SZ:
         status = STATUS_NO_MEMORY;
-        Partial = RegistryAnsiToSz(Argument);        
+        Partial = RegistryAnsiToSz(Array);
         break;
-    }
-    case REG_MULTI_SZ: {
-        PANSI_STRING    Argument;
-
-        Argument = va_arg(Arguments, PANSI_STRING);
 
+    case REG_MULTI_SZ:
         status = STATUS_NO_MEMORY;
-        Partial = RegistryAnsiToMultiSz(Argument);        
+        Partial = RegistryAnsiToMultiSz(Array);
         break;
-    }
+
     default:
         status = STATUS_INVALID_PARAMETER;
         Partial = NULL;
         break;
     }
-    va_end(Arguments);
 
     if (Partial == NULL)
         goto fail2;
@@ -1244,6 +1379,14 @@ RegistryFreeSzValue(
 }
 
 VOID
+RegistryFreeBinaryValue(
+    IN  PVOID   Buffer
+    )
+{
+    __RegistryFree(Buffer);
+}
+
+VOID
 RegistryCloseKey(
     IN  HANDLE  Key
     )
diff --git a/src/common/registry.h b/src/common/registry.h
index 3920b6d..06e9bd6 100644
--- a/src/common/registry.h
+++ b/src/common/registry.h
@@ -96,7 +96,8 @@ RegistryOpenSubKey(
 extern NTSTATUS
 RegistryCreateSubKey(
     IN  HANDLE      Key,
-    IN  PCHAR       Name,    IN  ULONG       Options,
+    IN  PCHAR       Name,
+    IN  ULONG       Options,
     OUT PHANDLE     SubKey
     );
 
@@ -109,14 +110,14 @@ RegistryDeleteSubKey(
 extern NTSTATUS
 RegistryEnumerateSubKeys(
     IN  HANDLE      Key,
-    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PANSI_STRING),
     IN  PVOID       Context
     );
 
 extern NTSTATUS
 RegistryEnumerateValues(
     IN  HANDLE      Key,
-    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
     IN  PVOID       Context
     );
 
@@ -148,6 +149,22 @@ RegistryQuerySzValue(
     );
 
 extern NTSTATUS
+RegistryQueryBinaryValue(
+    IN  HANDLE          Key,
+    IN  PCHAR           Name,
+    OUT PVOID           *Buffer,
+    OUT PULONG          Length
+    );
+
+extern NTSTATUS
+RegistryUpdateBinaryValue(
+    IN  HANDLE          Key,
+    IN  PCHAR           Name,
+    IN  PVOID           Buffer,
+    IN  ULONG           Length
+    );
+
+extern NTSTATUS
 RegistryQueryKeyName(
     IN  HANDLE              Key,
     OUT PANSI_STRING        *Array
@@ -164,12 +181,16 @@ RegistryFreeSzValue(
     IN  PANSI_STRING    Array
     );
 
+extern VOID
+RegistryFreeBinaryValue(
+    IN  PVOID           Buffer
+    );
+
 extern NTSTATUS
 RegistryUpdateSzValue(
     IN  HANDLE          Key,
     IN  PCHAR           Name,
-    IN  ULONG           Type,
-    ...
+    IN  PANSI_STRING    Array
     );
 
 extern VOID
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:51:43 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:51:43 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwJ5-0004l0-Pd; Wed, 22 Jul 2015 15:51:43 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwJ4-0004k6-2R
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:51:42 +0000
Received: from [193.109.254.147] by server-4.bemta-14.messagelabs.com id
	22/4B-27764-D0CBFA55; Wed, 22 Jul 2015 15:51:41 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1437580300!22937086!1
X-Originating-IP: [209.85.212.170]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7970 invoked from network); 22 Jul 2015 15:51:40 -0000
Received: from mail-wi0-f170.google.com (HELO mail-wi0-f170.google.com)
	(209.85.212.170)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:51:40 -0000
Received: by wicmv11 with SMTP id mv11so87425085wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:51:40 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=yAQZnuIYbT8cOezSBjBo95X0N0kCozdUvMvxJZnehlo=;
	b=K3ysm29JxaGBnmgSukEctWic/iGHWbqEr/DGoQU/3JcRz9ofXMHJXEI//K+YfW1SfW
	m4SlE6XGINN9BLHLbPU02JRcwPpQC5/W06AizQibH8sohwo59dHqn0AAACbAcpsCVwxk
	MiM2C88W/QOe+6bufVtv8nUTu5VOzwrknsGMqnjwrzpq5tKOXRyCSWik8uSVj/2iUnV6
	mx+Suf3fFqlAEYfD3xYjl3LiUZCwhbpnEQ4NOZe8kiTugIU10H5wuX0CWopm8MJXN/Er
	YPmWsQyYTrIUiGoaV35OafyiC2OnZt+5pohTG+vd1BHSY/LSNTVlOodZsjSIdqjZ0DAS
	Is6A==
X-Received: by 10.181.12.111 with SMTP id ep15mr7487110wid.15.1437580300115;
	Wed, 22 Jul 2015 08:51:40 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	bg6sm3015292wjc.13.2015.07.22.08.51.39
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:51:39 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:51:30 +0100
Message-Id: <1437580291-5576-3-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437580291-5576-1-git-send-email-paul.durrant@citrix.com>
References: <1437580291-5576-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 3/4] Move friendly name setting into driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

XENBUS can set the friendly name directly in the device hardware key at
the end of FDO creation.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 152 ----------------------------------------------------
 src/xenbus/fdo.c    |  85 +++++++++++++++++++++++++++++
 2 files changed, 85 insertions(+), 152 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 5e6f719..755eb06 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -752,76 +752,6 @@ fail1:
     return FALSE;
 }
 
-static PTCHAR
-GetProperty(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData,
-    IN  DWORD               Index
-    )
-{
-    DWORD                   Type;
-    DWORD                   PropertyLength;
-    PTCHAR                  Property;
-    HRESULT                 Error;
-
-    if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          Index,
-                                          &Type,
-                                          NULL,
-                                          0,
-                                          &PropertyLength)) {
-        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
-            goto fail1;
-    }
-
-    if (Type != REG_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail2;
-    }
-
-    PropertyLength += sizeof (TCHAR);
-
-    Property = calloc(1, PropertyLength);
-    if (Property == NULL)
-        goto fail3;
-
-    if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          Index,
-                                          NULL,
-                                          (PBYTE)Property,
-                                          PropertyLength,
-                                          NULL))
-        goto fail4;
-
-    return Property;
-
-fail4:
-    Log("fail4");
-
-    free(Property);
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
 static BOOLEAN
 MatchExistingDriver(
     VOID
@@ -1441,81 +1371,6 @@ fail1:
     return FALSE;
 }
 
-static BOOLEAN
-SetFriendlyName(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData,
-    IN  PTCHAR              DeviceID
-    )
-{
-    PTCHAR                  Description;
-    unsigned int            Value;
-    TCHAR                   FriendlyName[MAX_PATH];
-    DWORD                   FriendlyNameLength;
-    HRESULT                 Result;
-    HRESULT                 Error;
-
-    Description = GetProperty(DeviceInfoSet,
-                              DeviceInfoData,
-                              SPDRP_DEVICEDESC);
-    if (Description == NULL)
-        goto fail1;
-
-    if (sscanf_s(DeviceID,
-                 "PCI\\VEN_5853&DEV_%x",
-                 &Value) != 1) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail2;
-    }
-
-    Result = StringCbPrintf(FriendlyName,
-                            MAX_PATH,
-                            "%s (%04X)",
-                            Description,
-                            Value);
-    if (!SUCCEEDED(Result))
-        goto fail3;
-
-    FriendlyNameLength = (DWORD)(strlen(FriendlyName) + sizeof (TCHAR));
-
-    if (!SetupDiSetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          SPDRP_FRIENDLYNAME,
-                                          (PBYTE)FriendlyName,
-                                          FriendlyNameLength))
-        goto fail4;
-
-    Log("%s", FriendlyName);
-
-    free(Description);
-
-    return TRUE;
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    free(Description);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
 static HRESULT
 DifInstallPreProcess(
     IN  HDEVINFO                    DeviceInfoSet,
@@ -1583,10 +1438,6 @@ DifInstallPostProcess(
     if (!Success)
         goto fail1;
 
-    Success = SetFriendlyName(DeviceInfoSet, DeviceInfoData, DeviceID);
-    if (!Success)
-        goto fail2;
-
     NeedReboot = FALSE;
 
     (VOID) CheckStatus("XEN", &NeedReboot);
@@ -1603,9 +1454,6 @@ DifInstallPostProcess(
 
     return NO_ERROR;
 
-fail2:
-    Log("fail2");
-
 fail1:
     Error = GetLastError();
 
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index fdb394d..01ffdc3 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -687,6 +687,89 @@ __FdoIsActive(
     return Fdo->Active;
 }
 
+static NTSTATUS
+FdoSetFriendlyName(
+    IN  PXENBUS_FDO Fdo,
+    IN  USHORT      DeviceID
+    )
+{
+    HANDLE          SoftwareKey;
+    HANDLE          HardwareKey;
+    PANSI_STRING    DriverDesc;
+    CHAR            Buffer[MAXNAMELEN];
+    ANSI_STRING     FriendlyName[2];
+    NTSTATUS        status;
+
+    status = RegistryOpenSoftwareKey(__FdoGetPhysicalDeviceObject(Fdo),
+                                     KEY_READ,
+                                     &SoftwareKey);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = RegistryOpenHardwareKey(__FdoGetPhysicalDeviceObject(Fdo),
+                                     KEY_ALL_ACCESS,
+                                     &HardwareKey);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = RegistryQuerySzValue(SoftwareKey,
+                                  "DriverDesc",
+                                  &DriverDesc);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = RtlStringCbPrintfA(Buffer,
+                                MAXNAMELEN,
+                                "%Z (%04X)",
+                                &DriverDesc[0],
+                                DeviceID
+                                );
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    RtlZeroMemory(FriendlyName, sizeof (ANSI_STRING) * 2);
+    RtlInitAnsiString(&FriendlyName[0], Buffer);
+
+    status = RegistryUpdateSzValue(HardwareKey,
+                                   "FriendlyName",
+                                   FriendlyName);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    Info("%Z\n", &FriendlyName[0]);
+
+    RegistryFreeSzValue(DriverDesc);
+
+    RegistryCloseKey(HardwareKey);
+
+    RegistryCloseKey(SoftwareKey);
+
+    return STATUS_SUCCESS;
+
+fail5:
+    Error("fail5\n");
+
+fail4:
+    Error("fail4\n");
+
+    RegistryFreeSzValue(DriverDesc);
+
+fail3:
+    Error("fail3\n");
+
+    RegistryCloseKey(HardwareKey);
+
+fail2:
+    Error("fail2\n");
+
+    RegistryCloseKey(SoftwareKey);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
 #define DEFINE_FDO_GET_CONTEXT(_Interface, _Type)               \
 static FORCEINLINE _Type                                        \
 __FdoGet ## _Interface ## Context(                              \
@@ -4829,6 +4912,8 @@ done:
     InitializeListHead(&Dx->ListEntry);
     Fdo->References = 1;
 
+    (VOID) FdoSetFriendlyName(Fdo, Header.DeviceID);
+
     Info("%p (%s) %s\n",
          FunctionDeviceObject,
          __FdoGetName(Fdo),
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:51:43 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:51:43 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwJ5-0004l0-Pd; Wed, 22 Jul 2015 15:51:43 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwJ4-0004k6-2R
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:51:42 +0000
Received: from [193.109.254.147] by server-4.bemta-14.messagelabs.com id
	22/4B-27764-D0CBFA55; Wed, 22 Jul 2015 15:51:41 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1437580300!22937086!1
X-Originating-IP: [209.85.212.170]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7970 invoked from network); 22 Jul 2015 15:51:40 -0000
Received: from mail-wi0-f170.google.com (HELO mail-wi0-f170.google.com)
	(209.85.212.170)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:51:40 -0000
Received: by wicmv11 with SMTP id mv11so87425085wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:51:40 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=yAQZnuIYbT8cOezSBjBo95X0N0kCozdUvMvxJZnehlo=;
	b=K3ysm29JxaGBnmgSukEctWic/iGHWbqEr/DGoQU/3JcRz9ofXMHJXEI//K+YfW1SfW
	m4SlE6XGINN9BLHLbPU02JRcwPpQC5/W06AizQibH8sohwo59dHqn0AAACbAcpsCVwxk
	MiM2C88W/QOe+6bufVtv8nUTu5VOzwrknsGMqnjwrzpq5tKOXRyCSWik8uSVj/2iUnV6
	mx+Suf3fFqlAEYfD3xYjl3LiUZCwhbpnEQ4NOZe8kiTugIU10H5wuX0CWopm8MJXN/Er
	YPmWsQyYTrIUiGoaV35OafyiC2OnZt+5pohTG+vd1BHSY/LSNTVlOodZsjSIdqjZ0DAS
	Is6A==
X-Received: by 10.181.12.111 with SMTP id ep15mr7487110wid.15.1437580300115;
	Wed, 22 Jul 2015 08:51:40 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	bg6sm3015292wjc.13.2015.07.22.08.51.39
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:51:39 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:51:30 +0100
Message-Id: <1437580291-5576-3-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437580291-5576-1-git-send-email-paul.durrant@citrix.com>
References: <1437580291-5576-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 3/4] Move friendly name setting into driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

XENBUS can set the friendly name directly in the device hardware key at
the end of FDO creation.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 152 ----------------------------------------------------
 src/xenbus/fdo.c    |  85 +++++++++++++++++++++++++++++
 2 files changed, 85 insertions(+), 152 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 5e6f719..755eb06 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -752,76 +752,6 @@ fail1:
     return FALSE;
 }
 
-static PTCHAR
-GetProperty(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData,
-    IN  DWORD               Index
-    )
-{
-    DWORD                   Type;
-    DWORD                   PropertyLength;
-    PTCHAR                  Property;
-    HRESULT                 Error;
-
-    if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          Index,
-                                          &Type,
-                                          NULL,
-                                          0,
-                                          &PropertyLength)) {
-        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
-            goto fail1;
-    }
-
-    if (Type != REG_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail2;
-    }
-
-    PropertyLength += sizeof (TCHAR);
-
-    Property = calloc(1, PropertyLength);
-    if (Property == NULL)
-        goto fail3;
-
-    if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          Index,
-                                          NULL,
-                                          (PBYTE)Property,
-                                          PropertyLength,
-                                          NULL))
-        goto fail4;
-
-    return Property;
-
-fail4:
-    Log("fail4");
-
-    free(Property);
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
 static BOOLEAN
 MatchExistingDriver(
     VOID
@@ -1441,81 +1371,6 @@ fail1:
     return FALSE;
 }
 
-static BOOLEAN
-SetFriendlyName(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData,
-    IN  PTCHAR              DeviceID
-    )
-{
-    PTCHAR                  Description;
-    unsigned int            Value;
-    TCHAR                   FriendlyName[MAX_PATH];
-    DWORD                   FriendlyNameLength;
-    HRESULT                 Result;
-    HRESULT                 Error;
-
-    Description = GetProperty(DeviceInfoSet,
-                              DeviceInfoData,
-                              SPDRP_DEVICEDESC);
-    if (Description == NULL)
-        goto fail1;
-
-    if (sscanf_s(DeviceID,
-                 "PCI\\VEN_5853&DEV_%x",
-                 &Value) != 1) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail2;
-    }
-
-    Result = StringCbPrintf(FriendlyName,
-                            MAX_PATH,
-                            "%s (%04X)",
-                            Description,
-                            Value);
-    if (!SUCCEEDED(Result))
-        goto fail3;
-
-    FriendlyNameLength = (DWORD)(strlen(FriendlyName) + sizeof (TCHAR));
-
-    if (!SetupDiSetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          SPDRP_FRIENDLYNAME,
-                                          (PBYTE)FriendlyName,
-                                          FriendlyNameLength))
-        goto fail4;
-
-    Log("%s", FriendlyName);
-
-    free(Description);
-
-    return TRUE;
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    free(Description);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
 static HRESULT
 DifInstallPreProcess(
     IN  HDEVINFO                    DeviceInfoSet,
@@ -1583,10 +1438,6 @@ DifInstallPostProcess(
     if (!Success)
         goto fail1;
 
-    Success = SetFriendlyName(DeviceInfoSet, DeviceInfoData, DeviceID);
-    if (!Success)
-        goto fail2;
-
     NeedReboot = FALSE;
 
     (VOID) CheckStatus("XEN", &NeedReboot);
@@ -1603,9 +1454,6 @@ DifInstallPostProcess(
 
     return NO_ERROR;
 
-fail2:
-    Log("fail2");
-
 fail1:
     Error = GetLastError();
 
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index fdb394d..01ffdc3 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -687,6 +687,89 @@ __FdoIsActive(
     return Fdo->Active;
 }
 
+static NTSTATUS
+FdoSetFriendlyName(
+    IN  PXENBUS_FDO Fdo,
+    IN  USHORT      DeviceID
+    )
+{
+    HANDLE          SoftwareKey;
+    HANDLE          HardwareKey;
+    PANSI_STRING    DriverDesc;
+    CHAR            Buffer[MAXNAMELEN];
+    ANSI_STRING     FriendlyName[2];
+    NTSTATUS        status;
+
+    status = RegistryOpenSoftwareKey(__FdoGetPhysicalDeviceObject(Fdo),
+                                     KEY_READ,
+                                     &SoftwareKey);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = RegistryOpenHardwareKey(__FdoGetPhysicalDeviceObject(Fdo),
+                                     KEY_ALL_ACCESS,
+                                     &HardwareKey);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = RegistryQuerySzValue(SoftwareKey,
+                                  "DriverDesc",
+                                  &DriverDesc);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = RtlStringCbPrintfA(Buffer,
+                                MAXNAMELEN,
+                                "%Z (%04X)",
+                                &DriverDesc[0],
+                                DeviceID
+                                );
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    RtlZeroMemory(FriendlyName, sizeof (ANSI_STRING) * 2);
+    RtlInitAnsiString(&FriendlyName[0], Buffer);
+
+    status = RegistryUpdateSzValue(HardwareKey,
+                                   "FriendlyName",
+                                   FriendlyName);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    Info("%Z\n", &FriendlyName[0]);
+
+    RegistryFreeSzValue(DriverDesc);
+
+    RegistryCloseKey(HardwareKey);
+
+    RegistryCloseKey(SoftwareKey);
+
+    return STATUS_SUCCESS;
+
+fail5:
+    Error("fail5\n");
+
+fail4:
+    Error("fail4\n");
+
+    RegistryFreeSzValue(DriverDesc);
+
+fail3:
+    Error("fail3\n");
+
+    RegistryCloseKey(HardwareKey);
+
+fail2:
+    Error("fail2\n");
+
+    RegistryCloseKey(SoftwareKey);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
 #define DEFINE_FDO_GET_CONTEXT(_Interface, _Type)               \
 static FORCEINLINE _Type                                        \
 __FdoGet ## _Interface ## Context(                              \
@@ -4829,6 +4912,8 @@ done:
     InitializeListHead(&Dx->ListEntry);
     Fdo->References = 1;
 
+    (VOID) FdoSetFriendlyName(Fdo, Header.DeviceID);
+
     Info("%p (%s) %s\n",
          FunctionDeviceObject,
          __FdoGetName(Fdo),
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:51:43 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:51:43 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwJ5-0004l8-Qy; Wed, 22 Jul 2015 15:51:43 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwJ4-0004kB-8T
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:51:42 +0000
Received: from [85.158.139.211] by server-6.bemta-5.messagelabs.com id
	12/45-17254-D0CBFA55; Wed, 22 Jul 2015 15:51:41 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-206.messagelabs.com!1437580301!22935157!1
X-Originating-IP: [209.85.212.169]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30093 invoked from network); 22 Jul 2015 15:51:41 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-2.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:51:41 -0000
Received: by wibxm9 with SMTP id xm9so169664459wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:51:41 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=OVgpvflmMi85mn5AzGNKmz62ZDjKl0LbZ06PMp5eexE=;
	b=Mg6TB0bkjklyIUPh3kSJa4jVEhyrTOl77ESQnVeGx4NWTBQ6G0vOuzR7TuFzp5+J8N
	AKXiRG5JGvpQnCZQjPoX/OTXDer3pBr4gcYRYH9pXVhHzQkdu3/VSZQq8REUEm1A+1hh
	RshoCkjX8zmREsx970YleMBmvTJfxAqt4O4US3mhhCuLLUjDb4rf//ZLdkYZB/Du+6M6
	CeSsMU7Dy/nHE3toJPB0waNFBtk8vS4I/Ma801keDc0hRt1ObJPgf/00/Zqe8plIZMql
	2wtaCtrUm1CPFheQGBP8leSX8To0QCwonoJIVVnOV1jKRTvNQDlkaVs5TPVB3CTQo/ZZ
	Inxg==
X-Received: by 10.194.246.105 with SMTP id xv9mr6331599wjc.135.1437580300993; 
	Wed, 22 Jul 2015 08:51:40 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	bg6sm3015292wjc.13.2015.07.22.08.51.40
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:51:40 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:51:31 +0100
Message-Id: <1437580291-5576-4-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437580291-5576-1-git-send-email-paul.durrant@citrix.com>
References: <1437580291-5576-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 4/4] Add a missing newline in to a logging
	message
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenfilt/emulated.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/xenfilt/emulated.c b/src/xenfilt/emulated.c
index 31391ed..9cb656a 100644
--- a/src/xenfilt/emulated.c
+++ b/src/xenfilt/emulated.c
@@ -316,7 +316,7 @@ EmulatedIsDiskPresent(
             Controller == EmulatedObject->Data.Disk.Controller &&
             Target == EmulatedObject->Data.Disk.Target &&
             Lun == EmulatedObject->Data.Disk.Lun) {
-            Trace("FOUND");
+            Trace("FOUND\n");
             break;
         }
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:51:43 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:51:43 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwJ5-0004l8-Qy; Wed, 22 Jul 2015 15:51:43 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwJ4-0004kB-8T
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:51:42 +0000
Received: from [85.158.139.211] by server-6.bemta-5.messagelabs.com id
	12/45-17254-D0CBFA55; Wed, 22 Jul 2015 15:51:41 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-206.messagelabs.com!1437580301!22935157!1
X-Originating-IP: [209.85.212.169]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30093 invoked from network); 22 Jul 2015 15:51:41 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-2.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:51:41 -0000
Received: by wibxm9 with SMTP id xm9so169664459wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:51:41 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=OVgpvflmMi85mn5AzGNKmz62ZDjKl0LbZ06PMp5eexE=;
	b=Mg6TB0bkjklyIUPh3kSJa4jVEhyrTOl77ESQnVeGx4NWTBQ6G0vOuzR7TuFzp5+J8N
	AKXiRG5JGvpQnCZQjPoX/OTXDer3pBr4gcYRYH9pXVhHzQkdu3/VSZQq8REUEm1A+1hh
	RshoCkjX8zmREsx970YleMBmvTJfxAqt4O4US3mhhCuLLUjDb4rf//ZLdkYZB/Du+6M6
	CeSsMU7Dy/nHE3toJPB0waNFBtk8vS4I/Ma801keDc0hRt1ObJPgf/00/Zqe8plIZMql
	2wtaCtrUm1CPFheQGBP8leSX8To0QCwonoJIVVnOV1jKRTvNQDlkaVs5TPVB3CTQo/ZZ
	Inxg==
X-Received: by 10.194.246.105 with SMTP id xv9mr6331599wjc.135.1437580300993; 
	Wed, 22 Jul 2015 08:51:40 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	bg6sm3015292wjc.13.2015.07.22.08.51.40
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:51:40 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:51:31 +0100
Message-Id: <1437580291-5576-4-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437580291-5576-1-git-send-email-paul.durrant@citrix.com>
References: <1437580291-5576-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 4/4] Add a missing newline in to a logging
	message
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenfilt/emulated.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/xenfilt/emulated.c b/src/xenfilt/emulated.c
index 31391ed..9cb656a 100644
--- a/src/xenfilt/emulated.c
+++ b/src/xenfilt/emulated.c
@@ -316,7 +316,7 @@ EmulatedIsDiskPresent(
             Controller == EmulatedObject->Data.Disk.Controller &&
             Target == EmulatedObject->Data.Disk.Target &&
             Lun == EmulatedObject->Data.Disk.Lun) {
-            Trace("FOUND");
+            Trace("FOUND\n");
             break;
         }
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:51:45 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:51:45 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwJ7-0004mh-Su; Wed, 22 Jul 2015 15:51:45 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwJ6-0004kz-3d
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:51:44 +0000
Received: from [85.158.137.68] by server-3.bemta-3.messagelabs.com id
	3A/26-03035-F0CBFA55; Wed, 22 Jul 2015 15:51:43 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-11.tower-31.messagelabs.com!1437580299!28327177!1
X-Originating-IP: [209.85.212.175]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21307 invoked from network); 22 Jul 2015 15:51:39 -0000
Received: from mail-wi0-f175.google.com (HELO mail-wi0-f175.google.com)
	(209.85.212.175)
	by server-11.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:51:39 -0000
Received: by wibxm9 with SMTP id xm9so109206555wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:51:39 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=W0RPev/sP01CHttHaJyyucIAV2Zr4UaTpug5T3miVMI=;
	b=iPhjXnD60JaVNO92YmT3Cm6RQ9DHPlixMiM/lpOC6+DpOjQmsQxat97qiJyYoW9erJ
	0uFrXohPLGok3e1pPPwU6XLtz5bqdI9sYPOyFfWglRphwygTO20M5y3yoPw863IL+p8d
	3JIAjko9qKE74JfsMoF0efI3nFxuyckz+k0f/OJzYL6xQHiHP8ypHZwr9E1l1JL4gkuP
	sPD9aABLbzNusABP0gM3Ic/va3JbXofZJGcBZ+abJGSiV54KeP8n9RTAGtC8gTlxNsBi
	x0aiREHyoKzKlacoN9N6JtF93pMYSRGN8AfaXwRRKaG/4wiM5uGp8806aA6LsFB4mZyC
	aEBw==
X-Received: by 10.180.20.15 with SMTP id j15mr7783697wie.76.1437580299263;
	Wed, 22 Jul 2015 08:51:39 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	bg6sm3015292wjc.13.2015.07.22.08.51.37
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:51:38 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:51:29 +0100
Message-Id: <1437580291-5576-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437580291-5576-1-git-send-email-paul.durrant@citrix.com>
References: <1437580291-5576-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/4] Move filter installation and active
	device selection logic into drivers
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

When XENBUS creates its FDO object it will query up to XENFILT for a new
PDEVICE interface. This is used for getting/setting the active device
instance.

If the query fails then it is taken to mean that XENFILT has not been
installed into the system class UpperFilters and so this is done, and a
reboot requested (the FDO creation succeeding but remaining inactive).

If the query succeeds then the code attempts to get the active device
instance. If that succeeds then then the FDO identity is checked to see if
it should be active. If, however, it fails then the code attempts to
claim the active device instance.

When XENBUS destroys its FDO object then the active device instance is
cleared (if the FDO was active) and XENFILT is removed from UpperFilters.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/pvdevice_interface.h   | 132 +++++++++
 src/coinst/coinst.c            | 651 ++++-------------------------------------
 src/xen/driver.c               | 136 ++++++---
 src/xenbus/driver.c            | 314 ++++----------------
 src/xenbus/driver.h            |  15 +
 src/xenbus/fdo.c               | 298 ++++++++++++++++---
 src/xenbus/fdo.h               |   3 +-
 src/xenbus/filters.c           | 319 ++++++++++++++++++++
 src/xenbus/filters.h           |  45 +++
 src/xenbus/pdo.c               |   2 +-
 src/xenfilt/driver.c           | 273 ++++++-----------
 src/xenfilt/driver.h           |  21 +-
 src/xenfilt/emulated.c         |  39 +--
 src/xenfilt/emulated.h         |   4 +-
 src/xenfilt/fdo.c              |  75 ++---
 src/xenfilt/fdo.h              |   9 +-
 src/xenfilt/pdo.c              | 131 +++++----
 src/xenfilt/pdo.h              |   4 +-
 src/xenfilt/pvdevice.c         | 439 +++++++++++++++++++++++++++
 src/xenfilt/pvdevice.h         |  59 ++++
 vs2012/xenbus/xenbus.vcxproj   |   1 +
 vs2012/xenfilt/xenfilt.vcxproj |   1 +
 vs2013/xenbus/xenbus.vcxproj   |   1 +
 vs2013/xenfilt/xenfilt.vcxproj |   1 +
 24 files changed, 1726 insertions(+), 1247 deletions(-)
 create mode 100644 include/pvdevice_interface.h
 create mode 100644 src/xenbus/filters.c
 create mode 100644 src/xenbus/filters.h
 create mode 100644 src/xenfilt/pvdevice.c
 create mode 100644 src/xenfilt/pvdevice.h

diff --git a/include/pvdevice_interface.h b/include/pvdevice_interface.h
new file mode 100644
index 0000000..9024396
--- /dev/null
+++ b/include/pvdevice_interface.h
@@ -0,0 +1,132 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*! \file pvdevice_interface.h
+    \brief XENFILT PVDEVICE Interface
+
+    This interface provides primitives to determine whether a pvdevice
+    device is active (and claim the active device id if not)
+*/
+
+#ifndef _XENFILT_PVDEVICE_INTERFACE_H
+#define _XENFILT_PVDEVICE_INTERFACE_H
+
+#ifndef _WINDLL
+
+/*! \typedef XENFILT_PVDEVICE_ACQUIRE
+    \brief Acquire a reference to the PVDEVICE interface
+
+    \param Interface The interface header
+*/
+typedef NTSTATUS
+(*XENFILT_PVDEVICE_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENFILT_PVDEVICE_RELEASE
+    \brief Release a reference to the PVDEVICE interface
+
+    \param Interface The interface header
+*/
+typedef VOID
+(*XENFILT_PVDEVICE_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENFILT_PVDEVICE_GET_ACTIVE
+    \brief Get the active device instance
+
+    \param Interface The interface header
+    \param DeviceID A buffer of length MAXNAMELEN to receive the device id
+    \param InstanceID A buffer of length MAXNAMELEN to receive the instance id
+*/
+typedef NTSTATUS
+(*XENFILT_PVDEVICE_GET_ACTIVE)(
+    IN  PVOID   Context,
+    OUT PCHAR   DeviceID,
+    OUT PCHAR   InstanceID
+    );
+
+/*! \typedef XENFILT_PVDEVICE_SET_ACTIVE
+    \brief Set the active device instance
+
+    \param Interface The interface header
+    \param DeviceID Buffer containing the device id
+    \param InstanceID Buffer containing the instance id
+*/
+typedef NTSTATUS
+(*XENFILT_PVDEVICE_SET_ACTIVE)(
+    IN  PVOID   Context,
+    IN  PCHAR   DeviceID,
+    IN  PCHAR   InstanceID
+    );
+
+/*! \typedef XENFILT_PVDEVICE_CLEAR_ACTIVE
+    \brief Clear the active device instance
+
+    \param Interface The interface header
+*/
+typedef NTSTATUS
+(*XENFILT_PVDEVICE_CLEAR_ACTIVE)(
+    IN  PVOID   Context
+    );
+
+// {7d09b250-898f-4fea-b7fa-e0490e46f95f}
+DEFINE_GUID(GUID_XENFILT_PVDEVICE_INTERFACE,
+0x7d09b250, 0x898f, 0x4fea, 0xb7, 0xfa, 0xe0, 0x49, 0x0e, 0x46, 0xf9, 0x5f);
+
+/*! \struct _XENFILT_PVDEVICE_INTERFACE_V1
+    \brief PVDEVICE interface version 1
+    \ingroup interfaces
+*/
+struct _XENFILT_PVDEVICE_INTERFACE_V1 {
+    INTERFACE                       Interface;
+    XENFILT_PVDEVICE_ACQUIRE        PvdeviceAcquire;
+    XENFILT_PVDEVICE_RELEASE        PvdeviceRelease;
+    XENFILT_PVDEVICE_GET_ACTIVE     PvdeviceGetActive;
+    XENFILT_PVDEVICE_SET_ACTIVE     PvdeviceSetActive;
+    XENFILT_PVDEVICE_CLEAR_ACTIVE   PvdeviceClearActive;
+};
+
+typedef struct _XENFILT_PVDEVICE_INTERFACE_V1 XENFILT_PVDEVICE_INTERFACE, *PXENFILT_PVDEVICE_INTERFACE;
+
+/*! \def XENFILT_PVDEVICE
+    \brief Macro at assist in method invocation
+*/
+#define XENFILT_PVDEVICE(_Method, _Interface, ...)    \
+    (_Interface)->Pvdevice ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENFILT_PVDEVICE_INTERFACE_VERSION_MIN  1
+#define XENFILT_PVDEVICE_INTERFACE_VERSION_MAX  1
+
+#endif  // _XENFILT_PVDEVICE_INTERFACE_H
diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 2b980a1..5e6f719 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -49,12 +49,6 @@ __user_code;
 
 #define SERVICES_KEY "SYSTEM\\CurrentControlSet\\Services"
 
-#define SERVICE_KEY(_Driver)    \
-        SERVICES_KEY ## "\\" ## #_Driver
-
-#define PARAMETERS_KEY(_Driver) \
-        SERVICE_KEY(_Driver) ## "\\Parameters"
-
 #define CONTROL_KEY "SYSTEM\\CurrentControlSet\\Control"
 
 #define CLASS_KEY   \
@@ -758,289 +752,6 @@ fail1:
     return FALSE;
 }
 
-static BOOLEAN
-GetActiveDeviceInstanceID(
-    OUT PTCHAR  *DeviceID,
-    OUT PTCHAR  *InstanceID
-    )
-{
-    HKEY        ParametersKey;
-    DWORD       MaxValueLength;
-    DWORD       DeviceIDLength;
-    DWORD       InstanceIDLength;
-    DWORD       Type;
-    HRESULT     Error;
-
-    Error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
-                           PARAMETERS_KEY(XENBUS),
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &ParametersKey,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Error = RegQueryInfoKey(ParametersKey,
-                            NULL,
-                            NULL,
-                            NULL,    
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            &MaxValueLength,
-                            NULL,
-                            NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-       
-    DeviceIDLength = MaxValueLength + sizeof (TCHAR);
-
-    *DeviceID = calloc(1, DeviceIDLength);
-    if (*DeviceID == NULL)
-        goto fail3;
-
-    Error = RegQueryValueEx(ParametersKey,
-                            "ActiveDeviceID",
-                            NULL,
-                            &Type,
-                            (LPBYTE)*DeviceID,
-                            &DeviceIDLength);
-    if (Error != ERROR_SUCCESS || Type != REG_SZ) {
-        free(*DeviceID);
-        *DeviceID = NULL;
-    }
-
-    InstanceIDLength = MaxValueLength + sizeof (TCHAR);
-
-    *InstanceID = calloc(1, InstanceIDLength);
-    if (*InstanceID == NULL)
-        goto fail4;
-
-    Error = RegQueryValueEx(ParametersKey,
-                            "ActiveInstanceID",
-                            NULL,
-                            &Type,
-                            (LPBYTE)*InstanceID,
-                            &InstanceIDLength);
-    if (Error != ERROR_SUCCESS || Type != REG_SZ) {
-        free(*InstanceID);
-        *InstanceID = NULL;
-    }
-
-    Log("DeviceID = %s", (*DeviceID != NULL) ? *DeviceID : "NOT SET");
-    Log("InstanceID = %s", (*InstanceID != NULL) ? *InstanceID : "NOT SET");
-
-    RegCloseKey(ParametersKey);
-
-    return TRUE;
-
-fail4:
-    Log("fail4");
-
-    if (*DeviceID != NULL) {
-        free(*DeviceID);
-        *DeviceID = NULL;
-    }
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(ParametersKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-SetActiveDeviceInstanceID(
-    IN  PTCHAR  DeviceID,
-    IN  PTCHAR  InstanceID
-    )
-{
-    PTCHAR      DeviceName;
-    BOOLEAN     Success;
-    DWORD       DeviceIDLength;
-    DWORD       InstanceIDLength;
-    HKEY        ParametersKey;
-    HRESULT     Error;
-
-    Log("DeviceID = %s", DeviceID);
-    Log("InstanceID = %s", InstanceID);
-
-    DeviceName = strchr(DeviceID, '\\');
-    assert(DeviceName != NULL);
-    DeviceName++;
-
-    // Check whether we are binding to the XenServer vendor device
-    if (strncmp(DeviceName,
-                XENSERVER_VENDOR_DEVICE_NAME,
-                strlen(XENSERVER_VENDOR_DEVICE_NAME)) != 0) {
-        PTCHAR  DeviceKeyName;
-
-        // We are binding to a legacy platform device so only make it
-        // active if there is no XenServer vendor device
-        Success = GetDeviceKeyName("PCI",
-                                   XENSERVER_VENDOR_DEVICE_NAME,
-                                   &DeviceKeyName);
-        if (!Success)
-            goto fail1;
-
-        if (DeviceKeyName != NULL) {
-            Log("ignoring");
-            free(DeviceKeyName);
-            goto done;
-        }
-    }
-
-    DeviceIDLength = (DWORD)((strlen(DeviceID) +
-                              1) * sizeof (TCHAR));
-    InstanceIDLength = (DWORD)((strlen(InstanceID) +
-                                1) * sizeof (TCHAR));
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         PARAMETERS_KEY(XENBUS),
-                         0,
-                         KEY_ALL_ACCESS,
-                         &ParametersKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    Error = RegSetValueEx(ParametersKey,
-                          "ActiveDeviceID",
-                          0,
-                          REG_SZ,
-                          (LPBYTE)DeviceID,
-                          DeviceIDLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    Error = RegSetValueEx(ParametersKey,
-                          "ActiveInstanceID",
-                          0,
-                          REG_SZ,
-                          (LPBYTE)InstanceID,
-                          InstanceIDLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail4;
-    }
-
-    RegCloseKey(ParametersKey);
-
-done:
-    return TRUE;
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-    RegCloseKey(ParametersKey);
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-ClearActiveDeviceInstanceID(
-    VOID
-    )
-{
-    HKEY        ParametersKey;
-    HRESULT     Error;
-
-    Log("<===>");
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         PARAMETERS_KEY(XENBUS),
-                         0,
-                         KEY_ALL_ACCESS,
-                         &ParametersKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Error = RegDeleteValue(ParametersKey,
-                           "ActiveDeviceID");
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    Error = RegDeleteValue(ParametersKey,
-                           "ActiveInstanceID");
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    RegCloseKey(ParametersKey);
-
-    return TRUE;
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(ParametersKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
 static PTCHAR
 GetProperty(
     IN  HDEVINFO            DeviceInfoSet,
@@ -1604,217 +1315,80 @@ fail1:
 }
 
 static BOOLEAN
-InstallFilter(
-    IN  const GUID  *Guid,
-    IN  PTCHAR      Filter
+CheckStatus(
+    IN  PTCHAR      DriverName,
+    OUT PBOOLEAN    NeedReboot
     )
 {
+    TCHAR           StatusKeyName[MAX_PATH];
+    HKEY            StatusKey;
+    HRESULT         Result;
     HRESULT         Error;
+    DWORD           ValueLength;
+    DWORD           Value;
     DWORD           Type;
-    DWORD           OldLength;
-    DWORD           NewLength;
-    PTCHAR          UpperFilters;
-    ULONG           Offset;
-
-    if (!SetupDiGetClassRegistryProperty(Guid,
-                                         SPCRP_UPPERFILTERS,
-                                         &Type,
-                                         NULL,
-                                         0,
-                                         &OldLength,
-                                         NULL,
-                                         NULL)) {
-        Error = GetLastError();
-
-        if (Error == ERROR_INVALID_DATA) {
-            Type = REG_MULTI_SZ;
-            OldLength = sizeof (TCHAR);
-        } else if (Error != ERROR_INSUFFICIENT_BUFFER) {
-            goto fail1;
-        }
-    }
-
-    if (Type != REG_MULTI_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail2;
-    }
-
-    NewLength = OldLength + (DWORD)((strlen(Filter) + 1) * sizeof (TCHAR));
-
-    UpperFilters = calloc(1, NewLength);
-    if (UpperFilters == NULL)
-        goto fail3;
-
-    Offset = 0;
-    if (OldLength != sizeof (TCHAR)) {
-        if (!SetupDiGetClassRegistryProperty(Guid,
-                                             SPCRP_UPPERFILTERS,
-                                             &Type,
-                                             (PBYTE)UpperFilters,
-                                             OldLength,
-                                             NULL,
-                                             NULL,
-                                             NULL))
-            goto fail4;
 
-        while (UpperFilters[Offset] != '\0') {
-            ULONG   FilterLength;
-
-            FilterLength = (ULONG)strlen(&UpperFilters[Offset]) / sizeof (TCHAR);
-
-            if (_stricmp(&UpperFilters[Offset], Filter) == 0) {
-                Log("%s already present", Filter);
-                goto done;
-            }
-
-            Offset += FilterLength + 1;
-        }
-    }
-
-    memmove(&UpperFilters[Offset], Filter, strlen(Filter));
-    Log("added %s", Filter);
-
-    if (!SetupDiSetClassRegistryProperty(Guid,
-                                         SPCRP_UPPERFILTERS,
-                                         (PBYTE)UpperFilters,
-                                         NewLength,
-                                         NULL,
-                                         NULL))
-        goto fail5;
-
-done:
-    free(UpperFilters);
-
-    return TRUE;
-
-fail5:
-    Log("fail5");
-
-fail4:
-    Log("fail4");
-
-    free(UpperFilters);
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
+    Result = StringCbPrintf(StatusKeyName,
+                            MAX_PATH,
+                            SERVICES_KEY "\\%s\\Status",
+                            DriverName);
+    assert(SUCCEEDED(Result));
 
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
+    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                         StatusKeyName,
+                         0,
+                         KEY_READ,
+                         &StatusKey);
+    if (Error != ERROR_SUCCESS) {
+        SetLastError(Error);
+        goto fail1;
     }
 
-    return FALSE;
-}
+    ValueLength = sizeof (Value);
 
-static BOOLEAN
-RemoveFilter(
-    IN  const GUID  *Guid,
-    IN  PTCHAR      Filter
-    )
-{
-    HRESULT         Error;
-    DWORD           Type;
-    DWORD           OldLength;
-    DWORD           NewLength;
-    PTCHAR          UpperFilters;
-    ULONG           Offset;
-    ULONG           FilterLength;
-
-    if (!SetupDiGetClassRegistryProperty(Guid,
-                                         SPCRP_UPPERFILTERS,
-                                         &Type,
-                                         NULL,
-                                         0,
-                                         &OldLength,
-                                         NULL,
-                                         NULL)) {
-        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
-            goto fail1;
+    Error = RegQueryValueEx(StatusKey,
+                            "NeedReboot",
+                            NULL,
+                            &Type,
+                            (LPBYTE)&Value,
+                            &ValueLength);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Type = REG_DWORD;
+            Value = 0;
+        } else {
+            SetLastError(Error);
+            goto fail2;
+        }
     }
 
-    if (Type != REG_MULTI_SZ) {
+    if (Type != REG_DWORD) {
         SetLastError(ERROR_BAD_FORMAT);
-        goto fail2;
-    }
-
-    UpperFilters = calloc(1, OldLength);
-    if (UpperFilters == NULL)
         goto fail3;
-
-    if (!SetupDiGetClassRegistryProperty(Guid,
-                                         SPCRP_UPPERFILTERS,
-                                         &Type,
-                                         (PBYTE)UpperFilters,
-                                         OldLength,
-                                         NULL,
-                                         NULL,
-                                         NULL))
-        goto fail4;
-
-    Offset = 0;
-    FilterLength = 0;
-    while (UpperFilters[Offset] != '\0') {
-        FilterLength = (ULONG)strlen(&UpperFilters[Offset]) / sizeof (TCHAR);
-
-        if (_stricmp(&UpperFilters[Offset], Filter) == 0)
-            goto remove;
-
-        Offset += FilterLength + 1;
     }
 
-    goto done;
-
-remove:
-    NewLength = OldLength - ((FilterLength + 1) * sizeof (TCHAR));
+    *NeedReboot = (Value != 0) ? TRUE : FALSE;
 
-    memmove(&UpperFilters[Offset],
-            &UpperFilters[Offset + FilterLength + 1],
-            (NewLength - Offset) * sizeof (TCHAR));
+    if (*NeedReboot)
+        Log("NeedReboot");
 
-    Log("removed %s", Filter);
-
-    if (!SetupDiSetClassRegistryProperty(Guid,
-                                         SPCRP_UPPERFILTERS,
-                                         (PBYTE)UpperFilters,
-                                         NewLength,
-                                         NULL,
-                                         NULL))
-        goto fail5;
-
-done:
-    free(UpperFilters);
+    RegCloseKey(StatusKey);
 
     return TRUE;
 
-fail5:
-    Log("fail5");
-
-fail4:
-    Log("fail4");
-
-    free(UpperFilters);
-
 fail3:
     Log("fail3");
 
 fail2:
     Log("fail2");
 
+    RegCloseKey(StatusKey);
+
 fail1:
     Error = GetLastError();
 
     {
         PTCHAR  Message;
-
         Message = GetErrorMessage(Error);
         Log("fail1 (%s)", Message);
         LocalFree(Message);
@@ -1950,10 +1524,10 @@ DifInstallPreProcess(
     )
 {
     BOOLEAN                         Success;
-    PTCHAR                          DeviceID;
-    PTCHAR                          InstanceID;
     HRESULT                         Error;
 
+    UNREFERENCED_PARAMETER(DeviceInfoSet);
+    UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
     Log("====>");
@@ -1966,42 +1540,10 @@ DifInstallPreProcess(
     if (!Success)
         goto fail2;
 
-    Success = GetActiveDeviceInstanceID(&DeviceID, &InstanceID);
-    if (!Success)
-        goto fail3;
-
-    if (DeviceID == NULL) {
-        assert(InstanceID == NULL);
-
-        Success = GetDeviceInstanceID(DeviceInfoSet, DeviceInfoData,
-                                      &DeviceID, &InstanceID);
-        if (!Success)
-            goto fail4;
-
-        Success = SetActiveDeviceInstanceID(DeviceID, InstanceID);
-        if (!Success)
-            goto fail5;
-    }
-
-    free(DeviceID);
-    free(InstanceID);
-
     Log("<====");
     
     return NO_ERROR;
 
-fail5:
-    Log("fail5");
-
-    free(DeviceID);
-    free(InstanceID);
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
 fail2:
     Log("fail2");
 
@@ -2026,13 +1568,11 @@ DifInstallPostProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
-    HRESULT                         Error;
+    BOOLEAN                         Success;
     PTCHAR                          DeviceID;
     PTCHAR                          InstanceID;
-    PTCHAR                          ActiveDeviceID;
-    PTCHAR                          ActiveInstanceID;
-    BOOLEAN                         Active;
-    BOOLEAN                         Success;
+    BOOLEAN                         NeedReboot;
+    HRESULT                         Error;
 
     UNREFERENCED_PARAMETER(Context);
 
@@ -2047,28 +1587,14 @@ DifInstallPostProcess(
     if (!Success)
         goto fail2;
 
-    Success = GetActiveDeviceInstanceID(&ActiveDeviceID, &ActiveInstanceID);
-    if (!Success)
-        goto fail3;
+    NeedReboot = FALSE;
 
-    if (ActiveDeviceID != NULL) {
-        assert(ActiveInstanceID != NULL);
-        Active = (_stricmp(ActiveDeviceID, DeviceID) == 0 &&
-                  _stricmp(ActiveInstanceID, InstanceID) == 0) ?
-            TRUE :
-            FALSE;
+    (VOID) CheckStatus("XEN", &NeedReboot);
+    if (!NeedReboot)
+        (VOID) CheckStatus("XENBUS", &NeedReboot);
 
-        free(ActiveDeviceID);
-        free(ActiveInstanceID);
-    } else {
-        Active = FALSE;
-    }
-
-    if (Active) {
-        (VOID) InstallFilter(&GUID_DEVCLASS_SYSTEM, "XENFILT");
-        (VOID) InstallFilter(&GUID_DEVCLASS_HDC, "XENFILT");
+    if (NeedReboot)
         (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData);
-    }
 
     free(DeviceID);
     free(InstanceID);
@@ -2077,12 +1603,6 @@ DifInstallPostProcess(
 
     return NO_ERROR;
 
-fail3:
-    Log("fail3");
-
-    free(DeviceID);
-    free(InstanceID);
-
 fail2:
     Log("fail2");
 
@@ -2163,72 +1683,13 @@ DifRemovePreProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
-    BOOLEAN                         Success;
-    PTCHAR                          DeviceID;
-    PTCHAR                          InstanceID;
-    PTCHAR                          ActiveDeviceID;
-    PTCHAR                          ActiveInstanceID;
-    BOOLEAN                         Active;
-    HRESULT                         Error;
-
+    UNREFERENCED_PARAMETER(DeviceInfoSet);
+    UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
-    Log("====>");
-
-    Success = GetDeviceInstanceID(DeviceInfoSet, DeviceInfoData,
-                                  &DeviceID, &InstanceID);
-    if (!Success)
-        goto fail1;
-
-    Success = GetActiveDeviceInstanceID(&ActiveDeviceID, &ActiveInstanceID);
-    if (!Success)
-        goto fail2;
-
-    if (ActiveDeviceID != NULL) {
-        assert(ActiveInstanceID != NULL);
-        Active = (_stricmp(ActiveDeviceID, DeviceID) == 0 &&
-                  _stricmp(ActiveInstanceID, InstanceID) == 0) ?
-            TRUE :
-            FALSE;
-        
-        free(ActiveDeviceID);
-        free(ActiveInstanceID);
-    } else {
-        Active = FALSE;
-    }
-
-    if (Active) {
-        ClearActiveDeviceInstanceID();
-
-        (VOID) RemoveFilter(&GUID_DEVCLASS_HDC, "XENFILT");
-        (VOID) RemoveFilter(&GUID_DEVCLASS_SYSTEM, "XENFILT");
-    }
-
-    free(DeviceID);
-    free(InstanceID);
-
-    Log("<====");
+    Log("<===>");
 
     return NO_ERROR;
-
-fail2:
-    Log("fail2");
-
-    free(DeviceID);
-    free(InstanceID);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return Error;
 }
 
 static HRESULT
diff --git a/src/xen/driver.c b/src/xen/driver.c
index 9662ff6..187fe1c 100644
--- a/src/xen/driver.c
+++ b/src/xen/driver.c
@@ -55,10 +55,73 @@ typedef struct _XEN_DRIVER {
     PLOG_DISPOSITION    TraceDisposition;
     PLOG_DISPOSITION    InfoDisposition;
     HANDLE              UnplugKey;
+    HANDLE              StatusKey;
 } XEN_DRIVER, *PXEN_DRIVER;
 
 static XEN_DRIVER   Driver;
 
+static FORCEINLINE VOID
+__DriverSetUnplugKey(
+    IN  HANDLE  Key
+    )
+{
+    Driver.UnplugKey = Key;
+}
+
+static FORCEINLINE HANDLE
+__DriverGetUnplugKey(
+    VOID
+    )
+{
+    return Driver.UnplugKey;
+}
+
+HANDLE
+DriverGetUnplugKey(
+    VOID
+    )
+{
+    return __DriverGetUnplugKey();
+}
+
+static FORCEINLINE VOID
+__DriverSetStatusKey(
+    IN  HANDLE  Key
+    )
+{
+    Driver.StatusKey = Key;
+}
+
+static FORCEINLINE HANDLE
+__DriverGetStatusKey(
+    VOID
+    )
+{
+    return Driver.StatusKey;
+}
+
+HANDLE
+DriverGetStatusKey(
+    VOID
+    )
+{
+    return __DriverGetStatusKey();
+}
+
+static FORCEINLINE VOID
+__DriverRequestReboot(
+    VOID
+    )
+{
+    Info("<===>\n");
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    (VOID) RegistryUpdateDwordValue(__DriverGetStatusKey(),
+                                    "NeedReboot",
+                                    1);
+}
+
 XEN_API
 NTSTATUS
 XenTouch(
@@ -102,34 +165,11 @@ done:
 
 fail1:
     Info("MODULE '%s' NOT COMPATIBLE (REBOOT REQUIRED)\n", Name);
+    __DriverRequestReboot();
 
     return STATUS_INCOMPATIBLE_DRIVER_BLOCKED;
 }
 
-static FORCEINLINE VOID
-__DriverSetUnplugKey(
-    IN  HANDLE  Key
-    )
-{
-    Driver.UnplugKey = Key;
-}
-
-static FORCEINLINE HANDLE
-__DriverGetUnplugKey(
-    VOID
-    )
-{
-    return Driver.UnplugKey;
-}
-
-HANDLE
-DriverGetUnplugKey(
-    VOID
-    )
-{
-    return __DriverGetUnplugKey();
-}
-
 static VOID
 DriverOutputBuffer(
     IN  PVOID   Argument,
@@ -152,6 +192,7 @@ DllInitialize(
 {
     HANDLE              ServiceKey;
     HANDLE              UnplugKey;
+    HANDLE              StatusKey;
     NTSTATUS            status;
 
     ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
@@ -210,34 +251,43 @@ DllInitialize(
 
     __DriverSetUnplugKey(UnplugKey);
 
-    status = AcpiInitialize();
+    status = RegistryCreateSubKey(ServiceKey,
+                                  "Status",
+                                  REG_OPTION_VOLATILE,
+                                  &StatusKey);
     if (!NT_SUCCESS(status))
         goto fail5;
 
-    status = SystemInitialize();
+    __DriverSetUnplugKey(UnplugKey);
+
+    status = AcpiInitialize();
     if (!NT_SUCCESS(status))
         goto fail6;
 
-    status = HypercallInitialize();
+    status = SystemInitialize();
     if (!NT_SUCCESS(status))
         goto fail7;
 
-    status = BugCheckInitialize();
+    status = HypercallInitialize();
     if (!NT_SUCCESS(status))
         goto fail8;
 
-    status = ModuleInitialize();
+    status = BugCheckInitialize();
     if (!NT_SUCCESS(status))
         goto fail9;
 
-    status = ProcessInitialize();
+    status = ModuleInitialize();
     if (!NT_SUCCESS(status))
         goto fail10;
 
-    status = UnplugInitialize();
+    status = ProcessInitialize();
     if (!NT_SUCCESS(status))
         goto fail11;
 
+    status = UnplugInitialize();
+    if (!NT_SUCCESS(status))
+        goto fail12;
+
     RegistryCloseKey(ServiceKey);
 
 done:
@@ -245,35 +295,41 @@ done:
 
     return STATUS_SUCCESS;
 
+fail12:
+    Error("fail12\n");
+
+    ProcessTeardown();
+
 fail11:
     Error("fail11\n");
 
-    ProcessTeardown();
+    ModuleTeardown();
 
 fail10:
     Error("fail10\n");
 
-    ModuleTeardown();
+    BugCheckTeardown();
 
 fail9:
     Error("fail9\n");
 
-    BugCheckTeardown();
+    HypercallTeardown();
 
 fail8:
     Error("fail8\n");
 
-    HypercallTeardown();
+    SystemTeardown();
 
 fail7:
     Error("fail7\n");
 
-    SystemTeardown();
+    AcpiTeardown();
 
 fail6:
     Error("fail6\n");
 
-    AcpiTeardown();
+    RegistryCloseKey(StatusKey);
+    __DriverSetStatusKey(NULL);
 
 fail5:
     Error("fail5\n");
@@ -315,6 +371,7 @@ DllUnload(
     VOID
     )
 {
+    HANDLE  StatusKey;
     HANDLE  UnplugKey;
 
     Trace("====>\n");
@@ -334,6 +391,11 @@ DllUnload(
 
     SystemTeardown();
 
+    StatusKey = __DriverGetStatusKey();
+
+    RegistryCloseKey(StatusKey);
+    __DriverSetStatusKey(NULL);
+
     UnplugKey = __DriverGetUnplugKey();
 
     RegistryCloseKey(UnplugKey);
diff --git a/src/xenbus/driver.c b/src/xenbus/driver.c
index a1115a4..6135400 100644
--- a/src/xenbus/driver.c
+++ b/src/xenbus/driver.c
@@ -48,6 +48,7 @@ extern PULONG       InitSafeBootMode;
 typedef struct _XENBUS_DRIVER {
     PDRIVER_OBJECT      DriverObject;
     HANDLE              ParametersKey;
+    HANDLE              StatusKey;
 } XENBUS_DRIVER, *PXENBUS_DRIVER;
 
 static XENBUS_DRIVER    Driver;
@@ -118,6 +119,36 @@ DriverGetParametersKey(
     return __DriverGetParametersKey();
 }
 
+static FORCEINLINE VOID
+__DriverSetStatusKey(
+    IN  HANDLE  Key
+    )
+{
+    Driver.StatusKey = Key;
+}
+
+static FORCEINLINE HANDLE
+__DriverGetStatusKey(
+    VOID
+    )
+{
+    return Driver.StatusKey;
+}
+
+VOID
+DriverRequestReboot(
+    VOID
+    )
+{
+    Info("<===>\n");
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    (VOID) RegistryUpdateDwordValue(__DriverGetStatusKey(),
+                                    "NeedReboot",
+                                    1);
+}
+
 DRIVER_UNLOAD       DriverUnload;
 
 VOID
@@ -126,6 +157,7 @@ DriverUnload(
     )
 {
     HANDLE              ParametersKey;
+    HANDLE              StatusKey;
 
     ASSERT3P(DriverObject, ==, __DriverGetDriverObject());
 
@@ -134,6 +166,11 @@ DriverUnload(
     if (*InitSafeBootMode > 0)
         goto done;
 
+    StatusKey = __DriverGetStatusKey();
+    __DriverSetStatusKey(NULL);
+
+    RegistryCloseKey(StatusKey);
+
     ParametersKey = __DriverGetParametersKey();
 
     RegistryCloseKey(ParametersKey);
@@ -158,203 +195,6 @@ done:
     Trace("<====\n");
 }
 
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-DriverQueryIdCompletion(
-    IN  PDEVICE_OBJECT  DeviceObject,
-    IN  PIRP            Irp,
-    IN  PVOID           Context
-    )
-{
-    PKEVENT             Event = Context;
-
-    UNREFERENCED_PARAMETER(DeviceObject);
-    UNREFERENCED_PARAMETER(Irp);
-
-    KeSetEvent(Event, IO_NO_INCREMENT, FALSE);
-
-    return STATUS_MORE_PROCESSING_REQUIRED;
-}
-
-static NTSTATUS
-DriverQueryId(
-    IN  PDEVICE_OBJECT      PhysicalDeviceObject,
-    IN  BUS_QUERY_ID_TYPE   Type,
-    OUT PVOID               *Information
-    )
-{
-    PDEVICE_OBJECT          DeviceObject;
-    PIRP                    Irp;
-    KEVENT                  Event;
-    PIO_STACK_LOCATION      StackLocation;
-    NTSTATUS                status;
-
-    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
-
-    Trace("====> %s\n", BusQueryIdTypeName(Type));
-
-    DeviceObject = IoGetAttachedDeviceReference(PhysicalDeviceObject);
-
-    Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
-
-    status = STATUS_INSUFFICIENT_RESOURCES;
-    if (Irp == NULL)
-        goto fail1;
-
-    StackLocation = IoGetNextIrpStackLocation(Irp);
-
-    StackLocation->MajorFunction = IRP_MJ_PNP;
-    StackLocation->MinorFunction = IRP_MN_QUERY_ID;
-    StackLocation->Flags = 0;
-    StackLocation->Parameters.QueryId.IdType = Type;
-    StackLocation->DeviceObject = DeviceObject;
-    StackLocation->FileObject = NULL;
-
-    KeInitializeEvent(&Event, NotificationEvent, FALSE);
-
-    IoSetCompletionRoutine(Irp,
-                           DriverQueryIdCompletion,
-                           &Event,
-                           TRUE,
-                           TRUE,
-                           TRUE);
-
-    // Default completion status
-    Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
-
-    status = IoCallDriver(DeviceObject, Irp);
-    if (status == STATUS_PENDING) {
-        (VOID) KeWaitForSingleObject(&Event,
-                                     Executive,
-                                     KernelMode,
-                                     FALSE,
-                                     NULL);
-        status = Irp->IoStatus.Status;
-    } else {
-        ASSERT3U(status, ==, Irp->IoStatus.Status);
-    }
-
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
-    *Information = (PVOID)Irp->IoStatus.Information;
-
-    IoFreeIrp(Irp);
-    ObDereferenceObject(DeviceObject);
-
-    Trace("<====\n");
-
-    return STATUS_SUCCESS;
-
-fail2:
-    Error("fail2\n");
-
-    IoFreeIrp(Irp);
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    ObDereferenceObject(DeviceObject);
-
-    return status;
-}
-
-static NTSTATUS
-DriverGetActiveDeviceInstance(
-    OUT PWCHAR      *DeviceID,
-    OUT PWCHAR      *InstanceID
-    )
-{
-    HANDLE          ParametersKey;
-    PANSI_STRING    Ansi;
-    UNICODE_STRING  Unicode;
-    NTSTATUS        status;
-
-    ParametersKey = __DriverGetParametersKey();
-
-    *DeviceID = NULL;
-    *InstanceID = NULL;
-
-    status = RegistryQuerySzValue(ParametersKey,
-                                  "ActiveDeviceID",
-                                  &Ansi);
-    if (!NT_SUCCESS(status)) {
-        if (status != STATUS_OBJECT_NAME_NOT_FOUND)
-            goto fail1;
-
-        // The active device is not yet set
-        goto done;
-    }
-
-    Unicode.MaximumLength = (USHORT)(Ansi[0].MaximumLength / sizeof (CHAR) * sizeof (WCHAR));
-    Unicode.Buffer = __DriverAllocate(Unicode.MaximumLength);
-
-    status = STATUS_NO_MEMORY;
-    if (Unicode.Buffer == NULL)
-        goto fail2;
-
-    status = RtlAnsiStringToUnicodeString(&Unicode,
-                                          &Ansi[0],
-                                          FALSE);
-    ASSERT(NT_SUCCESS(status));
-
-    RegistryFreeSzValue(Ansi);
-
-    *DeviceID = Unicode.Buffer;
-        
-    status = RegistryQuerySzValue(ParametersKey,
-                                  "ActiveInstanceID",
-                                  &Ansi);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    Unicode.MaximumLength = (USHORT)(Ansi[0].MaximumLength / sizeof (CHAR) * sizeof (WCHAR));
-    Unicode.Buffer = __DriverAllocate(Unicode.MaximumLength);
-
-    status = STATUS_NO_MEMORY;
-    if (Unicode.Buffer == NULL)
-        goto fail4;
-
-    status = RtlAnsiStringToUnicodeString(&Unicode,
-                                          &Ansi[0],
-                                          FALSE);
-    ASSERT(NT_SUCCESS(status));
-
-    RegistryFreeSzValue(Ansi);
-
-    *InstanceID = Unicode.Buffer;
-
-done:        
-    Trace("DeviceID = %ws\n", (*DeviceID != NULL) ? *DeviceID : L"NOT SET");
-    Trace("InstanceID = %ws\n", (*InstanceID != NULL) ? *InstanceID : L"NOT SET");
-
-    return STATUS_SUCCESS;
-
-fail4:
-    Error("fail4\n");
-
-    RegistryFreeSzValue(Ansi);
-
-fail3:
-    Error("fail3\n");
-
-    __DriverFree(*DeviceID);
-    *DeviceID = NULL;
-
-    goto fail1;
-
-fail2:
-    Error("fail2\n");
-
-    RegistryFreeSzValue(Ansi);
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return status;
-}
-
 DRIVER_ADD_DEVICE   DriverAddDevice;
 
 NTSTATUS
@@ -364,76 +204,20 @@ DriverAddDevice(
     IN  PDEVICE_OBJECT  DeviceObject
     )
 {
-    PWCHAR              ActiveDeviceID;
-    PWCHAR              ActiveInstanceID;
-    PWCHAR              DeviceID;
-    PWCHAR              InstanceID;
-    BOOLEAN             Active;
     NTSTATUS            status;
 
     ASSERT3P(DriverObject, ==, __DriverGetDriverObject());
 
     Trace("====>\n");
 
-    status = DriverGetActiveDeviceInstance(&ActiveDeviceID, &ActiveInstanceID);
+    status = FdoCreate(DeviceObject);
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    Active = FALSE;
-
-    if (ActiveDeviceID == NULL) {
-        ASSERT3P(ActiveInstanceID, ==, NULL);
-        goto done;
-    }
-
-    status = DriverQueryId(DeviceObject, BusQueryDeviceID, &DeviceID);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
-    Trace("DeviceID = %ws\n", DeviceID);
-
-    status = DriverQueryId(DeviceObject, BusQueryInstanceID, &InstanceID);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    Trace("InstanceID = %ws\n", InstanceID);
-
-    if (_wcsicmp(DeviceID, ActiveDeviceID) == 0 &&
-        _wcsicmp(InstanceID, ActiveInstanceID) == 0)
-        Active = TRUE;
-
-    ExFreePool(InstanceID);
-
-    ExFreePool(DeviceID);
-
-    __DriverFree(ActiveInstanceID);
-    __DriverFree(ActiveDeviceID);
-
-done:
-    status = FdoCreate(DeviceObject, Active);
-    if (!NT_SUCCESS(status))
-        goto fail4;
-
     Trace("<====\n");
 
     return STATUS_SUCCESS;
 
-fail4:
-    Error("fail4\n");
-
-    goto fail1;
-
-fail3:
-    Error("fail3\n");
-
-    ExFreePool(DeviceID);
-
-fail2:
-    Error("fail2\n");
-
-    __DriverFree(ActiveInstanceID);
-    __DriverFree(ActiveDeviceID);
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -495,6 +279,7 @@ DriverEntry(
 {
     HANDLE              ServiceKey;
     HANDLE              ParametersKey;
+    HANDLE              StatusKey;
     ULONG               Index;
     NTSTATUS            status;
 
@@ -539,12 +324,24 @@ DriverEntry(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    status = RegistryOpenSubKey(ServiceKey, "Parameters", KEY_READ, &ParametersKey);
+    status = RegistryOpenSubKey(ServiceKey,
+                                "Parameters",
+                                KEY_READ,
+                                &ParametersKey);
     if (!NT_SUCCESS(status))
         goto fail3;
 
     __DriverSetParametersKey(ParametersKey);
 
+    status = RegistryCreateSubKey(ServiceKey,
+                                  "Status",
+                                  REG_OPTION_VOLATILE,
+                                  &StatusKey);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    __DriverSetStatusKey(StatusKey);
+
     RegistryCloseKey(ServiceKey);
 
     DriverObject->DriverExtension->AddDevice = DriverAddDevice;
@@ -560,6 +357,13 @@ done:
 
     return STATUS_SUCCESS;
 
+fail4:
+    Error("fail4\n");
+
+    __DriverSetParametersKey(NULL);
+
+    RegistryCloseKey(ParametersKey);
+
 fail3:
     Error("fail3\n");
 
diff --git a/src/xenbus/driver.h b/src/xenbus/driver.h
index 45cbe82..0208f9c 100644
--- a/src/xenbus/driver.h
+++ b/src/xenbus/driver.h
@@ -42,6 +42,21 @@ DriverGetParametersKey(
     VOID
     );
 
+extern VOID
+DriverRequestReboot(
+    VOID
+    );
+
+extern VOID
+DriverAddFilters(
+    VOID
+    );
+
+extern VOID
+DriverRemoveFilters(
+    VOID
+    );
+
 typedef struct _XENBUS_FDO      XENBUS_FDO, *PXENBUS_FDO;
 typedef struct _XENBUS_PDO      XENBUS_PDO, *PXENBUS_PDO;
 
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index e8a6f22..fdb394d 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -38,6 +38,8 @@
 #include <stdlib.h>
 #include <xen.h>
 
+#include <pvdevice_interface.h>
+
 #include "names.h"
 #include "registry.h"
 #include "fdo.h"
@@ -57,6 +59,7 @@
 #include "driver.h"
 #include "range_set.h"
 #include "unplug.h"
+#include "filters.h"
 #include "dbg_print.h"
 #include "assert.h"
 #include "util.h"
@@ -92,7 +95,6 @@ struct _XENBUS_FDO {
     PIRP                            DevicePowerIrp;
 
     CHAR                            VendorName[MAXNAMELEN];
-    BOOLEAN                         Active;
 
     MUTEX                           Mutex;
     ULONG                           References;
@@ -113,6 +115,9 @@ struct _XENBUS_FDO {
     PCM_PARTIAL_RESOURCE_LIST       RawResourceList;
     PCM_PARTIAL_RESOURCE_LIST       TranslatedResourceList;
 
+    XENFILT_PVDEVICE_INTERFACE      PvdeviceInterface;
+    BOOLEAN                         Active;
+
     PXENBUS_SUSPEND_CONTEXT         SuspendContext;
     PXENBUS_SHARED_INFO_CONTEXT     SharedInfoContext;
     PXENBUS_EVTCHN_CONTEXT          EvtchnContext;
@@ -441,19 +446,31 @@ FdoGetBusData(
                                     Length);
 }
 
-static FORCEINLINE VOID
+static FORCEINLINE NTSTATUS
 __FdoSetVendorName(
     IN  PXENBUS_FDO Fdo,
+    IN  USHORT      VendorID,
     IN  USHORT      DeviceID
     )
 {
     NTSTATUS        status;
 
+    status = STATUS_NOT_SUPPORTED;
+    if (VendorID != 'XS')
+        goto fail1;
+
     status = RtlStringCbPrintfA(Fdo->VendorName,
                                 MAXNAMELEN,
                                 "XS%04X",
                                 DeviceID);
     ASSERT(NT_SUCCESS(status));
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
 }
 
 static FORCEINLINE PCHAR
@@ -505,13 +522,161 @@ FdoGetName(
     return __FdoGetName(Fdo);
 }
 
-static FORCEINLINE VOID
-__FdoSetActive(
-    IN  PXENBUS_FDO Fdo,
-    IN  BOOLEAN     Active
+static NTSTATUS
+FdoQueryId(
+    IN  PXENBUS_FDO         Fdo,
+    IN  BUS_QUERY_ID_TYPE   Type,
+    OUT PCHAR               Id
     )
 {
-    Fdo->Active = Active;
+    KEVENT                  Event;
+    IO_STATUS_BLOCK         StatusBlock;
+    PIRP                    Irp;
+    PIO_STACK_LOCATION      StackLocation;
+    NTSTATUS                status;
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    KeInitializeEvent(&Event, NotificationEvent, FALSE);
+    RtlZeroMemory(&StatusBlock, sizeof(IO_STATUS_BLOCK));
+
+    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
+                                       Fdo->LowerDeviceObject,
+                                       NULL,
+                                       0,
+                                       NULL,
+                                       &Event,
+                                       &StatusBlock);
+
+    status = STATUS_UNSUCCESSFUL;
+    if (Irp == NULL)
+        goto fail1;
+
+    StackLocation = IoGetNextIrpStackLocation(Irp);
+    StackLocation->MinorFunction = IRP_MN_QUERY_ID;
+
+    StackLocation->Parameters.QueryId.IdType = Type;
+
+    Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
+
+    status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
+    if (status == STATUS_PENDING) {
+        (VOID) KeWaitForSingleObject(&Event,
+                                     Executive,
+                                     KernelMode,
+                                     FALSE,
+                                     NULL);
+        status = StatusBlock.Status;
+    }
+
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = RtlStringCbPrintfA(Id,
+                                MAXNAMELEN,
+                                "%ws",
+                                (PWCHAR)StatusBlock.Information);
+    ASSERT(NT_SUCCESS(status));
+
+    ExFreePool((PVOID)StatusBlock.Information);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    Error("fail2\n");
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+static NTSTATUS
+FdoSetActive(
+    IN  PXENBUS_FDO Fdo
+    )
+{
+    CHAR            DeviceID[MAX_DEVICE_ID_LEN];
+    CHAR            InstanceID[MAX_DEVICE_ID_LEN];
+    CHAR            ActiveDeviceID[MAX_DEVICE_ID_LEN];
+    CHAR            ActiveInstanceID[MAX_DEVICE_ID_LEN];
+    NTSTATUS        status;
+
+    status = FdoQueryId(Fdo,
+                        BusQueryDeviceID,
+                        DeviceID);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = FdoQueryId(Fdo,
+                        BusQueryInstanceID,
+                        InstanceID);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = XENFILT_PVDEVICE(Acquire, &Fdo->PvdeviceInterface);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = XENFILT_PVDEVICE(GetActive,
+                              &Fdo->PvdeviceInterface,
+                              ActiveDeviceID,
+                              ActiveInstanceID);
+    if (NT_SUCCESS(status)) {
+        if (_stricmp(DeviceID, ActiveDeviceID) != 0)
+            goto done;
+    } else {
+        status = XENFILT_PVDEVICE(SetActive,
+                                  &Fdo->PvdeviceInterface,
+                                  DeviceID,
+                                  InstanceID);
+        if (!NT_SUCCESS(status))
+            goto done;
+    }
+
+    Fdo->Active = TRUE;
+
+done:
+    XENFILT_PVDEVICE(Release, &Fdo->PvdeviceInterface);
+
+    return STATUS_SUCCESS;
+
+fail3:
+    Error("fail3\n");
+
+fail2:
+    Error("fail2\n");
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+static NTSTATUS
+FdoClearActive(
+    IN  PXENBUS_FDO Fdo
+    )
+{
+    NTSTATUS        status;
+
+    status = XENFILT_PVDEVICE(Acquire, &Fdo->PvdeviceInterface);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    (VOID) XENFILT_PVDEVICE(ClearActive,
+                            &Fdo->PvdeviceInterface);
+
+    Fdo->Active = FALSE;
+
+    XENFILT_PVDEVICE(Release, &Fdo->PvdeviceInterface);
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
 }
 
 static FORCEINLINE BOOLEAN
@@ -4487,14 +4652,13 @@ done:
 
 NTSTATUS
 FdoCreate(
-    IN  PDEVICE_OBJECT          PhysicalDeviceObject,
-    IN  BOOLEAN                 Active      
+    IN  PDEVICE_OBJECT          PhysicalDeviceObject
     )
 {
     PDEVICE_OBJECT              FunctionDeviceObject;
     PXENBUS_DX                  Dx;
     PXENBUS_FDO                 Fdo;
-    USHORT                      DeviceID;
+    PCI_COMMON_HEADER           Header;
     NTSTATUS                    status;
 
 #pragma prefast(suppress:28197) // Possibly leaking memory 'FunctionDeviceObject'
@@ -4542,60 +4706,81 @@ FdoCreate(
 
     if (FdoGetBusData(Fdo,
                       PCI_WHICHSPACE_CONFIG,
-                      &DeviceID,
-                      FIELD_OFFSET(PCI_COMMON_HEADER, DeviceID),
-                      FIELD_SIZE(PCI_COMMON_HEADER, DeviceID)) == 0)
+                      &Header,
+                      0,
+                      sizeof (PCI_COMMON_HEADER)) == 0)
         goto fail6;
 
-    __FdoSetVendorName(Fdo, DeviceID);
+    status = __FdoSetVendorName(Fdo,
+                                Header.VendorID,
+                                Header.DeviceID);
+    if (!NT_SUCCESS(status))
+        goto fail7;
 
     __FdoSetName(Fdo);
 
-    __FdoSetActive(Fdo, Active);
+    status = FDO_QUERY_INTERFACE(Fdo,
+                                 XENFILT,
+                                 PVDEVICE,
+                                 (PINTERFACE)&Fdo->PvdeviceInterface,
+                                 sizeof (Fdo->PvdeviceInterface),
+                                 TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail8;
+
+    if (Fdo->PvdeviceInterface.Interface.Context == NULL) {
+        (VOID) FiltersInstall();
+        DriverRequestReboot();
+        goto done;
+    }
+
+    status = FdoSetActive(Fdo);
+    if (!NT_SUCCESS(status))
+        goto fail9;
 
     if (!__FdoIsActive(Fdo))
         goto done;
 
     status = DebugInitialize(Fdo, &Fdo->DebugContext);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail10;
 
     status = SuspendInitialize(Fdo, &Fdo->SuspendContext);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail11;
 
     status = SharedInfoInitialize(Fdo, &Fdo->SharedInfoContext);
     if (!NT_SUCCESS(status))
-        goto fail9;
+        goto fail12;
 
     status = EvtchnInitialize(Fdo, &Fdo->EvtchnContext);
     if (!NT_SUCCESS(status))
-        goto fail10;
+        goto fail13;
 
     status = StoreInitialize(Fdo, &Fdo->StoreContext);
     if (!NT_SUCCESS(status))
-        goto fail11;
+        goto fail14;
 
     status = RangeSetInitialize(Fdo, &Fdo->RangeSetContext);
     if (!NT_SUCCESS(status))
-        goto fail12;
+        goto fail15;
 
     status = CacheInitialize(Fdo, &Fdo->CacheContext);
     if (!NT_SUCCESS(status))
-        goto fail13;
+        goto fail16;
 
     status = GnttabInitialize(Fdo, &Fdo->GnttabContext);
     if (!NT_SUCCESS(status))
-        goto fail14;
+        goto fail17;
 
     status = UnplugInitialize(Fdo, &Fdo->UnplugContext);
     if (!NT_SUCCESS(status))
-        goto fail15;
+        goto fail18;
 
     if (FdoIsBalloonEnabled(Fdo)) {
         status = BalloonInitialize(Fdo, &Fdo->BalloonContext);
         if (!NT_SUCCESS(status))
-            goto fail16;
+            goto fail19;
     }
 
     status = DebugGetInterface(__FdoGetDebugContext(Fdo),
@@ -4654,67 +4839,79 @@ done:
 
     return STATUS_SUCCESS;
 
-fail16:
-    Error("fail16\n");
+fail19:
+    Error("fail19\n");
 
     UnplugTeardown(Fdo->UnplugContext);
     Fdo->UnplugContext = NULL;
 
-fail15:
-    Error("fail15\n");
+fail18:
+    Error("fail18\n");
 
     GnttabTeardown(Fdo->GnttabContext);
     Fdo->GnttabContext = NULL;
 
-fail14:
-    Error("fail14\n");
+fail17:
+    Error("fail17\n");
 
     CacheTeardown(Fdo->CacheContext);
     Fdo->CacheContext = NULL;
 
-fail13:
-    Error("fail13\n");
+fail16:
+    Error("fail16\n");
 
     RangeSetTeardown(Fdo->RangeSetContext);
     Fdo->RangeSetContext = NULL;
 
-fail12:
-    Error("fail12\n");
+fail15:
+    Error("fail15\n");
 
     StoreTeardown(Fdo->StoreContext);
     Fdo->StoreContext = NULL;
 
-fail11:
-    Error("fail11\n");
+fail14:
+    Error("fail14\n");
 
     EvtchnTeardown(Fdo->EvtchnContext);
     Fdo->EvtchnContext = NULL;
 
-fail10:
-    Error("fail10\n");
+fail13:
+    Error("fail13\n");
 
     SharedInfoTeardown(Fdo->SharedInfoContext);
     Fdo->SharedInfoContext = NULL;
 
-fail9:
-    Error("fail9\n");
+fail12:
+    Error("fail12\n");
 
     SuspendTeardown(Fdo->SuspendContext);
     Fdo->SuspendContext = NULL;
 
-fail8:
-    Error("fail8\n");
+fail11:
+    Error("fail11\n");
 
     DebugTeardown(Fdo->DebugContext);
     Fdo->DebugContext = NULL;
 
-fail7:
-    Error("fail7\n");
+fail10:
+    Error("fail10\n");
 
-    __FdoSetActive(Fdo, FALSE);
+    Fdo->Active = FALSE;
+
+fail9:
+    Error("fail9\n");
+
+    RtlZeroMemory(&Fdo->PvdeviceInterface,
+                  sizeof (XENFILT_PVDEVICE_INTERFACE));
+
+fail8:
+    Error("fail8\n");
 
     RtlZeroMemory(Fdo->VendorName, MAXNAMELEN);
 
+fail7:
+    Error("fail7\n");
+
 fail6:
     Error("fail6\n");
 
@@ -4831,9 +5028,16 @@ FdoDestroy(
         DebugTeardown(Fdo->DebugContext);
         Fdo->DebugContext = NULL;
 
-        __FdoSetActive(Fdo, FALSE);
+        Fdo->Active = FALSE;
+
+        FdoClearActive(Fdo);
     }
 
+    (VOID) FiltersUninstall();
+
+    RtlZeroMemory(&Fdo->PvdeviceInterface,
+                  sizeof (XENFILT_PVDEVICE_INTERFACE));
+
     RtlZeroMemory(Fdo->VendorName, MAXNAMELEN);
 
     FdoReleaseLowerBusInterface(Fdo);
diff --git a/src/xenbus/fdo.h b/src/xenbus/fdo.h
index 1feef17..96a2250 100644
--- a/src/xenbus/fdo.h
+++ b/src/xenbus/fdo.h
@@ -41,8 +41,7 @@ typedef struct _XENBUS_INTERRUPT XENBUS_INTERRUPT, *PXENBUS_INTERRUPT;
 
 extern NTSTATUS
 FdoCreate(
-    IN  PDEVICE_OBJECT  PhysicalDeviceObject,
-    IN  BOOLEAN         Active
+    IN  PDEVICE_OBJECT  PhysicalDeviceObject
     );
 
 extern VOID
diff --git a/src/xenbus/filters.c b/src/xenbus/filters.c
new file mode 100644
index 0000000..737c839
--- /dev/null
+++ b/src/xenbus/filters.c
@@ -0,0 +1,319 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#define INITGUID 1
+
+#include <ntddk.h>
+#include <ntstrsafe.h>
+#include <devguid.h>
+#include <xen.h>
+
+#include "registry.h"
+#include "driver.h"
+#include "dbg_print.h"
+#include "assert.h"
+#include "util.h"
+
+#define XENBUS_FILTERS_TAG 'TLIF'
+
+static FORCEINLINE PVOID
+__FiltersAllocate(
+    IN  ULONG   Length
+    )
+{
+    return __AllocatePoolWithTag(NonPagedPool, Length, XENBUS_FILTERS_TAG);
+}
+
+static FORCEINLINE VOID
+__FiltersFree(
+    IN  PVOID   Buffer
+    )
+{
+    ExFreePoolWithTag(Buffer, XENBUS_FILTERS_TAG);
+}
+
+#define CLASS_PATH "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\Class"
+
+static NTSTATUS
+FiltersInstallClass(
+    IN  const CHAR  *ClassName,
+    IN  const GUID  *ClassGuid,
+    IN  const CHAR  *DriverName
+    )
+{
+    HANDLE          ClassKey;
+    UNICODE_STRING  Unicode;
+    HANDLE          Key;
+    ULONG           Count;
+    PANSI_STRING    Old;
+    ULONG           Index;
+    PANSI_STRING    New;
+    NTSTATUS        status;
+
+    Trace("====>\n");
+
+    Info("%s %s\n", ClassName, DriverName);
+
+    status = RegistryOpenSubKey(NULL,
+                                CLASS_PATH,
+                                KEY_ALL_ACCESS,
+                                &ClassKey);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = RtlStringFromGUID(ClassGuid, &Unicode);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = RegistryOpenKey(ClassKey,
+                             &Unicode,
+                             KEY_ALL_ACCESS,
+                             &Key);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Count = 0;
+
+    status = RegistryQuerySzValue(Key, "UpperFilters", &Old);
+    if (NT_SUCCESS(status)) {
+        for (Index = 0; Old[Index].Buffer != NULL; Index++) {
+            if (_stricmp(Old[Index].Buffer, DriverName) == 0)
+                goto done;
+
+            Count++;
+        }
+    } else {
+        Old = NULL;
+    }
+
+    New = __FiltersAllocate(sizeof (ANSI_STRING) * (Count + 2));
+
+    status = STATUS_NO_MEMORY;
+    if (New == NULL)
+        goto fail4;
+
+    Index = 0;
+    while (Index < Count) {
+        New[Index] = Old[Index];
+        Index++;
+    }
+
+    RtlInitAnsiString(&New[Index], DriverName);
+
+    status = RegistryUpdateSzValue(Key, "UpperFilters", New);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    __FiltersFree(New);
+
+done:
+    if (Old != NULL)
+        RegistryFreeSzValue(Old);
+
+    RegistryCloseKey(Key);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    RegistryCloseKey(ClassKey);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail5:
+    Error("fail5\n");
+
+    __FiltersFree(New);
+
+fail4:
+    Error("fail4\n");
+
+    if (Old != NULL)
+        RegistryFreeSzValue(Old);
+
+    RegistryCloseKey(Key);
+
+fail3:
+    Error("fail3\n");
+
+    RtlFreeUnicodeString(&Unicode);
+
+fail2:
+    Error("fail2\n");
+
+    RegistryCloseKey(ClassKey);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+#define FILTERS_INSTALL_CLASS(_ClassGuid, _DriverName) \
+        FiltersInstallClass(#_ClassGuid, &GUID_ ## _ClassGuid, (_DriverName))
+
+static NTSTATUS
+FiltersUninstallClass(
+    IN  const CHAR  *ClassName,
+    IN  const GUID  *ClassGuid,
+    IN  const CHAR  *DriverName
+    )
+{
+    HANDLE          ClassKey;
+    UNICODE_STRING  Unicode;
+    HANDLE          Key;
+    ULONG           Count;
+    PANSI_STRING    Old;
+    ULONG           Index;
+    PANSI_STRING    New;
+    NTSTATUS        status;
+
+    Trace("====>\n");
+
+    Info("%s %s\n", ClassName, DriverName);
+
+    status = RegistryOpenSubKey(NULL,
+                                CLASS_PATH,
+                                KEY_ALL_ACCESS,
+                                &ClassKey);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = RtlStringFromGUID(ClassGuid, &Unicode);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = RegistryOpenKey(ClassKey,
+                             &Unicode,
+                             KEY_ALL_ACCESS,
+                             &Key);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = RegistryQuerySzValue(Key, "UpperFilters", &Old);
+    if (NT_SUCCESS(status)) {
+        for (Index = 0; Old[Index].Buffer != NULL; Index++) {
+            if (_stricmp(Old[Index].Buffer, DriverName) == 0)
+                goto found;
+        }
+    }
+
+    goto done;
+
+found:
+    Count = 0;
+    for (Index = 0; Old[Index].Buffer != NULL; Index++)
+        Count++;
+
+    New = __FiltersAllocate(sizeof (ANSI_STRING) * Count);
+
+    status = STATUS_NO_MEMORY;
+    if (New == NULL)
+        goto fail4;
+
+    Count = 0;
+    for (Index = 0; Old[Index].Buffer != NULL; Index++) {
+        if (_stricmp(Old[Index].Buffer, DriverName) == 0)
+            continue;
+
+        New[Count] = Old[Index];
+        Count++;
+    }
+
+    status = RegistryUpdateSzValue(Key, "UpperFilters", New);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    __FiltersFree(New);
+
+done:
+    if (Old != NULL)
+        RegistryFreeSzValue(Old);
+
+    RegistryCloseKey(Key);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    RegistryCloseKey(ClassKey);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail5:
+    Error("fail5\n");
+
+    __FiltersFree(New);
+
+fail4:
+    Error("fail4\n");
+
+    if (Old != NULL)
+        RegistryFreeSzValue(Old);
+
+    RegistryCloseKey(Key);
+
+fail3:
+    Error("fail3\n");
+
+    RtlFreeUnicodeString(&Unicode);
+
+fail2:
+    Error("fail2\n");
+
+    RegistryCloseKey(ClassKey);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+#define FILTERS_UNINSTALL_CLASS(_ClassGuid, _DriverName) \
+        FiltersUninstallClass(#_ClassGuid, &GUID_ ## _ClassGuid, (_DriverName))
+
+VOID
+FiltersInstall(
+    VOID
+    )
+{
+    (VOID) FILTERS_INSTALL_CLASS(DEVCLASS_SYSTEM, "XENFILT");
+    (VOID) FILTERS_INSTALL_CLASS(DEVCLASS_HDC, "XENFILT");
+}
+
+VOID
+FiltersUninstall(
+    VOID
+    )
+{
+    (VOID) FILTERS_UNINSTALL_CLASS(DEVCLASS_HDC, "XENFILT");
+    (VOID) FILTERS_UNINSTALL_CLASS(DEVCLASS_SYSTEM, "XENFILT");
+}
diff --git a/src/xenbus/filters.h b/src/xenbus/filters.h
new file mode 100644
index 0000000..a08855b
--- /dev/null
+++ b/src/xenbus/filters.h
@@ -0,0 +1,45 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XENBUS_FILTERS_H
+#define _XENBUS_FILTERS_H
+
+extern NTSTATUS
+FiltersInstall(
+     VOID
+     );
+
+extern NTSTATUS
+FiltersUninstall(
+     VOID
+     );
+
+#endif  // _XENBUS_FILTERS_H
diff --git a/src/xenbus/pdo.c b/src/xenbus/pdo.c
index 8e7f90a..e85732e 100644
--- a/src/xenbus/pdo.c
+++ b/src/xenbus/pdo.c
@@ -448,7 +448,7 @@ PdoDumpRevisions(
              "RANGE_SET v%u "
              "CACHE v%u "
              "GNTTAB v%u "
-             "UNPLUG v%u\n"
+             "UNPLUG v%u "
              "EMULATED v%u\n",
              Revision->Number,
              Revision->SuspendInterfaceVersion,
diff --git a/src/xenfilt/driver.c b/src/xenfilt/driver.c
index f0ffac0..77f719a 100644
--- a/src/xenfilt/driver.c
+++ b/src/xenfilt/driver.c
@@ -30,6 +30,7 @@
  */
 
 #include <ntddk.h>
+#include <ntstrsafe.h>
 #include <procgrp.h>
 #include <xen.h>
 
@@ -38,6 +39,7 @@
 #include "pdo.h"
 #include "driver.h"
 #include "emulated.h"
+#include "pvdevice.h"
 #include "mutex.h"
 #include "dbg_print.h"
 #include "assert.h"
@@ -50,8 +52,6 @@ typedef struct _XENFILT_DRIVER {
     PDRIVER_OBJECT              DriverObject;
     HANDLE                      ParametersKey;
 
-    PCHAR                       ActiveDeviceID;
-    PCHAR                       ActiveInstanceID;
     MUTEX                       Mutex;
     LIST_ENTRY                  List;
     ULONG                       References;
@@ -60,6 +60,9 @@ typedef struct _XENFILT_DRIVER {
 
     PXENFILT_EMULATED_CONTEXT   EmulatedContext;
     XENFILT_EMULATED_INTERFACE  EmulatedInterface;
+
+    PXENFILT_PVDEVICE_CONTEXT   PvdeviceContext;
+    XENFILT_PVDEVICE_INTERFACE  PvdeviceInterface;
 } XENFILT_DRIVER, *PXENFILT_DRIVER;
 
 static XENFILT_DRIVER   Driver;
@@ -155,6 +158,30 @@ DriverGetEmulatedContext(
 }
 
 static FORCEINLINE VOID
+__DriverSetPvdeviceContext(
+    IN  PXENFILT_PVDEVICE_CONTEXT   Context
+    )
+{
+    Driver.PvdeviceContext = Context;
+}
+
+static FORCEINLINE PXENFILT_PVDEVICE_CONTEXT
+__DriverGetPvdeviceContext(
+    VOID
+    )
+{
+    return Driver.PvdeviceContext;
+}
+
+PXENFILT_PVDEVICE_CONTEXT
+DriverGetPvdeviceContext(
+    VOID
+    )
+{
+    return __DriverGetPvdeviceContext();
+}
+
+static FORCEINLINE VOID
 __DriverAcquireMutex(
     VOID
     )
@@ -219,134 +246,51 @@ DriverRemoveFunctionDeviceObject(
     --Driver.References;
 }
 
-#define SERVICES_KEY L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services"
-
-#define SERVICE_KEY(_Driver)    \
-        SERVICES_KEY L"\\" L#_Driver
-
-#define PARAMETERS_KEY(_Driver) \
-        SERVICE_KEY(_Driver) L"\\Parameters"
-
-static NTSTATUS
-DriverSetActiveDeviceInstance(
+static BOOLEAN
+DriverIsActivePresent(
     VOID
     )
 {
-    UNICODE_STRING  Unicode;
-    HANDLE          ParametersKey;
-    PANSI_STRING    Ansi;
-    NTSTATUS        status;
-
-    RtlInitUnicodeString(&Unicode, PARAMETERS_KEY(XENBUS));
-    
-    status = RegistryOpenKey(NULL, &Unicode, KEY_READ, &ParametersKey);
+    CHAR        ActiveDeviceID[MAX_DEVICE_ID_LEN];
+    CHAR        ActiveInstanceID[MAX_DEVICE_ID_LEN];
+    BOOLEAN     Present;
+    NTSTATUS    status;
+
+    status = XENFILT_PVDEVICE(Acquire, &Driver.PvdeviceInterface);
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    status = RegistryQuerySzValue(ParametersKey,
-                                  "ActiveDeviceID",
-                                  &Ansi);
-    if (!NT_SUCCESS(status)) {
-        if (status != STATUS_OBJECT_NAME_NOT_FOUND)
-            goto fail2;
-
-        // The active device is not yet set
-        goto done;
-    }
-
-    Driver.ActiveDeviceID = __DriverAllocate(Ansi[0].MaximumLength);
-
-    status = STATUS_NO_MEMORY;
-    if (Driver.ActiveDeviceID == NULL)
-        goto fail3;
-
-    RtlCopyMemory(Driver.ActiveDeviceID, Ansi[0].Buffer, Ansi[0].Length);
-
-    RegistryFreeSzValue(Ansi);
-        
-    status = RegistryQuerySzValue(ParametersKey,
-                                  "ActiveInstanceID",
-                                  &Ansi);
+    status = XENFILT_EMULATED(Acquire, &Driver.EmulatedInterface);
     if (!NT_SUCCESS(status))
-        goto fail4;
-
-    Driver.ActiveInstanceID = __DriverAllocate(Ansi[0].MaximumLength);
+        goto fail2;
 
-    status = STATUS_NO_MEMORY;
-    if (Driver.ActiveInstanceID == NULL)
-        goto fail5;
+    Present = FALSE;
 
-    RtlCopyMemory(Driver.ActiveInstanceID, Ansi[0].Buffer, Ansi[0].Length);
+    status = XENFILT_PVDEVICE(GetActive,
+                              &Driver.PvdeviceInterface,
+                              ActiveDeviceID,
+                              ActiveInstanceID);
+    if (!NT_SUCCESS(status))
+        goto done;
 
-    RegistryFreeSzValue(Ansi);
+    Present = XENFILT_EMULATED(IsDevicePresent,
+                               &Driver.EmulatedInterface,
+                               ActiveDeviceID,
+                               NULL);
 
 done:
-    if (Driver.ActiveDeviceID != NULL)
-        Info("%s/%s\n", Driver.ActiveDeviceID, Driver.ActiveInstanceID);
-
-    RegistryCloseKey(ParametersKey);
-
-    return STATUS_SUCCESS;
-
-fail5:
-    Error("fail5\n");
-
-    RegistryFreeSzValue(Ansi);
-
-fail4:
-    Error("fail4\n");
-
-    __DriverFree(Driver.ActiveDeviceID);
-    Driver.ActiveDeviceID = NULL;
-
-    goto fail2;
-
-fail3:
-    Error("fail3\n");
+    XENFILT_EMULATED(Release, &Driver.EmulatedInterface);
+    XENFILT_PVDEVICE(Release, &Driver.PvdeviceInterface);
 
-    RegistryFreeSzValue(Ansi);
+    return Present;
 
 fail2:
     Error("fail2\n");
 
-    RegistryCloseKey(ParametersKey);
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
-    return status;
-}
-
-static PCHAR
-__DriverGetActiveDeviceID(
-    VOID
-    )
-{
-    return Driver.ActiveDeviceID;
-}
-
-PCHAR
-DriverGetActiveDeviceID(
-    VOID
-    )
-{
-    return __DriverGetActiveDeviceID();
-}
-
-static FORCEINLINE PCHAR
-__DriverGetActiveInstanceID(
-    VOID
-    )
-{
-    return Driver.ActiveInstanceID;
-}
-
-PCHAR
-DriverGetActiveInstanceID(
-    VOID
-    )
-{
-    return __DriverGetActiveInstanceID();
+    return FALSE;
 }
 
 VOID
@@ -359,7 +303,6 @@ DriverSetFilterState(
     switch (Driver.FilterState) {
     case XENFILT_FILTER_ENABLED: {
         PLIST_ENTRY ListEntry;
-        BOOLEAN     Present;
 
         // Assume all FDOs have enumerated until we know otherwise
         Driver.FilterState = XENFILT_FILTER_PENDING;
@@ -379,15 +322,11 @@ DriverSetFilterState(
         if (Driver.FilterState != XENFILT_FILTER_PENDING)
             break;
 
-        Present = XENFILT_EMULATED(IsDevicePresent,
-                                   &Driver.EmulatedInterface,
-                                   __DriverGetActiveDeviceID(),
-                                   NULL);
+        if (DriverIsActivePresent()) {
+            Info("ACTIVE DEVICE %sPRESENT\n", (!Present) ? "NOT " : "");
 
-        Info("ACTIVE DEVICE %sPRESENT\n", (!Present) ? "NOT " : "");
-
-        if (Present)
             UnplugDevices();
+        }
 
         Info("PENDING\n");
         break;
@@ -446,22 +385,18 @@ DriverUnload(
     RtlZeroMemory(&Driver.List, sizeof (LIST_ENTRY));
     RtlZeroMemory(&Driver.Mutex, sizeof (MUTEX));
 
-    XENFILT_EMULATED(Release, &Driver.EmulatedInterface);
+    RtlZeroMemory(&Driver.PvdeviceInterface,
+                  sizeof (XENFILT_PVDEVICE_INTERFACE));
 
     RtlZeroMemory(&Driver.EmulatedInterface,
                   sizeof (XENFILT_EMULATED_INTERFACE));
 
+    PvdeviceTeardown(Driver.PvdeviceContext);
+    Driver.PvdeviceContext = NULL;
+
     EmulatedTeardown(Driver.EmulatedContext);
     Driver.EmulatedContext = NULL;
 
-    if (Driver.ActiveDeviceID != NULL) {
-        __DriverFree(Driver.ActiveDeviceID);
-        Driver.ActiveDeviceID = NULL;
-
-        __DriverFree(Driver.ActiveInstanceID);
-        Driver.ActiveInstanceID = NULL;
-    }
-
     ParametersKey = __DriverGetParametersKey();
     __DriverSetParametersKey(NULL);
     RegistryCloseKey(ParametersKey);
@@ -507,8 +442,8 @@ DriverQueryIdCompletion(
 static FORCEINLINE NTSTATUS
 DriverQueryId(
     IN  PDEVICE_OBJECT      PhysicalDeviceObject,
-    IN  BUS_QUERY_ID_TYPE   IdType,
-    OUT PVOID               *Information
+    IN  BUS_QUERY_ID_TYPE   Type,
+    OUT PCHAR               Id
     )
 {
     PDEVICE_OBJECT          DeviceObject;
@@ -532,7 +467,7 @@ DriverQueryId(
     StackLocation->MajorFunction = IRP_MJ_PNP;
     StackLocation->MinorFunction = IRP_MN_QUERY_ID;
     StackLocation->Flags = 0;
-    StackLocation->Parameters.QueryId.IdType = IdType;
+    StackLocation->Parameters.QueryId.IdType = Type;
     StackLocation->DeviceObject = DeviceObject;
     StackLocation->FileObject = NULL;
 
@@ -563,7 +498,13 @@ DriverQueryId(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    *Information = (PVOID)Irp->IoStatus.Information;
+    status = RtlStringCbPrintfA(Id,
+                                MAX_DEVICE_ID_LEN,
+                                "%ws",
+                                (PWCHAR)Irp->IoStatus.Information);
+    ASSERT(NT_SUCCESS(status));
+
+    ExFreePool((PVOID)Irp->IoStatus.Information);
 
     IoFreeIrp(Irp);
     ObDereferenceObject(DeviceObject);
@@ -606,10 +547,8 @@ DriverAddDevice(
     )
 {
     HANDLE              ParametersKey;
-    PWCHAR              DeviceID;
-    PWCHAR              InstanceID;
-    UNICODE_STRING      Unicode;
-    ANSI_STRING         Name;
+    CHAR                DeviceID[MAX_DEVICE_ID_LEN];
+    CHAR                InstanceID[MAX_DEVICE_ID_LEN];
     PANSI_STRING        Type;
     NTSTATUS            status;
 
@@ -617,22 +556,20 @@ DriverAddDevice(
 
     ParametersKey = __DriverGetParametersKey();
 
-    status = DriverQueryId(PhysicalDeviceObject, BusQueryDeviceID, &DeviceID);
+    status = DriverQueryId(PhysicalDeviceObject,
+                           BusQueryDeviceID,
+                           DeviceID);
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    status = DriverQueryId(PhysicalDeviceObject, BusQueryInstanceID, &InstanceID);
+    status = DriverQueryId(PhysicalDeviceObject,
+                           BusQueryInstanceID,
+                           InstanceID);
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    RtlInitUnicodeString(&Unicode, DeviceID);
-
-    status = RtlUnicodeStringToAnsiString(&Name, &Unicode, TRUE);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
     status = RegistryQuerySzValue(ParametersKey,
-                                  Name.Buffer,
+                                  DeviceID,
                                   &Type);
     if (NT_SUCCESS(status)) {
         status = FdoCreate(PhysicalDeviceObject,
@@ -641,28 +578,15 @@ DriverAddDevice(
                            DriverGetEmulatedType(Type));
 
         if (!NT_SUCCESS(status))
-            goto fail4;
+            goto fail3;
 
         RegistryFreeSzValue(Type);
     }
 
-    RtlFreeAnsiString(&Name);
-    ExFreePool(InstanceID);
-    ExFreePool(DeviceID);
-
     return STATUS_SUCCESS;
 
-fail4:
-    RegistryFreeSzValue(Type);
-
-    RtlFreeAnsiString(&Name);
-
 fail3:
-    ExFreePool(InstanceID);
-
 fail2:
-    ExFreePool(DeviceID);
-
 fail1:
     return status;
 }
@@ -723,6 +647,7 @@ DriverEntry(
     HANDLE                      ServiceKey;
     HANDLE                      ParametersKey;
     PXENFILT_EMULATED_CONTEXT   EmulatedContext;
+    PXENFILT_PVDEVICE_CONTEXT   PvdeviceContext;
     ULONG                       Index;
     NTSTATUS                    status;
 
@@ -773,26 +698,29 @@ DriverEntry(
 
     __DriverSetParametersKey(ParametersKey);
 
-    status = DriverSetActiveDeviceInstance();
+    status = EmulatedInitialize(&EmulatedContext);
     if (!NT_SUCCESS(status))
         goto fail4;
 
-    status = EmulatedInitialize(&EmulatedContext);
+    __DriverSetEmulatedContext(EmulatedContext);
+
+    status = PvdeviceInitialize(&PvdeviceContext);
     if (!NT_SUCCESS(status))
         goto fail5;
 
-    __DriverSetEmulatedContext(EmulatedContext);
+    __DriverSetPvdeviceContext(PvdeviceContext);
 
     status = EmulatedGetInterface(__DriverGetEmulatedContext(),
                                   XENFILT_EMULATED_INTERFACE_VERSION_MAX,
                                   (PINTERFACE)&Driver.EmulatedInterface,
                                   sizeof (Driver.EmulatedInterface));
     ASSERT(NT_SUCCESS(status));
-    ASSERT(Driver.EmulatedInterface.Interface.Context != NULL);
 
-    status = XENFILT_EMULATED(Acquire, &Driver.EmulatedInterface);
-    if (!NT_SUCCESS(status))
-        goto fail6;
+    status = PvdeviceGetInterface(__DriverGetPvdeviceContext(),
+                                  XENFILT_PVDEVICE_INTERFACE_VERSION_MAX,
+                                  (PINTERFACE)&Driver.PvdeviceInterface,
+                                  sizeof (Driver.PvdeviceInterface));
+    ASSERT(NT_SUCCESS(status));
 
     RegistryCloseKey(ServiceKey);
 
@@ -812,22 +740,11 @@ done:
     Trace("<====\n");
     return STATUS_SUCCESS;
 
-fail6:
-    Error("fail6\n");
-
-    EmulatedTeardown(Driver.EmulatedContext);
-    Driver.EmulatedContext = NULL;
-
 fail5:
     Error("fail5\n");
 
-    if (Driver.ActiveDeviceID != NULL) {
-        __DriverFree(Driver.ActiveDeviceID);
-        Driver.ActiveDeviceID = NULL;
-
-        __DriverFree(Driver.ActiveInstanceID);
-        Driver.ActiveInstanceID = NULL;
-    }
+    EmulatedTeardown(Driver.EmulatedContext);
+    Driver.EmulatedContext = NULL;
 
 fail4:
     Error("fail4\n");
diff --git a/src/xenfilt/driver.h b/src/xenfilt/driver.h
index f906d36..772436d 100644
--- a/src/xenfilt/driver.h
+++ b/src/xenfilt/driver.h
@@ -42,16 +42,6 @@ DriverGetParametersKey(
     VOID
     );
 
-extern PCHAR
-DriverGetActiveDeviceID(
-    VOID
-    );
-
-extern PCHAR
-DriverGetActiveInstanceID(
-    VOID
-    );
-
 extern VOID
 DriverAcquireMutex(
     VOID
@@ -85,6 +75,13 @@ DriverGetEmulatedContext(
     VOID
     );
 
+#include "pvdevice.h"
+
+PXENFILT_PVDEVICE_CONTEXT
+DriverGetPvdeviceContext(
+    VOID
+    );
+
 typedef struct _XENFILT_FDO XENFILT_FDO, *PXENFILT_FDO;
 typedef struct _XENFILT_PDO XENFILT_PDO, *PXENFILT_PDO;
 
@@ -116,8 +113,8 @@ typedef struct _XENFILT_DX {
     SYSTEM_POWER_STATE  SystemPowerState;
     DEVICE_POWER_STATE  DevicePowerState;
 
-    WCHAR               DeviceID[MAX_DEVICE_ID_LEN];
-    WCHAR               InstanceID[MAX_DEVICE_ID_LEN];
+    CHAR                DeviceID[MAX_DEVICE_ID_LEN];
+    CHAR                InstanceID[MAX_DEVICE_ID_LEN];
 
     IO_REMOVE_LOCK      RemoveLock;
 
diff --git a/src/xenfilt/emulated.c b/src/xenfilt/emulated.c
index 485fed6..31391ed 100644
--- a/src/xenfilt/emulated.c
+++ b/src/xenfilt/emulated.c
@@ -92,21 +92,21 @@ __EmulatedFree(
 static NTSTATUS
 EmulatedSetObjectDeviceData(
     IN  PXENFILT_EMULATED_OBJECT    EmulatedObject,
-    IN  PWCHAR                      DeviceID,
-    IN  PWCHAR                      InstanceID
+    IN  PCHAR                       DeviceID,
+    IN  PCHAR                       InstanceID
     )
 {
     NTSTATUS                        status;
 
     status = RtlStringCbPrintfA(EmulatedObject->Data.Device.DeviceID,
                                 MAXNAMELEN,
-                                "%ws",
+                                "%s",
                                 DeviceID);
     ASSERT(NT_SUCCESS(status));
 
     status = RtlStringCbPrintfA(EmulatedObject->Data.Device.InstanceID,
                                 MAXNAMELEN,
-                                "%ws",
+                                "%s",
                                 InstanceID);
     ASSERT(NT_SUCCESS(status));
 
@@ -116,12 +116,10 @@ EmulatedSetObjectDeviceData(
 static NTSTATUS
 EmulatedSetObjectDiskData(
     IN  PXENFILT_EMULATED_OBJECT    EmulatedObject,
-    IN  PWCHAR                      DeviceID,
-    IN  PWCHAR                      InstanceID
+    IN  PCHAR                       DeviceID,
+    IN  PCHAR                       InstanceID
     )
 {
-    UNICODE_STRING                  Unicode;
-    ANSI_STRING                     Ansi;
     PCHAR                           End;
     ULONG                           Controller;
     ULONG                           Target;
@@ -130,17 +128,11 @@ EmulatedSetObjectDiskData(
 
     UNREFERENCED_PARAMETER(DeviceID);
 
-    RtlInitUnicodeString(&Unicode, InstanceID);
-
-    status = RtlUnicodeStringToAnsiString(&Ansi, &Unicode, TRUE);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
-    Controller = strtol(Ansi.Buffer, &End, 10);
+    Controller = strtol(InstanceID, &End, 10);
 
     status = STATUS_INVALID_PARAMETER;
     if (*End != '.')
-        goto fail2;
+        goto fail1;
 
     End++;
 
@@ -148,7 +140,7 @@ EmulatedSetObjectDiskData(
 
     status = STATUS_INVALID_PARAMETER;
     if (*End != '.')
-        goto fail3;
+        goto fail2;
 
     End++;
 
@@ -156,27 +148,20 @@ EmulatedSetObjectDiskData(
 
     status = STATUS_INVALID_PARAMETER;
     if (*End != '\0')
-        goto fail4;
+        goto fail3;
 
     EmulatedObject->Data.Disk.Controller = Controller;
     EmulatedObject->Data.Disk.Target = Target;
     EmulatedObject->Data.Disk.Lun = Lun;
 
-    RtlFreeAnsiString(&Ansi);
-
     return STATUS_SUCCESS;
 
-fail4:
-    Error("fail4\n");
-
 fail3:
     Error("fail3\n");
 
 fail2:
     Error("fail2\n");
 
-    RtlFreeAnsiString(&Ansi);
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -186,8 +171,8 @@ fail1:
 NTSTATUS
 EmulatedAddObject(
     IN  PXENFILT_EMULATED_CONTEXT       Context,
-    IN  PWCHAR                          DeviceID,
-    IN  PWCHAR                          InstanceID,
+    IN  PCHAR                           DeviceID,
+    IN  PCHAR                           InstanceID,
     IN  XENFILT_EMULATED_OBJECT_TYPE    Type,
     OUT PXENFILT_EMULATED_OBJECT        *EmulatedObject
     )
diff --git a/src/xenfilt/emulated.h b/src/xenfilt/emulated.h
index cc63a25..778c784 100644
--- a/src/xenfilt/emulated.h
+++ b/src/xenfilt/emulated.h
@@ -67,8 +67,8 @@ EmulatedTeardown(
 extern NTSTATUS
 EmulatedAddObject(
     IN  PXENFILT_EMULATED_CONTEXT       Context,
-    IN  PWCHAR                          DeviceID,
-    IN  PWCHAR                          InstanceID,
+    IN  PCHAR                           DeviceID,
+    IN  PCHAR                           InstanceID,
     IN  XENFILT_EMULATED_OBJECT_TYPE    Type,
     OUT PXENFILT_EMULATED_OBJECT        *EmulatedObject
     );
diff --git a/src/xenfilt/fdo.c b/src/xenfilt/fdo.c
index 25b3dc2..7121eb2 100644
--- a/src/xenfilt/fdo.c
+++ b/src/xenfilt/fdo.c
@@ -186,23 +186,39 @@ FdoGetDeviceObject(
     return __FdoGetDeviceObject(Fdo);
 }
 
+static FORCEINLINE PDEVICE_OBJECT
+__FdoGetPhysicalDeviceObject(
+    IN  PXENFILT_FDO    Fdo
+    )
+{
+    return Fdo->PhysicalDeviceObject;
+}
+
+PDEVICE_OBJECT
+FdoGetPhysicalDeviceObject(
+    IN  PXENFILT_FDO    Fdo
+    )
+{
+    return __FdoGetPhysicalDeviceObject(Fdo);
+}
+
 static FORCEINLINE VOID
 __FdoSetDeviceID(
     IN  PXENFILT_FDO    Fdo,
-    IN  PWCHAR          DeviceID
+    IN  PCHAR           DeviceID
     )
 {
     PXENFILT_DX         Dx = Fdo->Dx;
     NTSTATUS            status;
 
-    status = RtlStringCbPrintfW(Dx->DeviceID,
+    status = RtlStringCbPrintfA(Dx->DeviceID,
                                 MAX_DEVICE_ID_LEN,
-                                L"%ws",
+                                "%s",
                                 DeviceID);
     ASSERT(NT_SUCCESS(status));
 }
 
-static FORCEINLINE PWCHAR
+static FORCEINLINE PCHAR
 __FdoGetDeviceID(
     IN  PXENFILT_FDO    Fdo
     )
@@ -215,20 +231,20 @@ __FdoGetDeviceID(
 static FORCEINLINE VOID
 __FdoSetInstanceID(
     IN  PXENFILT_FDO    Fdo,
-    IN  PWCHAR          InstanceID
+    IN  PCHAR           InstanceID
     )
 {
     PXENFILT_DX         Dx = Fdo->Dx;
     NTSTATUS            status;
 
-    status = RtlStringCbPrintfW(Dx->InstanceID,
+    status = RtlStringCbPrintfA(Dx->InstanceID,
                                 MAX_DEVICE_ID_LEN,
-                                L"%ws",
+                                "%s",
                                 InstanceID);
     ASSERT(NT_SUCCESS(status));
 }
 
-static FORCEINLINE PWCHAR
+static FORCEINLINE PCHAR
 __FdoGetInstanceID(
     IN  PXENFILT_FDO    Fdo
     )
@@ -247,7 +263,7 @@ __FdoSetName(
 
     status = RtlStringCbPrintfA(Fdo->Name,
                                 MAXNAMELEN,
-                                "%ws\\%ws",
+                                "%s\\%s",
                                 __FdoGetDeviceID(Fdo),
                                 __FdoGetInstanceID(Fdo));
     ASSERT(NT_SUCCESS(status));
@@ -261,14 +277,6 @@ __FdoGetName(
     return Fdo->Name;
 }
 
-static FORCEINLINE PDEVICE_OBJECT
-__FdoGetPhysicalDeviceObject(
-    IN  PXENFILT_FDO    Fdo
-    )
-{
-    return Fdo->PhysicalDeviceObject;
-}
-
 VOID
 FdoAddPhysicalDeviceObject(
     IN  PXENFILT_FDO    Fdo,
@@ -388,8 +396,8 @@ static NTSTATUS
 FdoQueryId(
     IN  PXENFILT_FDO        Fdo,
     IN  PDEVICE_OBJECT      DeviceObject,
-    IN  BUS_QUERY_ID_TYPE   IdType,
-    OUT PVOID               *Information
+    IN  BUS_QUERY_ID_TYPE   Type,
+    OUT PCHAR               Id
     )
 {
     PIRP                    Irp;
@@ -412,7 +420,7 @@ FdoQueryId(
     StackLocation->MajorFunction = IRP_MJ_PNP;
     StackLocation->MinorFunction = IRP_MN_QUERY_ID;
     StackLocation->Flags = 0;
-    StackLocation->Parameters.QueryId.IdType = IdType;
+    StackLocation->Parameters.QueryId.IdType = Type;
     StackLocation->DeviceObject = DeviceObject;
     StackLocation->FileObject = NULL;
 
@@ -443,7 +451,13 @@ FdoQueryId(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    *Information = (PVOID)Irp->IoStatus.Information;
+    status = RtlStringCbPrintfA(Id,
+                                MAX_DEVICE_ID_LEN,
+                                "%ws",
+                                (PWCHAR)Irp->IoStatus.Information);
+    ASSERT(NT_SUCCESS(status));
+
+    ExFreePool((PVOID)Irp->IoStatus.Information);
 
     IoFreeIrp(Irp);
 
@@ -462,21 +476,21 @@ FdoAddDevice(
     IN  PDEVICE_OBJECT  PhysicalDeviceObject
     )
 {
-    PWCHAR              DeviceID;
-    PWCHAR              InstanceID;
+    CHAR                DeviceID[MAX_DEVICE_ID_LEN];
+    CHAR                InstanceID[MAX_DEVICE_ID_LEN];
     NTSTATUS            status;
 
     status = FdoQueryId(Fdo,
                         PhysicalDeviceObject,
                         BusQueryDeviceID,
-                        &DeviceID);
+                        DeviceID);
     if (!NT_SUCCESS(status))
         goto fail1;
 
     status = FdoQueryId(Fdo,
                         PhysicalDeviceObject,
                         BusQueryInstanceID,
-                        &InstanceID);
+                        InstanceID);
     if (!NT_SUCCESS(status))
         goto fail2;
 
@@ -488,17 +502,10 @@ FdoAddDevice(
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    ExFreePool(InstanceID);
-    ExFreePool(DeviceID);
-
     return STATUS_SUCCESS;
 
 fail3:
-    ExFreePool(InstanceID);
-
 fail2:
-    ExFreePool(DeviceID);
-
 fail1:
     return status;
 }
@@ -1983,8 +1990,8 @@ FdoDispatch(
 NTSTATUS
 FdoCreate(
     IN  PDEVICE_OBJECT                  PhysicalDeviceObject,
-    IN  PWCHAR                          DeviceID,
-    IN  PWCHAR                          InstanceID,
+    IN  PCHAR                           DeviceID,
+    IN  PCHAR                           InstanceID,
     IN  XENFILT_EMULATED_OBJECT_TYPE    Type
     )
 {
diff --git a/src/xenfilt/fdo.h b/src/xenfilt/fdo.h
index b871b26..62a667f 100644
--- a/src/xenfilt/fdo.h
+++ b/src/xenfilt/fdo.h
@@ -43,8 +43,8 @@ typedef struct _XENFILT_FDO XENFILT_FDO, *PXENFILT_FDO;
 extern NTSTATUS
 FdoCreate(
     IN  PDEVICE_OBJECT                  PhysicalDeviceObject,
-    IN  PWCHAR                          DeviceID,
-    IN  PWCHAR                          InstanceID,
+    IN  PCHAR                           DeviceID,
+    IN  PCHAR                           InstanceID,
     IN  XENFILT_EMULATED_OBJECT_TYPE    Type
     );
 
@@ -85,6 +85,11 @@ FdoGetDeviceObject(
     IN  PXENFILT_FDO    Fdo
     );
 
+extern PDEVICE_OBJECT
+FdoGetPhysicalDeviceObject(
+    IN  PXENFILT_FDO    Fdo
+    );
+
 extern BOOLEAN
 FdoHasEnumerated(
     IN  PXENFILT_FDO    Fdo
diff --git a/src/xenfilt/pdo.c b/src/xenfilt/pdo.c
index 6fab346..57502f3 100644
--- a/src/xenfilt/pdo.c
+++ b/src/xenfilt/pdo.c
@@ -37,6 +37,7 @@
 #include <stdlib.h>
 
 #include "emulated.h"
+#include "pvdevice.h"
 #include "names.h"
 #include "fdo.h"
 #include "pdo.h"
@@ -65,6 +66,8 @@ struct _XENFILT_PDO {
 
     XENFILT_EMULATED_OBJECT_TYPE    Type;
     PXENFILT_EMULATED_OBJECT        EmulatedObject;
+
+    XENFILT_PVDEVICE_INTERFACE      PvdeviceInterface;
 };
 
 static FORCEINLINE PVOID
@@ -213,74 +216,74 @@ __PdoGetFdo(
     return Pdo->Fdo;
 }
 
-static FORCEINLINE VOID
-__PdoSetDeviceID(
+static NTSTATUS
+PdoSetDeviceInstance(
     IN  PXENFILT_PDO    Pdo,
-    IN  PWCHAR          DeviceID
+    IN  PCHAR           DeviceID,
+    IN  PCHAR           InstanceID
     )
 {
     PXENFILT_DX         Dx = Pdo->Dx;
+    CHAR                ActiveDeviceID[MAX_DEVICE_ID_LEN];
+    CHAR                ActiveInstanceID[MAX_DEVICE_ID_LEN];
     NTSTATUS            status;
 
-    status = RtlStringCbPrintfW(Dx->DeviceID,
-                                MAX_DEVICE_ID_LEN,
-                                L"%ws",
-                                DeviceID);
-    ASSERT(NT_SUCCESS(status));
-}
-
-static FORCEINLINE PWCHAR
-__PdoGetDeviceID(
-    IN  PXENFILT_PDO    Pdo
-    )
-{
-    PXENFILT_DX         Dx = Pdo->Dx;
-
-    return Dx->DeviceID;
-}
-
-static FORCEINLINE VOID
-__PdoSetInstanceID(
-    IN  PXENFILT_PDO    Pdo,
-    IN  PWCHAR          InstanceID
-    )
-{
-    WCHAR               ActiveDeviceID[MAX_DEVICE_ID_LEN];
-    WCHAR               ActiveInstanceID[MAX_DEVICE_ID_LEN];
-    PXENFILT_DX         Dx = Pdo->Dx;
-    NTSTATUS            status;
+    status = XENFILT_PVDEVICE(Acquire, &Pdo->PvdeviceInterface);
+    if (!NT_SUCCESS(status))
+        goto fail1;
 
-    RtlStringCbPrintfW(ActiveDeviceID,
-                       sizeof (ActiveDeviceID),
-                       L"%hs",
-                       DriverGetActiveDeviceID());
-    
-    RtlStringCbPrintfW(ActiveInstanceID,
-                       sizeof (ActiveInstanceID),
-                       L"%hs",
-                       DriverGetActiveInstanceID());
+    status = XENFILT_PVDEVICE(GetActive,
+                              &Pdo->PvdeviceInterface,
+                              ActiveDeviceID,
+                              ActiveInstanceID);
+    if (!NT_SUCCESS(status))
+        goto done;
 
-    if (_wcsicmp(Dx->DeviceID, ActiveDeviceID) != 0)
+    if (_stricmp(DeviceID, ActiveDeviceID) != 0)
         goto done;
 
-    if (_wcsicmp(InstanceID, ActiveInstanceID) != 0) {
-        Warning("(%ws) '%ws' -> '%ws'\n",
+    if (_stricmp(InstanceID, ActiveInstanceID) != 0) {
+        Warning("(%s) '%s' -> '%s'\n",
                 Dx->DeviceID,
                 InstanceID,
                 ActiveInstanceID);
-
         InstanceID = ActiveInstanceID;
     }
 
 done:
-    status = RtlStringCbPrintfW(Dx->InstanceID,
+    XENFILT_PVDEVICE(Release, &Pdo->PvdeviceInterface);
+
+    status = RtlStringCbPrintfA(Dx->DeviceID,
                                 MAX_DEVICE_ID_LEN,
-                                L"%ws",
+                                "%s",
+                                DeviceID);
+    ASSERT(NT_SUCCESS(status));
+
+    status = RtlStringCbPrintfA(Dx->InstanceID,
+                                MAX_DEVICE_ID_LEN,
+                                "%s",
                                 InstanceID);
     ASSERT(NT_SUCCESS(status));
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+static FORCEINLINE PCHAR
+__PdoGetDeviceID(
+    IN  PXENFILT_PDO    Pdo
+    )
+{
+    PXENFILT_DX         Dx = Pdo->Dx;
+
+    return Dx->DeviceID;
 }
 
-static FORCEINLINE PWCHAR
+static FORCEINLINE PCHAR
 __PdoGetInstanceID(
     IN  PXENFILT_PDO    Pdo
     )
@@ -300,7 +303,7 @@ __PdoSetName(
 
     status = RtlStringCbPrintfA(Pdo->Name,
                                 MAXNAMELEN,
-                                "%ws\\%ws",
+                                "%s\\%s",
                                 Dx->DeviceID,
                                 Dx->InstanceID);
     ASSERT(NT_SUCCESS(status));
@@ -793,6 +796,9 @@ done:
     PdoDestroy(Pdo);
     FdoReleaseMutex(Fdo);
 
+    IoInvalidateDeviceRelations(FdoGetPhysicalDeviceObject(Fdo),
+                                BusRelations);
+
     return status;
 
 fail1:
@@ -863,6 +869,7 @@ done:                                                               \
 }                                                                   \
 
 DEFINE_PDO_QUERY_INTERFACE(Emulated)
+DEFINE_PDO_QUERY_INTERFACE(Pvdevice)
 
 struct _INTERFACE_ENTRY {
     const GUID  *Guid;
@@ -875,6 +882,7 @@ struct _INTERFACE_ENTRY {
 
 struct _INTERFACE_ENTRY PdoInterfaceTable[] = {
     DEFINE_INTERFACE_ENTRY(EMULATED_INTERFACE, Emulated),
+    DEFINE_INTERFACE_ENTRY(PVDEVICE_INTERFACE, Pvdevice),
     { NULL, NULL, NULL }
 };
 
@@ -983,7 +991,7 @@ PdoQueryId(
     case BusQueryInstanceID:
         status = RtlStringCbPrintfW(Buffer,
                                     Id.MaximumLength,
-                                    L"%s",
+                                    L"%hs",
                                     __PdoGetInstanceID(Pdo));
         ASSERT(NT_SUCCESS(status));
 
@@ -993,7 +1001,7 @@ PdoQueryId(
     case BusQueryDeviceID:
         status = RtlStringCbPrintfW(Buffer,
                                     Id.MaximumLength,
-                                    L"%s",
+                                    L"%hs",
                                     __PdoGetDeviceID(Pdo));
         ASSERT(NT_SUCCESS(status));
 
@@ -1880,8 +1888,8 @@ NTSTATUS
 PdoCreate(
     PXENFILT_FDO                    Fdo,
     PDEVICE_OBJECT                  PhysicalDeviceObject,
-    PWCHAR                          DeviceID,
-    PWCHAR                          InstanceID,
+    PCHAR                           DeviceID,
+    PCHAR                           InstanceID,
     XENFILT_EMULATED_OBJECT_TYPE    Type
     )
 {
@@ -1953,8 +1961,16 @@ PdoCreate(
     if (!NT_SUCCESS(status))
         goto fail6;
 
-    __PdoSetDeviceID(Pdo, DeviceID);
-    __PdoSetInstanceID(Pdo, InstanceID);
+    status = PvdeviceGetInterface(DriverGetPvdeviceContext(),
+                                  XENFILT_PVDEVICE_INTERFACE_VERSION_MAX,
+                                  (PINTERFACE)&Pdo->PvdeviceInterface,
+                                  sizeof (Pdo->PvdeviceInterface));
+    ASSERT(NT_SUCCESS(status));
+
+    status = PdoSetDeviceInstance(Pdo, DeviceID, InstanceID);
+    if (!NT_SUCCESS(status))
+        goto fail7;
+
     __PdoSetName(Pdo);
 
     Info("%p (%s)\n",
@@ -1974,6 +1990,12 @@ PdoCreate(
 
     return STATUS_SUCCESS;
 
+fail7:
+    Error("fail7\n");
+
+    RtlZeroMemory(&Pdo->PvdeviceInterface,
+                  sizeof (XENFILT_PVDEVICE_INTERFACE));
+
 fail6:
     Error("fail6\n");
 
@@ -2038,6 +2060,9 @@ PdoDestroy(
 
     RtlZeroMemory(Pdo->Name, sizeof (Pdo->Name));
 
+    RtlZeroMemory(&Pdo->PvdeviceInterface,
+                  sizeof (XENFILT_PVDEVICE_INTERFACE));
+
     EmulatedRemoveObject(DriverGetEmulatedContext(),
                          Pdo->EmulatedObject);
     Pdo->EmulatedObject = NULL;
diff --git a/src/xenfilt/pdo.h b/src/xenfilt/pdo.h
index 05ca049..aac5702 100644
--- a/src/xenfilt/pdo.h
+++ b/src/xenfilt/pdo.h
@@ -65,8 +65,8 @@ extern NTSTATUS
 PdoCreate(
     IN  PXENFILT_FDO                    Fdo,
     IN  PDEVICE_OBJECT                  PhysicalDeviceObject,
-    IN  PWCHAR                          DeviceID,
-    IN  PWCHAR                          InstanceID,
+    IN  PCHAR                           DeviceID,
+    IN  PCHAR                           InstanceID,
     IN  XENFILT_EMULATED_OBJECT_TYPE    Type
     );
 
diff --git a/src/xenfilt/pvdevice.c b/src/xenfilt/pvdevice.c
new file mode 100644
index 0000000..5f9345d
--- /dev/null
+++ b/src/xenfilt/pvdevice.c
@@ -0,0 +1,439 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <ntddk.h>
+#include <ntstrsafe.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <xen.h>
+
+#include "driver.h"
+#include "registry.h"
+#include "emulated.h"
+#include "pvdevice.h"
+#include "mutex.h"
+#include "dbg_print.h"
+#include "assert.h"
+#include "util.h"
+
+struct _XENFILT_PVDEVICE_CONTEXT {
+    KSPIN_LOCK                  Lock;
+    LONG                        References;
+    XENFILT_EMULATED_INTERFACE  EmulatedInterface;
+    MUTEX                       Mutex;
+};
+
+#define XENFILT_PVDEVICE_TAG    'EDVP'
+
+static FORCEINLINE PVOID
+__PvdeviceAllocate(
+    IN  ULONG   Length
+    )
+{
+    return __AllocatePoolWithTag(NonPagedPool, Length, XENFILT_PVDEVICE_TAG);
+}
+
+static FORCEINLINE VOID
+__PvdeviceFree(
+    IN  PVOID   Buffer
+    )
+{
+    ExFreePoolWithTag(Buffer, XENFILT_PVDEVICE_TAG);
+}
+
+static const CHAR *PvdeviceLegacyPrefix[] = {
+    "PCI\\VEN_5853&DEV_0001",
+    "PCI\\VEN_5853&DEV_0002",
+};
+
+static BOOLEAN
+PvdeviceIsLegacy(
+    IN  PXENFILT_PVDEVICE_CONTEXT   Context,
+    IN  PCHAR                       DeviceID
+    )
+{
+    ULONG                           Index;
+
+    UNREFERENCED_PARAMETER(Context);
+
+    for (Index = 0; Index < ARRAYSIZE(PvdeviceLegacyPrefix); Index++) {
+        const CHAR  *Prefix = PvdeviceLegacyPrefix[Index];
+
+        if (_strnicmp(DeviceID, Prefix, strlen(Prefix)) == 0)
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
+static const CHAR *PvdeviceVendorDeviceID[] = {
+    "PCI\\VEN_5853&DEV_C000&SUBSYS_C0005853&REV_01", // XenServer
+};
+
+static BOOLEAN
+PvdeviceIsVendorPresent(
+    IN  PXENFILT_PVDEVICE_CONTEXT   Context
+    )
+{
+    ULONG                           Index;
+
+    for (Index = 0; Index < ARRAYSIZE(PvdeviceVendorDeviceID); Index++) {
+        const CHAR  *DeviceID = PvdeviceVendorDeviceID[Index];
+
+        if (XENFILT_EMULATED(IsDevicePresent,
+                             &Context->EmulatedInterface,
+                             (PCHAR)DeviceID,
+                             NULL))
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
+static NTSTATUS
+PvdeviceGetActive(
+    IN  PINTERFACE              Interface,
+    OUT PCHAR                   DeviceID,
+    OUT PCHAR                   InstanceID
+    )
+{
+    PXENFILT_PVDEVICE_CONTEXT   Context = Interface->Context;
+    HANDLE                      ParametersKey;
+    PANSI_STRING                Ansi;
+    NTSTATUS                    status;
+
+    Trace("====>\n");
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    ParametersKey = DriverGetParametersKey();
+
+    AcquireMutex(&Context->Mutex);
+
+    status = RegistryQuerySzValue(ParametersKey,
+                                  "ActiveDeviceID",
+                                  &Ansi);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = RtlStringCbPrintfA(DeviceID,
+                                MAX_DEVICE_ID_LEN,
+                                "%Z",
+                                &Ansi[0]);
+    ASSERT(NT_SUCCESS(status));
+
+    RegistryFreeSzValue(Ansi);
+
+    status = RegistryQuerySzValue(ParametersKey,
+                                  "ActiveInstanceID",
+                                  &Ansi);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = RtlStringCbPrintfA(InstanceID,
+                                MAX_DEVICE_ID_LEN,
+                                "%Z",
+                                &Ansi[0]);
+    ASSERT(NT_SUCCESS(status));
+
+    RegistryFreeSzValue(Ansi);
+
+    ReleaseMutex(&Context->Mutex);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail2:
+fail1:
+    ReleaseMutex(&Context->Mutex);
+
+    return status;
+}
+
+static NTSTATUS
+PvdeviceSetActive(
+    IN  PINTERFACE              Interface,
+    IN  PCHAR                   DeviceID,
+    IN  PCHAR                   InstanceID
+    )
+{
+    PXENFILT_PVDEVICE_CONTEXT   Context = Interface->Context;
+    HANDLE                      ParametersKey;
+    ANSI_STRING                 Ansi[2];
+    NTSTATUS                    status;
+
+    Trace("====>\n");
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    ParametersKey = DriverGetParametersKey();
+
+    AcquireMutex(&Context->Mutex);
+
+    status = STATUS_UNSUCCESSFUL;
+    if (PvdeviceIsLegacy(Context, DeviceID) &&
+        PvdeviceIsVendorPresent(Context))
+        goto fail1;
+
+    RtlZeroMemory(Ansi, sizeof (ANSI_STRING) * 2);
+
+    RtlInitAnsiString(&Ansi[0], DeviceID);
+
+    status = RegistryUpdateSzValue(ParametersKey,
+                                   "ActiveDeviceID",
+                                   Ansi);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    RtlInitAnsiString(&Ansi[0], InstanceID);
+
+    status = RegistryUpdateSzValue(ParametersKey,
+                                   "ActiveInstanceID",
+                                   Ansi);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Info("%s\\%s\n", DeviceID, InstanceID);
+
+    ReleaseMutex(&Context->Mutex);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail3:
+fail2:
+fail1:
+    ReleaseMutex(&Context->Mutex);
+
+    return status;
+}
+
+static NTSTATUS
+PvdeviceClearActive(
+    IN  PINTERFACE              Interface
+    )
+{
+    PXENFILT_PVDEVICE_CONTEXT   Context = Interface->Context;
+    HANDLE                      ParametersKey;
+    NTSTATUS                    status;
+
+    Trace("====>\n");
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    ParametersKey = DriverGetParametersKey();
+
+    AcquireMutex(&Context->Mutex);
+
+    status = RegistryDeleteValue(ParametersKey,
+                                 "ActiveDeviceID");
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = RegistryDeleteValue(ParametersKey,
+                                 "ActiveInstanceID");
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    Info("DONE\n");
+
+    ReleaseMutex(&Context->Mutex);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail2:
+fail1:
+    ReleaseMutex(&Context->Mutex);
+
+    return status;
+}
+
+static NTSTATUS
+PvdeviceAcquire(
+    IN  PINTERFACE              Interface
+    )
+{
+    PXENFILT_PVDEVICE_CONTEXT   Context = Interface->Context;
+    KIRQL                       Irql;
+    NTSTATUS                    status;
+
+    KeAcquireSpinLock(&Context->Lock, &Irql);
+
+    if (Context->References++ != 0)
+        goto done;
+
+    Trace("====>\n");
+
+    status = XENFILT_EMULATED(Acquire, &Context->EmulatedInterface);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Trace("<====\n");
+
+done:
+    KeReleaseSpinLock(&Context->Lock, Irql);
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    KeReleaseSpinLock(&Context->Lock, Irql);
+
+    return status;
+}
+
+static VOID
+PvdeviceRelease(
+    IN  PINTERFACE              Interface
+    )
+{
+    PXENFILT_PVDEVICE_CONTEXT   Context = Interface->Context;
+    KIRQL                       Irql;
+
+    KeAcquireSpinLock(&Context->Lock, &Irql);
+
+    if (--Context->References > 0)
+        goto done;
+
+    Trace("====>\n");
+
+    XENFILT_EMULATED(Release, &Context->EmulatedInterface);
+
+    Trace("<====\n");
+
+done:
+    KeReleaseSpinLock(&Context->Lock, Irql);
+}
+
+static struct _XENFILT_PVDEVICE_INTERFACE_V1 PvdeviceInterfaceVersion1 = {
+    { sizeof (struct _XENFILT_PVDEVICE_INTERFACE_V1), 1, NULL, NULL, NULL },
+    PvdeviceAcquire,
+    PvdeviceRelease,
+    PvdeviceGetActive,
+    PvdeviceSetActive,
+    PvdeviceClearActive
+};
+
+NTSTATUS
+PvdeviceInitialize(
+    OUT PXENFILT_PVDEVICE_CONTEXT   *Context
+    )
+{
+    NTSTATUS                        status;
+
+    Trace("====>\n");
+
+    *Context = __PvdeviceAllocate(sizeof (XENFILT_PVDEVICE_CONTEXT));
+
+    status = STATUS_NO_MEMORY;
+    if (*Context == NULL)
+        goto fail1;
+
+    status = EmulatedGetInterface(DriverGetEmulatedContext(),
+                                  XENFILT_EMULATED_INTERFACE_VERSION_MAX,
+                                  (PINTERFACE)&(*Context)->EmulatedInterface,
+                                  sizeof ((*Context)->EmulatedInterface));
+    ASSERT(NT_SUCCESS(status));
+
+    KeInitializeSpinLock(&(*Context)->Lock);
+    InitializeMutex(&(*Context)->Mutex);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+NTSTATUS
+PvdeviceGetInterface(
+    IN      PXENFILT_PVDEVICE_CONTEXT   Context,
+    IN      ULONG                       Version,
+    IN OUT  PINTERFACE                  Interface,
+    IN      ULONG                       Size
+    )
+{
+    NTSTATUS                            status;
+
+    ASSERT(Context != NULL);
+
+    switch (Version) {
+    case 1: {
+        struct _XENFILT_PVDEVICE_INTERFACE_V1   *PvdeviceInterface;
+
+        PvdeviceInterface = (struct _XENFILT_PVDEVICE_INTERFACE_V1 *)Interface;
+
+        status = STATUS_BUFFER_OVERFLOW;
+        if (Size < sizeof (struct _XENFILT_PVDEVICE_INTERFACE_V1))
+            break;
+
+        *PvdeviceInterface = PvdeviceInterfaceVersion1;
+
+        ASSERT3U(Interface->Version, ==, Version);
+        Interface->Context = Context;
+
+        status = STATUS_SUCCESS;
+        break;
+    }
+    default:
+        status = STATUS_NOT_SUPPORTED;
+        break;
+    }
+
+    return status;
+}
+
+VOID
+PvdeviceTeardown(
+    IN  PXENFILT_PVDEVICE_CONTEXT   Context
+    )
+{
+    Trace("====>\n");
+
+    RtlZeroMemory(&Context->Mutex, sizeof (MUTEX));
+    RtlZeroMemory(&Context->Lock, sizeof (KSPIN_LOCK));
+
+    RtlZeroMemory(&Context->EmulatedInterface,
+                  sizeof (XENFILT_EMULATED_INTERFACE));
+
+    ASSERT(IsZeroMemory(Context, sizeof (XENFILT_PVDEVICE_CONTEXT)));
+    __PvdeviceFree(Context);
+
+    Trace("<====\n");
+}
diff --git a/src/xenfilt/pvdevice.h b/src/xenfilt/pvdevice.h
new file mode 100644
index 0000000..30cd81c
--- /dev/null
+++ b/src/xenfilt/pvdevice.h
@@ -0,0 +1,59 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XENFILT_PVDEVICE_H
+#define _XENFILT_PVDEVICE_H
+
+#include <ntddk.h>
+#include <xen.h>
+#include <pvdevice_interface.h>
+
+typedef struct _XENFILT_PVDEVICE_CONTEXT XENFILT_PVDEVICE_CONTEXT, *PXENFILT_PVDEVICE_CONTEXT;
+
+extern NTSTATUS
+PvdeviceInitialize(
+    OUT PXENFILT_PVDEVICE_CONTEXT   *Context
+    );
+
+extern NTSTATUS
+PvdeviceGetInterface(
+    IN      PXENFILT_PVDEVICE_CONTEXT   Context,
+    IN      ULONG                       Version,
+    IN OUT  PINTERFACE                  Interface,
+    IN      ULONG                       Size
+    );
+
+extern VOID
+PvdeviceTeardown(
+    IN  PXENFILT_PVDEVICE_CONTEXT   Context
+    );
+
+#endif  // _XENFILT_PVDEVICE_H
diff --git a/vs2012/xenbus/xenbus.vcxproj b/vs2012/xenbus/xenbus.vcxproj
index 82f0dbf..b4fe992 100644
--- a/vs2012/xenbus/xenbus.vcxproj
+++ b/vs2012/xenbus/xenbus.vcxproj
@@ -83,6 +83,7 @@
     <ClCompile Include="..\..\src\xenbus\evtchn_2l.c" />
     <ClCompile Include="..\..\src\xenbus\evtchn_fifo.c" />
     <ClCompile Include="..\..\src\xenbus\fdo.c" />
+    <ClCompile Include="..\..\src\xenbus\filters.c" />
     <ClCompile Include="..\..\src\xenbus\gnttab.c" />
     <ClCompile Include="..\..\src\xenbus\pdo.c" />
     <ClCompile Include="..\..\src\xenbus\shared_info.c" />
diff --git a/vs2012/xenfilt/xenfilt.vcxproj b/vs2012/xenfilt/xenfilt.vcxproj
index 4d5747d..6554ec9 100644
--- a/vs2012/xenfilt/xenfilt.vcxproj
+++ b/vs2012/xenfilt/xenfilt.vcxproj
@@ -69,6 +69,7 @@
     <ClCompile Include="../../src/common/registry.c" />
     <ClCompile Include="../../src/xenfilt/driver.c" />
     <ClCompile Include="../../src/xenfilt/emulated.c" />
+    <ClCompile Include="../../src/xenfilt/pvdevice.c" />
     <ClCompile Include="../../src/xenfilt/fdo.c" />
     <ClCompile Include="../../src/xenfilt/pdo.c" />
     <ClCompile Include="../../src/xenfilt/thread.c" />
diff --git a/vs2013/xenbus/xenbus.vcxproj b/vs2013/xenbus/xenbus.vcxproj
index fb0b0dd..f6e0575 100644
--- a/vs2013/xenbus/xenbus.vcxproj
+++ b/vs2013/xenbus/xenbus.vcxproj
@@ -86,6 +86,7 @@
     <ClCompile Include="..\..\src\xenbus\evtchn_2l.c" />
     <ClCompile Include="..\..\src\xenbus\evtchn_fifo.c" />
     <ClCompile Include="..\..\src\xenbus\fdo.c" />
+    <ClCompile Include="..\..\src\xenbus\filters.c" />
     <ClCompile Include="..\..\src\xenbus\gnttab.c" />
     <ClCompile Include="..\..\src\xenbus\pdo.c" />
     <ClCompile Include="..\..\src\xenbus\shared_info.c" />
diff --git a/vs2013/xenfilt/xenfilt.vcxproj b/vs2013/xenfilt/xenfilt.vcxproj
index 4f749b1..6250fcb 100644
--- a/vs2013/xenfilt/xenfilt.vcxproj
+++ b/vs2013/xenfilt/xenfilt.vcxproj
@@ -72,6 +72,7 @@
     <ClCompile Include="../../src/common/registry.c" />
     <ClCompile Include="../../src/xenfilt/driver.c" />
     <ClCompile Include="../../src/xenfilt/emulated.c" />
+    <ClCompile Include="../../src/xenfilt/pvdevice.c" />
     <ClCompile Include="../../src/xenfilt/fdo.c" />
     <ClCompile Include="../../src/xenfilt/pdo.c" />
     <ClCompile Include="../../src/xenfilt/thread.c" />
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:51:45 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:51:45 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwJ7-0004mh-Su; Wed, 22 Jul 2015 15:51:45 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwJ6-0004kz-3d
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:51:44 +0000
Received: from [85.158.137.68] by server-3.bemta-3.messagelabs.com id
	3A/26-03035-F0CBFA55; Wed, 22 Jul 2015 15:51:43 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-11.tower-31.messagelabs.com!1437580299!28327177!1
X-Originating-IP: [209.85.212.175]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21307 invoked from network); 22 Jul 2015 15:51:39 -0000
Received: from mail-wi0-f175.google.com (HELO mail-wi0-f175.google.com)
	(209.85.212.175)
	by server-11.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:51:39 -0000
Received: by wibxm9 with SMTP id xm9so109206555wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:51:39 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=W0RPev/sP01CHttHaJyyucIAV2Zr4UaTpug5T3miVMI=;
	b=iPhjXnD60JaVNO92YmT3Cm6RQ9DHPlixMiM/lpOC6+DpOjQmsQxat97qiJyYoW9erJ
	0uFrXohPLGok3e1pPPwU6XLtz5bqdI9sYPOyFfWglRphwygTO20M5y3yoPw863IL+p8d
	3JIAjko9qKE74JfsMoF0efI3nFxuyckz+k0f/OJzYL6xQHiHP8ypHZwr9E1l1JL4gkuP
	sPD9aABLbzNusABP0gM3Ic/va3JbXofZJGcBZ+abJGSiV54KeP8n9RTAGtC8gTlxNsBi
	x0aiREHyoKzKlacoN9N6JtF93pMYSRGN8AfaXwRRKaG/4wiM5uGp8806aA6LsFB4mZyC
	aEBw==
X-Received: by 10.180.20.15 with SMTP id j15mr7783697wie.76.1437580299263;
	Wed, 22 Jul 2015 08:51:39 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	bg6sm3015292wjc.13.2015.07.22.08.51.37
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:51:38 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:51:29 +0100
Message-Id: <1437580291-5576-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437580291-5576-1-git-send-email-paul.durrant@citrix.com>
References: <1437580291-5576-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/4] Move filter installation and active
	device selection logic into drivers
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

When XENBUS creates its FDO object it will query up to XENFILT for a new
PDEVICE interface. This is used for getting/setting the active device
instance.

If the query fails then it is taken to mean that XENFILT has not been
installed into the system class UpperFilters and so this is done, and a
reboot requested (the FDO creation succeeding but remaining inactive).

If the query succeeds then the code attempts to get the active device
instance. If that succeeds then then the FDO identity is checked to see if
it should be active. If, however, it fails then the code attempts to
claim the active device instance.

When XENBUS destroys its FDO object then the active device instance is
cleared (if the FDO was active) and XENFILT is removed from UpperFilters.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/pvdevice_interface.h   | 132 +++++++++
 src/coinst/coinst.c            | 651 ++++-------------------------------------
 src/xen/driver.c               | 136 ++++++---
 src/xenbus/driver.c            | 314 ++++----------------
 src/xenbus/driver.h            |  15 +
 src/xenbus/fdo.c               | 298 ++++++++++++++++---
 src/xenbus/fdo.h               |   3 +-
 src/xenbus/filters.c           | 319 ++++++++++++++++++++
 src/xenbus/filters.h           |  45 +++
 src/xenbus/pdo.c               |   2 +-
 src/xenfilt/driver.c           | 273 ++++++-----------
 src/xenfilt/driver.h           |  21 +-
 src/xenfilt/emulated.c         |  39 +--
 src/xenfilt/emulated.h         |   4 +-
 src/xenfilt/fdo.c              |  75 ++---
 src/xenfilt/fdo.h              |   9 +-
 src/xenfilt/pdo.c              | 131 +++++----
 src/xenfilt/pdo.h              |   4 +-
 src/xenfilt/pvdevice.c         | 439 +++++++++++++++++++++++++++
 src/xenfilt/pvdevice.h         |  59 ++++
 vs2012/xenbus/xenbus.vcxproj   |   1 +
 vs2012/xenfilt/xenfilt.vcxproj |   1 +
 vs2013/xenbus/xenbus.vcxproj   |   1 +
 vs2013/xenfilt/xenfilt.vcxproj |   1 +
 24 files changed, 1726 insertions(+), 1247 deletions(-)
 create mode 100644 include/pvdevice_interface.h
 create mode 100644 src/xenbus/filters.c
 create mode 100644 src/xenbus/filters.h
 create mode 100644 src/xenfilt/pvdevice.c
 create mode 100644 src/xenfilt/pvdevice.h

diff --git a/include/pvdevice_interface.h b/include/pvdevice_interface.h
new file mode 100644
index 0000000..9024396
--- /dev/null
+++ b/include/pvdevice_interface.h
@@ -0,0 +1,132 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*! \file pvdevice_interface.h
+    \brief XENFILT PVDEVICE Interface
+
+    This interface provides primitives to determine whether a pvdevice
+    device is active (and claim the active device id if not)
+*/
+
+#ifndef _XENFILT_PVDEVICE_INTERFACE_H
+#define _XENFILT_PVDEVICE_INTERFACE_H
+
+#ifndef _WINDLL
+
+/*! \typedef XENFILT_PVDEVICE_ACQUIRE
+    \brief Acquire a reference to the PVDEVICE interface
+
+    \param Interface The interface header
+*/
+typedef NTSTATUS
+(*XENFILT_PVDEVICE_ACQUIRE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENFILT_PVDEVICE_RELEASE
+    \brief Release a reference to the PVDEVICE interface
+
+    \param Interface The interface header
+*/
+typedef VOID
+(*XENFILT_PVDEVICE_RELEASE)(
+    IN  PINTERFACE  Interface
+    );
+
+/*! \typedef XENFILT_PVDEVICE_GET_ACTIVE
+    \brief Get the active device instance
+
+    \param Interface The interface header
+    \param DeviceID A buffer of length MAXNAMELEN to receive the device id
+    \param InstanceID A buffer of length MAXNAMELEN to receive the instance id
+*/
+typedef NTSTATUS
+(*XENFILT_PVDEVICE_GET_ACTIVE)(
+    IN  PVOID   Context,
+    OUT PCHAR   DeviceID,
+    OUT PCHAR   InstanceID
+    );
+
+/*! \typedef XENFILT_PVDEVICE_SET_ACTIVE
+    \brief Set the active device instance
+
+    \param Interface The interface header
+    \param DeviceID Buffer containing the device id
+    \param InstanceID Buffer containing the instance id
+*/
+typedef NTSTATUS
+(*XENFILT_PVDEVICE_SET_ACTIVE)(
+    IN  PVOID   Context,
+    IN  PCHAR   DeviceID,
+    IN  PCHAR   InstanceID
+    );
+
+/*! \typedef XENFILT_PVDEVICE_CLEAR_ACTIVE
+    \brief Clear the active device instance
+
+    \param Interface The interface header
+*/
+typedef NTSTATUS
+(*XENFILT_PVDEVICE_CLEAR_ACTIVE)(
+    IN  PVOID   Context
+    );
+
+// {7d09b250-898f-4fea-b7fa-e0490e46f95f}
+DEFINE_GUID(GUID_XENFILT_PVDEVICE_INTERFACE,
+0x7d09b250, 0x898f, 0x4fea, 0xb7, 0xfa, 0xe0, 0x49, 0x0e, 0x46, 0xf9, 0x5f);
+
+/*! \struct _XENFILT_PVDEVICE_INTERFACE_V1
+    \brief PVDEVICE interface version 1
+    \ingroup interfaces
+*/
+struct _XENFILT_PVDEVICE_INTERFACE_V1 {
+    INTERFACE                       Interface;
+    XENFILT_PVDEVICE_ACQUIRE        PvdeviceAcquire;
+    XENFILT_PVDEVICE_RELEASE        PvdeviceRelease;
+    XENFILT_PVDEVICE_GET_ACTIVE     PvdeviceGetActive;
+    XENFILT_PVDEVICE_SET_ACTIVE     PvdeviceSetActive;
+    XENFILT_PVDEVICE_CLEAR_ACTIVE   PvdeviceClearActive;
+};
+
+typedef struct _XENFILT_PVDEVICE_INTERFACE_V1 XENFILT_PVDEVICE_INTERFACE, *PXENFILT_PVDEVICE_INTERFACE;
+
+/*! \def XENFILT_PVDEVICE
+    \brief Macro at assist in method invocation
+*/
+#define XENFILT_PVDEVICE(_Method, _Interface, ...)    \
+    (_Interface)->Pvdevice ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
+
+#endif  // _WINDLL
+
+#define XENFILT_PVDEVICE_INTERFACE_VERSION_MIN  1
+#define XENFILT_PVDEVICE_INTERFACE_VERSION_MAX  1
+
+#endif  // _XENFILT_PVDEVICE_INTERFACE_H
diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 2b980a1..5e6f719 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -49,12 +49,6 @@ __user_code;
 
 #define SERVICES_KEY "SYSTEM\\CurrentControlSet\\Services"
 
-#define SERVICE_KEY(_Driver)    \
-        SERVICES_KEY ## "\\" ## #_Driver
-
-#define PARAMETERS_KEY(_Driver) \
-        SERVICE_KEY(_Driver) ## "\\Parameters"
-
 #define CONTROL_KEY "SYSTEM\\CurrentControlSet\\Control"
 
 #define CLASS_KEY   \
@@ -758,289 +752,6 @@ fail1:
     return FALSE;
 }
 
-static BOOLEAN
-GetActiveDeviceInstanceID(
-    OUT PTCHAR  *DeviceID,
-    OUT PTCHAR  *InstanceID
-    )
-{
-    HKEY        ParametersKey;
-    DWORD       MaxValueLength;
-    DWORD       DeviceIDLength;
-    DWORD       InstanceIDLength;
-    DWORD       Type;
-    HRESULT     Error;
-
-    Error = RegCreateKeyEx(HKEY_LOCAL_MACHINE,
-                           PARAMETERS_KEY(XENBUS),
-                           0,
-                           NULL,
-                           REG_OPTION_NON_VOLATILE,
-                           KEY_ALL_ACCESS,
-                           NULL,
-                           &ParametersKey,
-                           NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Error = RegQueryInfoKey(ParametersKey,
-                            NULL,
-                            NULL,
-                            NULL,    
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            NULL,
-                            &MaxValueLength,
-                            NULL,
-                            NULL);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-       
-    DeviceIDLength = MaxValueLength + sizeof (TCHAR);
-
-    *DeviceID = calloc(1, DeviceIDLength);
-    if (*DeviceID == NULL)
-        goto fail3;
-
-    Error = RegQueryValueEx(ParametersKey,
-                            "ActiveDeviceID",
-                            NULL,
-                            &Type,
-                            (LPBYTE)*DeviceID,
-                            &DeviceIDLength);
-    if (Error != ERROR_SUCCESS || Type != REG_SZ) {
-        free(*DeviceID);
-        *DeviceID = NULL;
-    }
-
-    InstanceIDLength = MaxValueLength + sizeof (TCHAR);
-
-    *InstanceID = calloc(1, InstanceIDLength);
-    if (*InstanceID == NULL)
-        goto fail4;
-
-    Error = RegQueryValueEx(ParametersKey,
-                            "ActiveInstanceID",
-                            NULL,
-                            &Type,
-                            (LPBYTE)*InstanceID,
-                            &InstanceIDLength);
-    if (Error != ERROR_SUCCESS || Type != REG_SZ) {
-        free(*InstanceID);
-        *InstanceID = NULL;
-    }
-
-    Log("DeviceID = %s", (*DeviceID != NULL) ? *DeviceID : "NOT SET");
-    Log("InstanceID = %s", (*InstanceID != NULL) ? *InstanceID : "NOT SET");
-
-    RegCloseKey(ParametersKey);
-
-    return TRUE;
-
-fail4:
-    Log("fail4");
-
-    if (*DeviceID != NULL) {
-        free(*DeviceID);
-        *DeviceID = NULL;
-    }
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(ParametersKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-SetActiveDeviceInstanceID(
-    IN  PTCHAR  DeviceID,
-    IN  PTCHAR  InstanceID
-    )
-{
-    PTCHAR      DeviceName;
-    BOOLEAN     Success;
-    DWORD       DeviceIDLength;
-    DWORD       InstanceIDLength;
-    HKEY        ParametersKey;
-    HRESULT     Error;
-
-    Log("DeviceID = %s", DeviceID);
-    Log("InstanceID = %s", InstanceID);
-
-    DeviceName = strchr(DeviceID, '\\');
-    assert(DeviceName != NULL);
-    DeviceName++;
-
-    // Check whether we are binding to the XenServer vendor device
-    if (strncmp(DeviceName,
-                XENSERVER_VENDOR_DEVICE_NAME,
-                strlen(XENSERVER_VENDOR_DEVICE_NAME)) != 0) {
-        PTCHAR  DeviceKeyName;
-
-        // We are binding to a legacy platform device so only make it
-        // active if there is no XenServer vendor device
-        Success = GetDeviceKeyName("PCI",
-                                   XENSERVER_VENDOR_DEVICE_NAME,
-                                   &DeviceKeyName);
-        if (!Success)
-            goto fail1;
-
-        if (DeviceKeyName != NULL) {
-            Log("ignoring");
-            free(DeviceKeyName);
-            goto done;
-        }
-    }
-
-    DeviceIDLength = (DWORD)((strlen(DeviceID) +
-                              1) * sizeof (TCHAR));
-    InstanceIDLength = (DWORD)((strlen(InstanceID) +
-                                1) * sizeof (TCHAR));
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         PARAMETERS_KEY(XENBUS),
-                         0,
-                         KEY_ALL_ACCESS,
-                         &ParametersKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    Error = RegSetValueEx(ParametersKey,
-                          "ActiveDeviceID",
-                          0,
-                          REG_SZ,
-                          (LPBYTE)DeviceID,
-                          DeviceIDLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    Error = RegSetValueEx(ParametersKey,
-                          "ActiveInstanceID",
-                          0,
-                          REG_SZ,
-                          (LPBYTE)InstanceID,
-                          InstanceIDLength);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail4;
-    }
-
-    RegCloseKey(ParametersKey);
-
-done:
-    return TRUE;
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-    RegCloseKey(ParametersKey);
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
-ClearActiveDeviceInstanceID(
-    VOID
-    )
-{
-    HKEY        ParametersKey;
-    HRESULT     Error;
-
-    Log("<===>");
-
-    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
-                         PARAMETERS_KEY(XENBUS),
-                         0,
-                         KEY_ALL_ACCESS,
-                         &ParametersKey);
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail1;
-    }
-
-    Error = RegDeleteValue(ParametersKey,
-                           "ActiveDeviceID");
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail2;
-    }
-
-    Error = RegDeleteValue(ParametersKey,
-                           "ActiveInstanceID");
-    if (Error != ERROR_SUCCESS) {
-        SetLastError(Error);
-        goto fail3;
-    }
-
-    RegCloseKey(ParametersKey);
-
-    return TRUE;
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-    RegCloseKey(ParametersKey);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
 static PTCHAR
 GetProperty(
     IN  HDEVINFO            DeviceInfoSet,
@@ -1604,217 +1315,80 @@ fail1:
 }
 
 static BOOLEAN
-InstallFilter(
-    IN  const GUID  *Guid,
-    IN  PTCHAR      Filter
+CheckStatus(
+    IN  PTCHAR      DriverName,
+    OUT PBOOLEAN    NeedReboot
     )
 {
+    TCHAR           StatusKeyName[MAX_PATH];
+    HKEY            StatusKey;
+    HRESULT         Result;
     HRESULT         Error;
+    DWORD           ValueLength;
+    DWORD           Value;
     DWORD           Type;
-    DWORD           OldLength;
-    DWORD           NewLength;
-    PTCHAR          UpperFilters;
-    ULONG           Offset;
-
-    if (!SetupDiGetClassRegistryProperty(Guid,
-                                         SPCRP_UPPERFILTERS,
-                                         &Type,
-                                         NULL,
-                                         0,
-                                         &OldLength,
-                                         NULL,
-                                         NULL)) {
-        Error = GetLastError();
-
-        if (Error == ERROR_INVALID_DATA) {
-            Type = REG_MULTI_SZ;
-            OldLength = sizeof (TCHAR);
-        } else if (Error != ERROR_INSUFFICIENT_BUFFER) {
-            goto fail1;
-        }
-    }
-
-    if (Type != REG_MULTI_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail2;
-    }
-
-    NewLength = OldLength + (DWORD)((strlen(Filter) + 1) * sizeof (TCHAR));
-
-    UpperFilters = calloc(1, NewLength);
-    if (UpperFilters == NULL)
-        goto fail3;
-
-    Offset = 0;
-    if (OldLength != sizeof (TCHAR)) {
-        if (!SetupDiGetClassRegistryProperty(Guid,
-                                             SPCRP_UPPERFILTERS,
-                                             &Type,
-                                             (PBYTE)UpperFilters,
-                                             OldLength,
-                                             NULL,
-                                             NULL,
-                                             NULL))
-            goto fail4;
 
-        while (UpperFilters[Offset] != '\0') {
-            ULONG   FilterLength;
-
-            FilterLength = (ULONG)strlen(&UpperFilters[Offset]) / sizeof (TCHAR);
-
-            if (_stricmp(&UpperFilters[Offset], Filter) == 0) {
-                Log("%s already present", Filter);
-                goto done;
-            }
-
-            Offset += FilterLength + 1;
-        }
-    }
-
-    memmove(&UpperFilters[Offset], Filter, strlen(Filter));
-    Log("added %s", Filter);
-
-    if (!SetupDiSetClassRegistryProperty(Guid,
-                                         SPCRP_UPPERFILTERS,
-                                         (PBYTE)UpperFilters,
-                                         NewLength,
-                                         NULL,
-                                         NULL))
-        goto fail5;
-
-done:
-    free(UpperFilters);
-
-    return TRUE;
-
-fail5:
-    Log("fail5");
-
-fail4:
-    Log("fail4");
-
-    free(UpperFilters);
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
+    Result = StringCbPrintf(StatusKeyName,
+                            MAX_PATH,
+                            SERVICES_KEY "\\%s\\Status",
+                            DriverName);
+    assert(SUCCEEDED(Result));
 
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
+    Error = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                         StatusKeyName,
+                         0,
+                         KEY_READ,
+                         &StatusKey);
+    if (Error != ERROR_SUCCESS) {
+        SetLastError(Error);
+        goto fail1;
     }
 
-    return FALSE;
-}
+    ValueLength = sizeof (Value);
 
-static BOOLEAN
-RemoveFilter(
-    IN  const GUID  *Guid,
-    IN  PTCHAR      Filter
-    )
-{
-    HRESULT         Error;
-    DWORD           Type;
-    DWORD           OldLength;
-    DWORD           NewLength;
-    PTCHAR          UpperFilters;
-    ULONG           Offset;
-    ULONG           FilterLength;
-
-    if (!SetupDiGetClassRegistryProperty(Guid,
-                                         SPCRP_UPPERFILTERS,
-                                         &Type,
-                                         NULL,
-                                         0,
-                                         &OldLength,
-                                         NULL,
-                                         NULL)) {
-        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
-            goto fail1;
+    Error = RegQueryValueEx(StatusKey,
+                            "NeedReboot",
+                            NULL,
+                            &Type,
+                            (LPBYTE)&Value,
+                            &ValueLength);
+    if (Error != ERROR_SUCCESS) {
+        if (Error == ERROR_FILE_NOT_FOUND) {
+            Type = REG_DWORD;
+            Value = 0;
+        } else {
+            SetLastError(Error);
+            goto fail2;
+        }
     }
 
-    if (Type != REG_MULTI_SZ) {
+    if (Type != REG_DWORD) {
         SetLastError(ERROR_BAD_FORMAT);
-        goto fail2;
-    }
-
-    UpperFilters = calloc(1, OldLength);
-    if (UpperFilters == NULL)
         goto fail3;
-
-    if (!SetupDiGetClassRegistryProperty(Guid,
-                                         SPCRP_UPPERFILTERS,
-                                         &Type,
-                                         (PBYTE)UpperFilters,
-                                         OldLength,
-                                         NULL,
-                                         NULL,
-                                         NULL))
-        goto fail4;
-
-    Offset = 0;
-    FilterLength = 0;
-    while (UpperFilters[Offset] != '\0') {
-        FilterLength = (ULONG)strlen(&UpperFilters[Offset]) / sizeof (TCHAR);
-
-        if (_stricmp(&UpperFilters[Offset], Filter) == 0)
-            goto remove;
-
-        Offset += FilterLength + 1;
     }
 
-    goto done;
-
-remove:
-    NewLength = OldLength - ((FilterLength + 1) * sizeof (TCHAR));
+    *NeedReboot = (Value != 0) ? TRUE : FALSE;
 
-    memmove(&UpperFilters[Offset],
-            &UpperFilters[Offset + FilterLength + 1],
-            (NewLength - Offset) * sizeof (TCHAR));
+    if (*NeedReboot)
+        Log("NeedReboot");
 
-    Log("removed %s", Filter);
-
-    if (!SetupDiSetClassRegistryProperty(Guid,
-                                         SPCRP_UPPERFILTERS,
-                                         (PBYTE)UpperFilters,
-                                         NewLength,
-                                         NULL,
-                                         NULL))
-        goto fail5;
-
-done:
-    free(UpperFilters);
+    RegCloseKey(StatusKey);
 
     return TRUE;
 
-fail5:
-    Log("fail5");
-
-fail4:
-    Log("fail4");
-
-    free(UpperFilters);
-
 fail3:
     Log("fail3");
 
 fail2:
     Log("fail2");
 
+    RegCloseKey(StatusKey);
+
 fail1:
     Error = GetLastError();
 
     {
         PTCHAR  Message;
-
         Message = GetErrorMessage(Error);
         Log("fail1 (%s)", Message);
         LocalFree(Message);
@@ -1950,10 +1524,10 @@ DifInstallPreProcess(
     )
 {
     BOOLEAN                         Success;
-    PTCHAR                          DeviceID;
-    PTCHAR                          InstanceID;
     HRESULT                         Error;
 
+    UNREFERENCED_PARAMETER(DeviceInfoSet);
+    UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
     Log("====>");
@@ -1966,42 +1540,10 @@ DifInstallPreProcess(
     if (!Success)
         goto fail2;
 
-    Success = GetActiveDeviceInstanceID(&DeviceID, &InstanceID);
-    if (!Success)
-        goto fail3;
-
-    if (DeviceID == NULL) {
-        assert(InstanceID == NULL);
-
-        Success = GetDeviceInstanceID(DeviceInfoSet, DeviceInfoData,
-                                      &DeviceID, &InstanceID);
-        if (!Success)
-            goto fail4;
-
-        Success = SetActiveDeviceInstanceID(DeviceID, InstanceID);
-        if (!Success)
-            goto fail5;
-    }
-
-    free(DeviceID);
-    free(InstanceID);
-
     Log("<====");
     
     return NO_ERROR;
 
-fail5:
-    Log("fail5");
-
-    free(DeviceID);
-    free(InstanceID);
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
 fail2:
     Log("fail2");
 
@@ -2026,13 +1568,11 @@ DifInstallPostProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
-    HRESULT                         Error;
+    BOOLEAN                         Success;
     PTCHAR                          DeviceID;
     PTCHAR                          InstanceID;
-    PTCHAR                          ActiveDeviceID;
-    PTCHAR                          ActiveInstanceID;
-    BOOLEAN                         Active;
-    BOOLEAN                         Success;
+    BOOLEAN                         NeedReboot;
+    HRESULT                         Error;
 
     UNREFERENCED_PARAMETER(Context);
 
@@ -2047,28 +1587,14 @@ DifInstallPostProcess(
     if (!Success)
         goto fail2;
 
-    Success = GetActiveDeviceInstanceID(&ActiveDeviceID, &ActiveInstanceID);
-    if (!Success)
-        goto fail3;
+    NeedReboot = FALSE;
 
-    if (ActiveDeviceID != NULL) {
-        assert(ActiveInstanceID != NULL);
-        Active = (_stricmp(ActiveDeviceID, DeviceID) == 0 &&
-                  _stricmp(ActiveInstanceID, InstanceID) == 0) ?
-            TRUE :
-            FALSE;
+    (VOID) CheckStatus("XEN", &NeedReboot);
+    if (!NeedReboot)
+        (VOID) CheckStatus("XENBUS", &NeedReboot);
 
-        free(ActiveDeviceID);
-        free(ActiveInstanceID);
-    } else {
-        Active = FALSE;
-    }
-
-    if (Active) {
-        (VOID) InstallFilter(&GUID_DEVCLASS_SYSTEM, "XENFILT");
-        (VOID) InstallFilter(&GUID_DEVCLASS_HDC, "XENFILT");
+    if (NeedReboot)
         (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData);
-    }
 
     free(DeviceID);
     free(InstanceID);
@@ -2077,12 +1603,6 @@ DifInstallPostProcess(
 
     return NO_ERROR;
 
-fail3:
-    Log("fail3");
-
-    free(DeviceID);
-    free(InstanceID);
-
 fail2:
     Log("fail2");
 
@@ -2163,72 +1683,13 @@ DifRemovePreProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
-    BOOLEAN                         Success;
-    PTCHAR                          DeviceID;
-    PTCHAR                          InstanceID;
-    PTCHAR                          ActiveDeviceID;
-    PTCHAR                          ActiveInstanceID;
-    BOOLEAN                         Active;
-    HRESULT                         Error;
-
+    UNREFERENCED_PARAMETER(DeviceInfoSet);
+    UNREFERENCED_PARAMETER(DeviceInfoData);
     UNREFERENCED_PARAMETER(Context);
 
-    Log("====>");
-
-    Success = GetDeviceInstanceID(DeviceInfoSet, DeviceInfoData,
-                                  &DeviceID, &InstanceID);
-    if (!Success)
-        goto fail1;
-
-    Success = GetActiveDeviceInstanceID(&ActiveDeviceID, &ActiveInstanceID);
-    if (!Success)
-        goto fail2;
-
-    if (ActiveDeviceID != NULL) {
-        assert(ActiveInstanceID != NULL);
-        Active = (_stricmp(ActiveDeviceID, DeviceID) == 0 &&
-                  _stricmp(ActiveInstanceID, InstanceID) == 0) ?
-            TRUE :
-            FALSE;
-        
-        free(ActiveDeviceID);
-        free(ActiveInstanceID);
-    } else {
-        Active = FALSE;
-    }
-
-    if (Active) {
-        ClearActiveDeviceInstanceID();
-
-        (VOID) RemoveFilter(&GUID_DEVCLASS_HDC, "XENFILT");
-        (VOID) RemoveFilter(&GUID_DEVCLASS_SYSTEM, "XENFILT");
-    }
-
-    free(DeviceID);
-    free(InstanceID);
-
-    Log("<====");
+    Log("<===>");
 
     return NO_ERROR;
-
-fail2:
-    Log("fail2");
-
-    free(DeviceID);
-    free(InstanceID);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return Error;
 }
 
 static HRESULT
diff --git a/src/xen/driver.c b/src/xen/driver.c
index 9662ff6..187fe1c 100644
--- a/src/xen/driver.c
+++ b/src/xen/driver.c
@@ -55,10 +55,73 @@ typedef struct _XEN_DRIVER {
     PLOG_DISPOSITION    TraceDisposition;
     PLOG_DISPOSITION    InfoDisposition;
     HANDLE              UnplugKey;
+    HANDLE              StatusKey;
 } XEN_DRIVER, *PXEN_DRIVER;
 
 static XEN_DRIVER   Driver;
 
+static FORCEINLINE VOID
+__DriverSetUnplugKey(
+    IN  HANDLE  Key
+    )
+{
+    Driver.UnplugKey = Key;
+}
+
+static FORCEINLINE HANDLE
+__DriverGetUnplugKey(
+    VOID
+    )
+{
+    return Driver.UnplugKey;
+}
+
+HANDLE
+DriverGetUnplugKey(
+    VOID
+    )
+{
+    return __DriverGetUnplugKey();
+}
+
+static FORCEINLINE VOID
+__DriverSetStatusKey(
+    IN  HANDLE  Key
+    )
+{
+    Driver.StatusKey = Key;
+}
+
+static FORCEINLINE HANDLE
+__DriverGetStatusKey(
+    VOID
+    )
+{
+    return Driver.StatusKey;
+}
+
+HANDLE
+DriverGetStatusKey(
+    VOID
+    )
+{
+    return __DriverGetStatusKey();
+}
+
+static FORCEINLINE VOID
+__DriverRequestReboot(
+    VOID
+    )
+{
+    Info("<===>\n");
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    (VOID) RegistryUpdateDwordValue(__DriverGetStatusKey(),
+                                    "NeedReboot",
+                                    1);
+}
+
 XEN_API
 NTSTATUS
 XenTouch(
@@ -102,34 +165,11 @@ done:
 
 fail1:
     Info("MODULE '%s' NOT COMPATIBLE (REBOOT REQUIRED)\n", Name);
+    __DriverRequestReboot();
 
     return STATUS_INCOMPATIBLE_DRIVER_BLOCKED;
 }
 
-static FORCEINLINE VOID
-__DriverSetUnplugKey(
-    IN  HANDLE  Key
-    )
-{
-    Driver.UnplugKey = Key;
-}
-
-static FORCEINLINE HANDLE
-__DriverGetUnplugKey(
-    VOID
-    )
-{
-    return Driver.UnplugKey;
-}
-
-HANDLE
-DriverGetUnplugKey(
-    VOID
-    )
-{
-    return __DriverGetUnplugKey();
-}
-
 static VOID
 DriverOutputBuffer(
     IN  PVOID   Argument,
@@ -152,6 +192,7 @@ DllInitialize(
 {
     HANDLE              ServiceKey;
     HANDLE              UnplugKey;
+    HANDLE              StatusKey;
     NTSTATUS            status;
 
     ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
@@ -210,34 +251,43 @@ DllInitialize(
 
     __DriverSetUnplugKey(UnplugKey);
 
-    status = AcpiInitialize();
+    status = RegistryCreateSubKey(ServiceKey,
+                                  "Status",
+                                  REG_OPTION_VOLATILE,
+                                  &StatusKey);
     if (!NT_SUCCESS(status))
         goto fail5;
 
-    status = SystemInitialize();
+    __DriverSetUnplugKey(UnplugKey);
+
+    status = AcpiInitialize();
     if (!NT_SUCCESS(status))
         goto fail6;
 
-    status = HypercallInitialize();
+    status = SystemInitialize();
     if (!NT_SUCCESS(status))
         goto fail7;
 
-    status = BugCheckInitialize();
+    status = HypercallInitialize();
     if (!NT_SUCCESS(status))
         goto fail8;
 
-    status = ModuleInitialize();
+    status = BugCheckInitialize();
     if (!NT_SUCCESS(status))
         goto fail9;
 
-    status = ProcessInitialize();
+    status = ModuleInitialize();
     if (!NT_SUCCESS(status))
         goto fail10;
 
-    status = UnplugInitialize();
+    status = ProcessInitialize();
     if (!NT_SUCCESS(status))
         goto fail11;
 
+    status = UnplugInitialize();
+    if (!NT_SUCCESS(status))
+        goto fail12;
+
     RegistryCloseKey(ServiceKey);
 
 done:
@@ -245,35 +295,41 @@ done:
 
     return STATUS_SUCCESS;
 
+fail12:
+    Error("fail12\n");
+
+    ProcessTeardown();
+
 fail11:
     Error("fail11\n");
 
-    ProcessTeardown();
+    ModuleTeardown();
 
 fail10:
     Error("fail10\n");
 
-    ModuleTeardown();
+    BugCheckTeardown();
 
 fail9:
     Error("fail9\n");
 
-    BugCheckTeardown();
+    HypercallTeardown();
 
 fail8:
     Error("fail8\n");
 
-    HypercallTeardown();
+    SystemTeardown();
 
 fail7:
     Error("fail7\n");
 
-    SystemTeardown();
+    AcpiTeardown();
 
 fail6:
     Error("fail6\n");
 
-    AcpiTeardown();
+    RegistryCloseKey(StatusKey);
+    __DriverSetStatusKey(NULL);
 
 fail5:
     Error("fail5\n");
@@ -315,6 +371,7 @@ DllUnload(
     VOID
     )
 {
+    HANDLE  StatusKey;
     HANDLE  UnplugKey;
 
     Trace("====>\n");
@@ -334,6 +391,11 @@ DllUnload(
 
     SystemTeardown();
 
+    StatusKey = __DriverGetStatusKey();
+
+    RegistryCloseKey(StatusKey);
+    __DriverSetStatusKey(NULL);
+
     UnplugKey = __DriverGetUnplugKey();
 
     RegistryCloseKey(UnplugKey);
diff --git a/src/xenbus/driver.c b/src/xenbus/driver.c
index a1115a4..6135400 100644
--- a/src/xenbus/driver.c
+++ b/src/xenbus/driver.c
@@ -48,6 +48,7 @@ extern PULONG       InitSafeBootMode;
 typedef struct _XENBUS_DRIVER {
     PDRIVER_OBJECT      DriverObject;
     HANDLE              ParametersKey;
+    HANDLE              StatusKey;
 } XENBUS_DRIVER, *PXENBUS_DRIVER;
 
 static XENBUS_DRIVER    Driver;
@@ -118,6 +119,36 @@ DriverGetParametersKey(
     return __DriverGetParametersKey();
 }
 
+static FORCEINLINE VOID
+__DriverSetStatusKey(
+    IN  HANDLE  Key
+    )
+{
+    Driver.StatusKey = Key;
+}
+
+static FORCEINLINE HANDLE
+__DriverGetStatusKey(
+    VOID
+    )
+{
+    return Driver.StatusKey;
+}
+
+VOID
+DriverRequestReboot(
+    VOID
+    )
+{
+    Info("<===>\n");
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    (VOID) RegistryUpdateDwordValue(__DriverGetStatusKey(),
+                                    "NeedReboot",
+                                    1);
+}
+
 DRIVER_UNLOAD       DriverUnload;
 
 VOID
@@ -126,6 +157,7 @@ DriverUnload(
     )
 {
     HANDLE              ParametersKey;
+    HANDLE              StatusKey;
 
     ASSERT3P(DriverObject, ==, __DriverGetDriverObject());
 
@@ -134,6 +166,11 @@ DriverUnload(
     if (*InitSafeBootMode > 0)
         goto done;
 
+    StatusKey = __DriverGetStatusKey();
+    __DriverSetStatusKey(NULL);
+
+    RegistryCloseKey(StatusKey);
+
     ParametersKey = __DriverGetParametersKey();
 
     RegistryCloseKey(ParametersKey);
@@ -158,203 +195,6 @@ done:
     Trace("<====\n");
 }
 
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-DriverQueryIdCompletion(
-    IN  PDEVICE_OBJECT  DeviceObject,
-    IN  PIRP            Irp,
-    IN  PVOID           Context
-    )
-{
-    PKEVENT             Event = Context;
-
-    UNREFERENCED_PARAMETER(DeviceObject);
-    UNREFERENCED_PARAMETER(Irp);
-
-    KeSetEvent(Event, IO_NO_INCREMENT, FALSE);
-
-    return STATUS_MORE_PROCESSING_REQUIRED;
-}
-
-static NTSTATUS
-DriverQueryId(
-    IN  PDEVICE_OBJECT      PhysicalDeviceObject,
-    IN  BUS_QUERY_ID_TYPE   Type,
-    OUT PVOID               *Information
-    )
-{
-    PDEVICE_OBJECT          DeviceObject;
-    PIRP                    Irp;
-    KEVENT                  Event;
-    PIO_STACK_LOCATION      StackLocation;
-    NTSTATUS                status;
-
-    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
-
-    Trace("====> %s\n", BusQueryIdTypeName(Type));
-
-    DeviceObject = IoGetAttachedDeviceReference(PhysicalDeviceObject);
-
-    Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
-
-    status = STATUS_INSUFFICIENT_RESOURCES;
-    if (Irp == NULL)
-        goto fail1;
-
-    StackLocation = IoGetNextIrpStackLocation(Irp);
-
-    StackLocation->MajorFunction = IRP_MJ_PNP;
-    StackLocation->MinorFunction = IRP_MN_QUERY_ID;
-    StackLocation->Flags = 0;
-    StackLocation->Parameters.QueryId.IdType = Type;
-    StackLocation->DeviceObject = DeviceObject;
-    StackLocation->FileObject = NULL;
-
-    KeInitializeEvent(&Event, NotificationEvent, FALSE);
-
-    IoSetCompletionRoutine(Irp,
-                           DriverQueryIdCompletion,
-                           &Event,
-                           TRUE,
-                           TRUE,
-                           TRUE);
-
-    // Default completion status
-    Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
-
-    status = IoCallDriver(DeviceObject, Irp);
-    if (status == STATUS_PENDING) {
-        (VOID) KeWaitForSingleObject(&Event,
-                                     Executive,
-                                     KernelMode,
-                                     FALSE,
-                                     NULL);
-        status = Irp->IoStatus.Status;
-    } else {
-        ASSERT3U(status, ==, Irp->IoStatus.Status);
-    }
-
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
-    *Information = (PVOID)Irp->IoStatus.Information;
-
-    IoFreeIrp(Irp);
-    ObDereferenceObject(DeviceObject);
-
-    Trace("<====\n");
-
-    return STATUS_SUCCESS;
-
-fail2:
-    Error("fail2\n");
-
-    IoFreeIrp(Irp);
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    ObDereferenceObject(DeviceObject);
-
-    return status;
-}
-
-static NTSTATUS
-DriverGetActiveDeviceInstance(
-    OUT PWCHAR      *DeviceID,
-    OUT PWCHAR      *InstanceID
-    )
-{
-    HANDLE          ParametersKey;
-    PANSI_STRING    Ansi;
-    UNICODE_STRING  Unicode;
-    NTSTATUS        status;
-
-    ParametersKey = __DriverGetParametersKey();
-
-    *DeviceID = NULL;
-    *InstanceID = NULL;
-
-    status = RegistryQuerySzValue(ParametersKey,
-                                  "ActiveDeviceID",
-                                  &Ansi);
-    if (!NT_SUCCESS(status)) {
-        if (status != STATUS_OBJECT_NAME_NOT_FOUND)
-            goto fail1;
-
-        // The active device is not yet set
-        goto done;
-    }
-
-    Unicode.MaximumLength = (USHORT)(Ansi[0].MaximumLength / sizeof (CHAR) * sizeof (WCHAR));
-    Unicode.Buffer = __DriverAllocate(Unicode.MaximumLength);
-
-    status = STATUS_NO_MEMORY;
-    if (Unicode.Buffer == NULL)
-        goto fail2;
-
-    status = RtlAnsiStringToUnicodeString(&Unicode,
-                                          &Ansi[0],
-                                          FALSE);
-    ASSERT(NT_SUCCESS(status));
-
-    RegistryFreeSzValue(Ansi);
-
-    *DeviceID = Unicode.Buffer;
-        
-    status = RegistryQuerySzValue(ParametersKey,
-                                  "ActiveInstanceID",
-                                  &Ansi);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    Unicode.MaximumLength = (USHORT)(Ansi[0].MaximumLength / sizeof (CHAR) * sizeof (WCHAR));
-    Unicode.Buffer = __DriverAllocate(Unicode.MaximumLength);
-
-    status = STATUS_NO_MEMORY;
-    if (Unicode.Buffer == NULL)
-        goto fail4;
-
-    status = RtlAnsiStringToUnicodeString(&Unicode,
-                                          &Ansi[0],
-                                          FALSE);
-    ASSERT(NT_SUCCESS(status));
-
-    RegistryFreeSzValue(Ansi);
-
-    *InstanceID = Unicode.Buffer;
-
-done:        
-    Trace("DeviceID = %ws\n", (*DeviceID != NULL) ? *DeviceID : L"NOT SET");
-    Trace("InstanceID = %ws\n", (*InstanceID != NULL) ? *InstanceID : L"NOT SET");
-
-    return STATUS_SUCCESS;
-
-fail4:
-    Error("fail4\n");
-
-    RegistryFreeSzValue(Ansi);
-
-fail3:
-    Error("fail3\n");
-
-    __DriverFree(*DeviceID);
-    *DeviceID = NULL;
-
-    goto fail1;
-
-fail2:
-    Error("fail2\n");
-
-    RegistryFreeSzValue(Ansi);
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return status;
-}
-
 DRIVER_ADD_DEVICE   DriverAddDevice;
 
 NTSTATUS
@@ -364,76 +204,20 @@ DriverAddDevice(
     IN  PDEVICE_OBJECT  DeviceObject
     )
 {
-    PWCHAR              ActiveDeviceID;
-    PWCHAR              ActiveInstanceID;
-    PWCHAR              DeviceID;
-    PWCHAR              InstanceID;
-    BOOLEAN             Active;
     NTSTATUS            status;
 
     ASSERT3P(DriverObject, ==, __DriverGetDriverObject());
 
     Trace("====>\n");
 
-    status = DriverGetActiveDeviceInstance(&ActiveDeviceID, &ActiveInstanceID);
+    status = FdoCreate(DeviceObject);
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    Active = FALSE;
-
-    if (ActiveDeviceID == NULL) {
-        ASSERT3P(ActiveInstanceID, ==, NULL);
-        goto done;
-    }
-
-    status = DriverQueryId(DeviceObject, BusQueryDeviceID, &DeviceID);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
-    Trace("DeviceID = %ws\n", DeviceID);
-
-    status = DriverQueryId(DeviceObject, BusQueryInstanceID, &InstanceID);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    Trace("InstanceID = %ws\n", InstanceID);
-
-    if (_wcsicmp(DeviceID, ActiveDeviceID) == 0 &&
-        _wcsicmp(InstanceID, ActiveInstanceID) == 0)
-        Active = TRUE;
-
-    ExFreePool(InstanceID);
-
-    ExFreePool(DeviceID);
-
-    __DriverFree(ActiveInstanceID);
-    __DriverFree(ActiveDeviceID);
-
-done:
-    status = FdoCreate(DeviceObject, Active);
-    if (!NT_SUCCESS(status))
-        goto fail4;
-
     Trace("<====\n");
 
     return STATUS_SUCCESS;
 
-fail4:
-    Error("fail4\n");
-
-    goto fail1;
-
-fail3:
-    Error("fail3\n");
-
-    ExFreePool(DeviceID);
-
-fail2:
-    Error("fail2\n");
-
-    __DriverFree(ActiveInstanceID);
-    __DriverFree(ActiveDeviceID);
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -495,6 +279,7 @@ DriverEntry(
 {
     HANDLE              ServiceKey;
     HANDLE              ParametersKey;
+    HANDLE              StatusKey;
     ULONG               Index;
     NTSTATUS            status;
 
@@ -539,12 +324,24 @@ DriverEntry(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    status = RegistryOpenSubKey(ServiceKey, "Parameters", KEY_READ, &ParametersKey);
+    status = RegistryOpenSubKey(ServiceKey,
+                                "Parameters",
+                                KEY_READ,
+                                &ParametersKey);
     if (!NT_SUCCESS(status))
         goto fail3;
 
     __DriverSetParametersKey(ParametersKey);
 
+    status = RegistryCreateSubKey(ServiceKey,
+                                  "Status",
+                                  REG_OPTION_VOLATILE,
+                                  &StatusKey);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    __DriverSetStatusKey(StatusKey);
+
     RegistryCloseKey(ServiceKey);
 
     DriverObject->DriverExtension->AddDevice = DriverAddDevice;
@@ -560,6 +357,13 @@ done:
 
     return STATUS_SUCCESS;
 
+fail4:
+    Error("fail4\n");
+
+    __DriverSetParametersKey(NULL);
+
+    RegistryCloseKey(ParametersKey);
+
 fail3:
     Error("fail3\n");
 
diff --git a/src/xenbus/driver.h b/src/xenbus/driver.h
index 45cbe82..0208f9c 100644
--- a/src/xenbus/driver.h
+++ b/src/xenbus/driver.h
@@ -42,6 +42,21 @@ DriverGetParametersKey(
     VOID
     );
 
+extern VOID
+DriverRequestReboot(
+    VOID
+    );
+
+extern VOID
+DriverAddFilters(
+    VOID
+    );
+
+extern VOID
+DriverRemoveFilters(
+    VOID
+    );
+
 typedef struct _XENBUS_FDO      XENBUS_FDO, *PXENBUS_FDO;
 typedef struct _XENBUS_PDO      XENBUS_PDO, *PXENBUS_PDO;
 
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index e8a6f22..fdb394d 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -38,6 +38,8 @@
 #include <stdlib.h>
 #include <xen.h>
 
+#include <pvdevice_interface.h>
+
 #include "names.h"
 #include "registry.h"
 #include "fdo.h"
@@ -57,6 +59,7 @@
 #include "driver.h"
 #include "range_set.h"
 #include "unplug.h"
+#include "filters.h"
 #include "dbg_print.h"
 #include "assert.h"
 #include "util.h"
@@ -92,7 +95,6 @@ struct _XENBUS_FDO {
     PIRP                            DevicePowerIrp;
 
     CHAR                            VendorName[MAXNAMELEN];
-    BOOLEAN                         Active;
 
     MUTEX                           Mutex;
     ULONG                           References;
@@ -113,6 +115,9 @@ struct _XENBUS_FDO {
     PCM_PARTIAL_RESOURCE_LIST       RawResourceList;
     PCM_PARTIAL_RESOURCE_LIST       TranslatedResourceList;
 
+    XENFILT_PVDEVICE_INTERFACE      PvdeviceInterface;
+    BOOLEAN                         Active;
+
     PXENBUS_SUSPEND_CONTEXT         SuspendContext;
     PXENBUS_SHARED_INFO_CONTEXT     SharedInfoContext;
     PXENBUS_EVTCHN_CONTEXT          EvtchnContext;
@@ -441,19 +446,31 @@ FdoGetBusData(
                                     Length);
 }
 
-static FORCEINLINE VOID
+static FORCEINLINE NTSTATUS
 __FdoSetVendorName(
     IN  PXENBUS_FDO Fdo,
+    IN  USHORT      VendorID,
     IN  USHORT      DeviceID
     )
 {
     NTSTATUS        status;
 
+    status = STATUS_NOT_SUPPORTED;
+    if (VendorID != 'XS')
+        goto fail1;
+
     status = RtlStringCbPrintfA(Fdo->VendorName,
                                 MAXNAMELEN,
                                 "XS%04X",
                                 DeviceID);
     ASSERT(NT_SUCCESS(status));
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
 }
 
 static FORCEINLINE PCHAR
@@ -505,13 +522,161 @@ FdoGetName(
     return __FdoGetName(Fdo);
 }
 
-static FORCEINLINE VOID
-__FdoSetActive(
-    IN  PXENBUS_FDO Fdo,
-    IN  BOOLEAN     Active
+static NTSTATUS
+FdoQueryId(
+    IN  PXENBUS_FDO         Fdo,
+    IN  BUS_QUERY_ID_TYPE   Type,
+    OUT PCHAR               Id
     )
 {
-    Fdo->Active = Active;
+    KEVENT                  Event;
+    IO_STATUS_BLOCK         StatusBlock;
+    PIRP                    Irp;
+    PIO_STACK_LOCATION      StackLocation;
+    NTSTATUS                status;
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    KeInitializeEvent(&Event, NotificationEvent, FALSE);
+    RtlZeroMemory(&StatusBlock, sizeof(IO_STATUS_BLOCK));
+
+    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
+                                       Fdo->LowerDeviceObject,
+                                       NULL,
+                                       0,
+                                       NULL,
+                                       &Event,
+                                       &StatusBlock);
+
+    status = STATUS_UNSUCCESSFUL;
+    if (Irp == NULL)
+        goto fail1;
+
+    StackLocation = IoGetNextIrpStackLocation(Irp);
+    StackLocation->MinorFunction = IRP_MN_QUERY_ID;
+
+    StackLocation->Parameters.QueryId.IdType = Type;
+
+    Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
+
+    status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
+    if (status == STATUS_PENDING) {
+        (VOID) KeWaitForSingleObject(&Event,
+                                     Executive,
+                                     KernelMode,
+                                     FALSE,
+                                     NULL);
+        status = StatusBlock.Status;
+    }
+
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = RtlStringCbPrintfA(Id,
+                                MAXNAMELEN,
+                                "%ws",
+                                (PWCHAR)StatusBlock.Information);
+    ASSERT(NT_SUCCESS(status));
+
+    ExFreePool((PVOID)StatusBlock.Information);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    Error("fail2\n");
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+static NTSTATUS
+FdoSetActive(
+    IN  PXENBUS_FDO Fdo
+    )
+{
+    CHAR            DeviceID[MAX_DEVICE_ID_LEN];
+    CHAR            InstanceID[MAX_DEVICE_ID_LEN];
+    CHAR            ActiveDeviceID[MAX_DEVICE_ID_LEN];
+    CHAR            ActiveInstanceID[MAX_DEVICE_ID_LEN];
+    NTSTATUS        status;
+
+    status = FdoQueryId(Fdo,
+                        BusQueryDeviceID,
+                        DeviceID);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = FdoQueryId(Fdo,
+                        BusQueryInstanceID,
+                        InstanceID);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = XENFILT_PVDEVICE(Acquire, &Fdo->PvdeviceInterface);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = XENFILT_PVDEVICE(GetActive,
+                              &Fdo->PvdeviceInterface,
+                              ActiveDeviceID,
+                              ActiveInstanceID);
+    if (NT_SUCCESS(status)) {
+        if (_stricmp(DeviceID, ActiveDeviceID) != 0)
+            goto done;
+    } else {
+        status = XENFILT_PVDEVICE(SetActive,
+                                  &Fdo->PvdeviceInterface,
+                                  DeviceID,
+                                  InstanceID);
+        if (!NT_SUCCESS(status))
+            goto done;
+    }
+
+    Fdo->Active = TRUE;
+
+done:
+    XENFILT_PVDEVICE(Release, &Fdo->PvdeviceInterface);
+
+    return STATUS_SUCCESS;
+
+fail3:
+    Error("fail3\n");
+
+fail2:
+    Error("fail2\n");
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+static NTSTATUS
+FdoClearActive(
+    IN  PXENBUS_FDO Fdo
+    )
+{
+    NTSTATUS        status;
+
+    status = XENFILT_PVDEVICE(Acquire, &Fdo->PvdeviceInterface);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    (VOID) XENFILT_PVDEVICE(ClearActive,
+                            &Fdo->PvdeviceInterface);
+
+    Fdo->Active = FALSE;
+
+    XENFILT_PVDEVICE(Release, &Fdo->PvdeviceInterface);
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
 }
 
 static FORCEINLINE BOOLEAN
@@ -4487,14 +4652,13 @@ done:
 
 NTSTATUS
 FdoCreate(
-    IN  PDEVICE_OBJECT          PhysicalDeviceObject,
-    IN  BOOLEAN                 Active      
+    IN  PDEVICE_OBJECT          PhysicalDeviceObject
     )
 {
     PDEVICE_OBJECT              FunctionDeviceObject;
     PXENBUS_DX                  Dx;
     PXENBUS_FDO                 Fdo;
-    USHORT                      DeviceID;
+    PCI_COMMON_HEADER           Header;
     NTSTATUS                    status;
 
 #pragma prefast(suppress:28197) // Possibly leaking memory 'FunctionDeviceObject'
@@ -4542,60 +4706,81 @@ FdoCreate(
 
     if (FdoGetBusData(Fdo,
                       PCI_WHICHSPACE_CONFIG,
-                      &DeviceID,
-                      FIELD_OFFSET(PCI_COMMON_HEADER, DeviceID),
-                      FIELD_SIZE(PCI_COMMON_HEADER, DeviceID)) == 0)
+                      &Header,
+                      0,
+                      sizeof (PCI_COMMON_HEADER)) == 0)
         goto fail6;
 
-    __FdoSetVendorName(Fdo, DeviceID);
+    status = __FdoSetVendorName(Fdo,
+                                Header.VendorID,
+                                Header.DeviceID);
+    if (!NT_SUCCESS(status))
+        goto fail7;
 
     __FdoSetName(Fdo);
 
-    __FdoSetActive(Fdo, Active);
+    status = FDO_QUERY_INTERFACE(Fdo,
+                                 XENFILT,
+                                 PVDEVICE,
+                                 (PINTERFACE)&Fdo->PvdeviceInterface,
+                                 sizeof (Fdo->PvdeviceInterface),
+                                 TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail8;
+
+    if (Fdo->PvdeviceInterface.Interface.Context == NULL) {
+        (VOID) FiltersInstall();
+        DriverRequestReboot();
+        goto done;
+    }
+
+    status = FdoSetActive(Fdo);
+    if (!NT_SUCCESS(status))
+        goto fail9;
 
     if (!__FdoIsActive(Fdo))
         goto done;
 
     status = DebugInitialize(Fdo, &Fdo->DebugContext);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail10;
 
     status = SuspendInitialize(Fdo, &Fdo->SuspendContext);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail11;
 
     status = SharedInfoInitialize(Fdo, &Fdo->SharedInfoContext);
     if (!NT_SUCCESS(status))
-        goto fail9;
+        goto fail12;
 
     status = EvtchnInitialize(Fdo, &Fdo->EvtchnContext);
     if (!NT_SUCCESS(status))
-        goto fail10;
+        goto fail13;
 
     status = StoreInitialize(Fdo, &Fdo->StoreContext);
     if (!NT_SUCCESS(status))
-        goto fail11;
+        goto fail14;
 
     status = RangeSetInitialize(Fdo, &Fdo->RangeSetContext);
     if (!NT_SUCCESS(status))
-        goto fail12;
+        goto fail15;
 
     status = CacheInitialize(Fdo, &Fdo->CacheContext);
     if (!NT_SUCCESS(status))
-        goto fail13;
+        goto fail16;
 
     status = GnttabInitialize(Fdo, &Fdo->GnttabContext);
     if (!NT_SUCCESS(status))
-        goto fail14;
+        goto fail17;
 
     status = UnplugInitialize(Fdo, &Fdo->UnplugContext);
     if (!NT_SUCCESS(status))
-        goto fail15;
+        goto fail18;
 
     if (FdoIsBalloonEnabled(Fdo)) {
         status = BalloonInitialize(Fdo, &Fdo->BalloonContext);
         if (!NT_SUCCESS(status))
-            goto fail16;
+            goto fail19;
     }
 
     status = DebugGetInterface(__FdoGetDebugContext(Fdo),
@@ -4654,67 +4839,79 @@ done:
 
     return STATUS_SUCCESS;
 
-fail16:
-    Error("fail16\n");
+fail19:
+    Error("fail19\n");
 
     UnplugTeardown(Fdo->UnplugContext);
     Fdo->UnplugContext = NULL;
 
-fail15:
-    Error("fail15\n");
+fail18:
+    Error("fail18\n");
 
     GnttabTeardown(Fdo->GnttabContext);
     Fdo->GnttabContext = NULL;
 
-fail14:
-    Error("fail14\n");
+fail17:
+    Error("fail17\n");
 
     CacheTeardown(Fdo->CacheContext);
     Fdo->CacheContext = NULL;
 
-fail13:
-    Error("fail13\n");
+fail16:
+    Error("fail16\n");
 
     RangeSetTeardown(Fdo->RangeSetContext);
     Fdo->RangeSetContext = NULL;
 
-fail12:
-    Error("fail12\n");
+fail15:
+    Error("fail15\n");
 
     StoreTeardown(Fdo->StoreContext);
     Fdo->StoreContext = NULL;
 
-fail11:
-    Error("fail11\n");
+fail14:
+    Error("fail14\n");
 
     EvtchnTeardown(Fdo->EvtchnContext);
     Fdo->EvtchnContext = NULL;
 
-fail10:
-    Error("fail10\n");
+fail13:
+    Error("fail13\n");
 
     SharedInfoTeardown(Fdo->SharedInfoContext);
     Fdo->SharedInfoContext = NULL;
 
-fail9:
-    Error("fail9\n");
+fail12:
+    Error("fail12\n");
 
     SuspendTeardown(Fdo->SuspendContext);
     Fdo->SuspendContext = NULL;
 
-fail8:
-    Error("fail8\n");
+fail11:
+    Error("fail11\n");
 
     DebugTeardown(Fdo->DebugContext);
     Fdo->DebugContext = NULL;
 
-fail7:
-    Error("fail7\n");
+fail10:
+    Error("fail10\n");
 
-    __FdoSetActive(Fdo, FALSE);
+    Fdo->Active = FALSE;
+
+fail9:
+    Error("fail9\n");
+
+    RtlZeroMemory(&Fdo->PvdeviceInterface,
+                  sizeof (XENFILT_PVDEVICE_INTERFACE));
+
+fail8:
+    Error("fail8\n");
 
     RtlZeroMemory(Fdo->VendorName, MAXNAMELEN);
 
+fail7:
+    Error("fail7\n");
+
 fail6:
     Error("fail6\n");
 
@@ -4831,9 +5028,16 @@ FdoDestroy(
         DebugTeardown(Fdo->DebugContext);
         Fdo->DebugContext = NULL;
 
-        __FdoSetActive(Fdo, FALSE);
+        Fdo->Active = FALSE;
+
+        FdoClearActive(Fdo);
     }
 
+    (VOID) FiltersUninstall();
+
+    RtlZeroMemory(&Fdo->PvdeviceInterface,
+                  sizeof (XENFILT_PVDEVICE_INTERFACE));
+
     RtlZeroMemory(Fdo->VendorName, MAXNAMELEN);
 
     FdoReleaseLowerBusInterface(Fdo);
diff --git a/src/xenbus/fdo.h b/src/xenbus/fdo.h
index 1feef17..96a2250 100644
--- a/src/xenbus/fdo.h
+++ b/src/xenbus/fdo.h
@@ -41,8 +41,7 @@ typedef struct _XENBUS_INTERRUPT XENBUS_INTERRUPT, *PXENBUS_INTERRUPT;
 
 extern NTSTATUS
 FdoCreate(
-    IN  PDEVICE_OBJECT  PhysicalDeviceObject,
-    IN  BOOLEAN         Active
+    IN  PDEVICE_OBJECT  PhysicalDeviceObject
     );
 
 extern VOID
diff --git a/src/xenbus/filters.c b/src/xenbus/filters.c
new file mode 100644
index 0000000..737c839
--- /dev/null
+++ b/src/xenbus/filters.c
@@ -0,0 +1,319 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#define INITGUID 1
+
+#include <ntddk.h>
+#include <ntstrsafe.h>
+#include <devguid.h>
+#include <xen.h>
+
+#include "registry.h"
+#include "driver.h"
+#include "dbg_print.h"
+#include "assert.h"
+#include "util.h"
+
+#define XENBUS_FILTERS_TAG 'TLIF'
+
+static FORCEINLINE PVOID
+__FiltersAllocate(
+    IN  ULONG   Length
+    )
+{
+    return __AllocatePoolWithTag(NonPagedPool, Length, XENBUS_FILTERS_TAG);
+}
+
+static FORCEINLINE VOID
+__FiltersFree(
+    IN  PVOID   Buffer
+    )
+{
+    ExFreePoolWithTag(Buffer, XENBUS_FILTERS_TAG);
+}
+
+#define CLASS_PATH "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\Class"
+
+static NTSTATUS
+FiltersInstallClass(
+    IN  const CHAR  *ClassName,
+    IN  const GUID  *ClassGuid,
+    IN  const CHAR  *DriverName
+    )
+{
+    HANDLE          ClassKey;
+    UNICODE_STRING  Unicode;
+    HANDLE          Key;
+    ULONG           Count;
+    PANSI_STRING    Old;
+    ULONG           Index;
+    PANSI_STRING    New;
+    NTSTATUS        status;
+
+    Trace("====>\n");
+
+    Info("%s %s\n", ClassName, DriverName);
+
+    status = RegistryOpenSubKey(NULL,
+                                CLASS_PATH,
+                                KEY_ALL_ACCESS,
+                                &ClassKey);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = RtlStringFromGUID(ClassGuid, &Unicode);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = RegistryOpenKey(ClassKey,
+                             &Unicode,
+                             KEY_ALL_ACCESS,
+                             &Key);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Count = 0;
+
+    status = RegistryQuerySzValue(Key, "UpperFilters", &Old);
+    if (NT_SUCCESS(status)) {
+        for (Index = 0; Old[Index].Buffer != NULL; Index++) {
+            if (_stricmp(Old[Index].Buffer, DriverName) == 0)
+                goto done;
+
+            Count++;
+        }
+    } else {
+        Old = NULL;
+    }
+
+    New = __FiltersAllocate(sizeof (ANSI_STRING) * (Count + 2));
+
+    status = STATUS_NO_MEMORY;
+    if (New == NULL)
+        goto fail4;
+
+    Index = 0;
+    while (Index < Count) {
+        New[Index] = Old[Index];
+        Index++;
+    }
+
+    RtlInitAnsiString(&New[Index], DriverName);
+
+    status = RegistryUpdateSzValue(Key, "UpperFilters", New);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    __FiltersFree(New);
+
+done:
+    if (Old != NULL)
+        RegistryFreeSzValue(Old);
+
+    RegistryCloseKey(Key);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    RegistryCloseKey(ClassKey);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail5:
+    Error("fail5\n");
+
+    __FiltersFree(New);
+
+fail4:
+    Error("fail4\n");
+
+    if (Old != NULL)
+        RegistryFreeSzValue(Old);
+
+    RegistryCloseKey(Key);
+
+fail3:
+    Error("fail3\n");
+
+    RtlFreeUnicodeString(&Unicode);
+
+fail2:
+    Error("fail2\n");
+
+    RegistryCloseKey(ClassKey);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+#define FILTERS_INSTALL_CLASS(_ClassGuid, _DriverName) \
+        FiltersInstallClass(#_ClassGuid, &GUID_ ## _ClassGuid, (_DriverName))
+
+static NTSTATUS
+FiltersUninstallClass(
+    IN  const CHAR  *ClassName,
+    IN  const GUID  *ClassGuid,
+    IN  const CHAR  *DriverName
+    )
+{
+    HANDLE          ClassKey;
+    UNICODE_STRING  Unicode;
+    HANDLE          Key;
+    ULONG           Count;
+    PANSI_STRING    Old;
+    ULONG           Index;
+    PANSI_STRING    New;
+    NTSTATUS        status;
+
+    Trace("====>\n");
+
+    Info("%s %s\n", ClassName, DriverName);
+
+    status = RegistryOpenSubKey(NULL,
+                                CLASS_PATH,
+                                KEY_ALL_ACCESS,
+                                &ClassKey);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = RtlStringFromGUID(ClassGuid, &Unicode);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = RegistryOpenKey(ClassKey,
+                             &Unicode,
+                             KEY_ALL_ACCESS,
+                             &Key);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    status = RegistryQuerySzValue(Key, "UpperFilters", &Old);
+    if (NT_SUCCESS(status)) {
+        for (Index = 0; Old[Index].Buffer != NULL; Index++) {
+            if (_stricmp(Old[Index].Buffer, DriverName) == 0)
+                goto found;
+        }
+    }
+
+    goto done;
+
+found:
+    Count = 0;
+    for (Index = 0; Old[Index].Buffer != NULL; Index++)
+        Count++;
+
+    New = __FiltersAllocate(sizeof (ANSI_STRING) * Count);
+
+    status = STATUS_NO_MEMORY;
+    if (New == NULL)
+        goto fail4;
+
+    Count = 0;
+    for (Index = 0; Old[Index].Buffer != NULL; Index++) {
+        if (_stricmp(Old[Index].Buffer, DriverName) == 0)
+            continue;
+
+        New[Count] = Old[Index];
+        Count++;
+    }
+
+    status = RegistryUpdateSzValue(Key, "UpperFilters", New);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    __FiltersFree(New);
+
+done:
+    if (Old != NULL)
+        RegistryFreeSzValue(Old);
+
+    RegistryCloseKey(Key);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    RegistryCloseKey(ClassKey);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail5:
+    Error("fail5\n");
+
+    __FiltersFree(New);
+
+fail4:
+    Error("fail4\n");
+
+    if (Old != NULL)
+        RegistryFreeSzValue(Old);
+
+    RegistryCloseKey(Key);
+
+fail3:
+    Error("fail3\n");
+
+    RtlFreeUnicodeString(&Unicode);
+
+fail2:
+    Error("fail2\n");
+
+    RegistryCloseKey(ClassKey);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+#define FILTERS_UNINSTALL_CLASS(_ClassGuid, _DriverName) \
+        FiltersUninstallClass(#_ClassGuid, &GUID_ ## _ClassGuid, (_DriverName))
+
+VOID
+FiltersInstall(
+    VOID
+    )
+{
+    (VOID) FILTERS_INSTALL_CLASS(DEVCLASS_SYSTEM, "XENFILT");
+    (VOID) FILTERS_INSTALL_CLASS(DEVCLASS_HDC, "XENFILT");
+}
+
+VOID
+FiltersUninstall(
+    VOID
+    )
+{
+    (VOID) FILTERS_UNINSTALL_CLASS(DEVCLASS_HDC, "XENFILT");
+    (VOID) FILTERS_UNINSTALL_CLASS(DEVCLASS_SYSTEM, "XENFILT");
+}
diff --git a/src/xenbus/filters.h b/src/xenbus/filters.h
new file mode 100644
index 0000000..a08855b
--- /dev/null
+++ b/src/xenbus/filters.h
@@ -0,0 +1,45 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XENBUS_FILTERS_H
+#define _XENBUS_FILTERS_H
+
+extern NTSTATUS
+FiltersInstall(
+     VOID
+     );
+
+extern NTSTATUS
+FiltersUninstall(
+     VOID
+     );
+
+#endif  // _XENBUS_FILTERS_H
diff --git a/src/xenbus/pdo.c b/src/xenbus/pdo.c
index 8e7f90a..e85732e 100644
--- a/src/xenbus/pdo.c
+++ b/src/xenbus/pdo.c
@@ -448,7 +448,7 @@ PdoDumpRevisions(
              "RANGE_SET v%u "
              "CACHE v%u "
              "GNTTAB v%u "
-             "UNPLUG v%u\n"
+             "UNPLUG v%u "
              "EMULATED v%u\n",
              Revision->Number,
              Revision->SuspendInterfaceVersion,
diff --git a/src/xenfilt/driver.c b/src/xenfilt/driver.c
index f0ffac0..77f719a 100644
--- a/src/xenfilt/driver.c
+++ b/src/xenfilt/driver.c
@@ -30,6 +30,7 @@
  */
 
 #include <ntddk.h>
+#include <ntstrsafe.h>
 #include <procgrp.h>
 #include <xen.h>
 
@@ -38,6 +39,7 @@
 #include "pdo.h"
 #include "driver.h"
 #include "emulated.h"
+#include "pvdevice.h"
 #include "mutex.h"
 #include "dbg_print.h"
 #include "assert.h"
@@ -50,8 +52,6 @@ typedef struct _XENFILT_DRIVER {
     PDRIVER_OBJECT              DriverObject;
     HANDLE                      ParametersKey;
 
-    PCHAR                       ActiveDeviceID;
-    PCHAR                       ActiveInstanceID;
     MUTEX                       Mutex;
     LIST_ENTRY                  List;
     ULONG                       References;
@@ -60,6 +60,9 @@ typedef struct _XENFILT_DRIVER {
 
     PXENFILT_EMULATED_CONTEXT   EmulatedContext;
     XENFILT_EMULATED_INTERFACE  EmulatedInterface;
+
+    PXENFILT_PVDEVICE_CONTEXT   PvdeviceContext;
+    XENFILT_PVDEVICE_INTERFACE  PvdeviceInterface;
 } XENFILT_DRIVER, *PXENFILT_DRIVER;
 
 static XENFILT_DRIVER   Driver;
@@ -155,6 +158,30 @@ DriverGetEmulatedContext(
 }
 
 static FORCEINLINE VOID
+__DriverSetPvdeviceContext(
+    IN  PXENFILT_PVDEVICE_CONTEXT   Context
+    )
+{
+    Driver.PvdeviceContext = Context;
+}
+
+static FORCEINLINE PXENFILT_PVDEVICE_CONTEXT
+__DriverGetPvdeviceContext(
+    VOID
+    )
+{
+    return Driver.PvdeviceContext;
+}
+
+PXENFILT_PVDEVICE_CONTEXT
+DriverGetPvdeviceContext(
+    VOID
+    )
+{
+    return __DriverGetPvdeviceContext();
+}
+
+static FORCEINLINE VOID
 __DriverAcquireMutex(
     VOID
     )
@@ -219,134 +246,51 @@ DriverRemoveFunctionDeviceObject(
     --Driver.References;
 }
 
-#define SERVICES_KEY L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services"
-
-#define SERVICE_KEY(_Driver)    \
-        SERVICES_KEY L"\\" L#_Driver
-
-#define PARAMETERS_KEY(_Driver) \
-        SERVICE_KEY(_Driver) L"\\Parameters"
-
-static NTSTATUS
-DriverSetActiveDeviceInstance(
+static BOOLEAN
+DriverIsActivePresent(
     VOID
     )
 {
-    UNICODE_STRING  Unicode;
-    HANDLE          ParametersKey;
-    PANSI_STRING    Ansi;
-    NTSTATUS        status;
-
-    RtlInitUnicodeString(&Unicode, PARAMETERS_KEY(XENBUS));
-    
-    status = RegistryOpenKey(NULL, &Unicode, KEY_READ, &ParametersKey);
+    CHAR        ActiveDeviceID[MAX_DEVICE_ID_LEN];
+    CHAR        ActiveInstanceID[MAX_DEVICE_ID_LEN];
+    BOOLEAN     Present;
+    NTSTATUS    status;
+
+    status = XENFILT_PVDEVICE(Acquire, &Driver.PvdeviceInterface);
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    status = RegistryQuerySzValue(ParametersKey,
-                                  "ActiveDeviceID",
-                                  &Ansi);
-    if (!NT_SUCCESS(status)) {
-        if (status != STATUS_OBJECT_NAME_NOT_FOUND)
-            goto fail2;
-
-        // The active device is not yet set
-        goto done;
-    }
-
-    Driver.ActiveDeviceID = __DriverAllocate(Ansi[0].MaximumLength);
-
-    status = STATUS_NO_MEMORY;
-    if (Driver.ActiveDeviceID == NULL)
-        goto fail3;
-
-    RtlCopyMemory(Driver.ActiveDeviceID, Ansi[0].Buffer, Ansi[0].Length);
-
-    RegistryFreeSzValue(Ansi);
-        
-    status = RegistryQuerySzValue(ParametersKey,
-                                  "ActiveInstanceID",
-                                  &Ansi);
+    status = XENFILT_EMULATED(Acquire, &Driver.EmulatedInterface);
     if (!NT_SUCCESS(status))
-        goto fail4;
-
-    Driver.ActiveInstanceID = __DriverAllocate(Ansi[0].MaximumLength);
+        goto fail2;
 
-    status = STATUS_NO_MEMORY;
-    if (Driver.ActiveInstanceID == NULL)
-        goto fail5;
+    Present = FALSE;
 
-    RtlCopyMemory(Driver.ActiveInstanceID, Ansi[0].Buffer, Ansi[0].Length);
+    status = XENFILT_PVDEVICE(GetActive,
+                              &Driver.PvdeviceInterface,
+                              ActiveDeviceID,
+                              ActiveInstanceID);
+    if (!NT_SUCCESS(status))
+        goto done;
 
-    RegistryFreeSzValue(Ansi);
+    Present = XENFILT_EMULATED(IsDevicePresent,
+                               &Driver.EmulatedInterface,
+                               ActiveDeviceID,
+                               NULL);
 
 done:
-    if (Driver.ActiveDeviceID != NULL)
-        Info("%s/%s\n", Driver.ActiveDeviceID, Driver.ActiveInstanceID);
-
-    RegistryCloseKey(ParametersKey);
-
-    return STATUS_SUCCESS;
-
-fail5:
-    Error("fail5\n");
-
-    RegistryFreeSzValue(Ansi);
-
-fail4:
-    Error("fail4\n");
-
-    __DriverFree(Driver.ActiveDeviceID);
-    Driver.ActiveDeviceID = NULL;
-
-    goto fail2;
-
-fail3:
-    Error("fail3\n");
+    XENFILT_EMULATED(Release, &Driver.EmulatedInterface);
+    XENFILT_PVDEVICE(Release, &Driver.PvdeviceInterface);
 
-    RegistryFreeSzValue(Ansi);
+    return Present;
 
 fail2:
     Error("fail2\n");
 
-    RegistryCloseKey(ParametersKey);
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
-    return status;
-}
-
-static PCHAR
-__DriverGetActiveDeviceID(
-    VOID
-    )
-{
-    return Driver.ActiveDeviceID;
-}
-
-PCHAR
-DriverGetActiveDeviceID(
-    VOID
-    )
-{
-    return __DriverGetActiveDeviceID();
-}
-
-static FORCEINLINE PCHAR
-__DriverGetActiveInstanceID(
-    VOID
-    )
-{
-    return Driver.ActiveInstanceID;
-}
-
-PCHAR
-DriverGetActiveInstanceID(
-    VOID
-    )
-{
-    return __DriverGetActiveInstanceID();
+    return FALSE;
 }
 
 VOID
@@ -359,7 +303,6 @@ DriverSetFilterState(
     switch (Driver.FilterState) {
     case XENFILT_FILTER_ENABLED: {
         PLIST_ENTRY ListEntry;
-        BOOLEAN     Present;
 
         // Assume all FDOs have enumerated until we know otherwise
         Driver.FilterState = XENFILT_FILTER_PENDING;
@@ -379,15 +322,11 @@ DriverSetFilterState(
         if (Driver.FilterState != XENFILT_FILTER_PENDING)
             break;
 
-        Present = XENFILT_EMULATED(IsDevicePresent,
-                                   &Driver.EmulatedInterface,
-                                   __DriverGetActiveDeviceID(),
-                                   NULL);
+        if (DriverIsActivePresent()) {
+            Info("ACTIVE DEVICE %sPRESENT\n", (!Present) ? "NOT " : "");
 
-        Info("ACTIVE DEVICE %sPRESENT\n", (!Present) ? "NOT " : "");
-
-        if (Present)
             UnplugDevices();
+        }
 
         Info("PENDING\n");
         break;
@@ -446,22 +385,18 @@ DriverUnload(
     RtlZeroMemory(&Driver.List, sizeof (LIST_ENTRY));
     RtlZeroMemory(&Driver.Mutex, sizeof (MUTEX));
 
-    XENFILT_EMULATED(Release, &Driver.EmulatedInterface);
+    RtlZeroMemory(&Driver.PvdeviceInterface,
+                  sizeof (XENFILT_PVDEVICE_INTERFACE));
 
     RtlZeroMemory(&Driver.EmulatedInterface,
                   sizeof (XENFILT_EMULATED_INTERFACE));
 
+    PvdeviceTeardown(Driver.PvdeviceContext);
+    Driver.PvdeviceContext = NULL;
+
     EmulatedTeardown(Driver.EmulatedContext);
     Driver.EmulatedContext = NULL;
 
-    if (Driver.ActiveDeviceID != NULL) {
-        __DriverFree(Driver.ActiveDeviceID);
-        Driver.ActiveDeviceID = NULL;
-
-        __DriverFree(Driver.ActiveInstanceID);
-        Driver.ActiveInstanceID = NULL;
-    }
-
     ParametersKey = __DriverGetParametersKey();
     __DriverSetParametersKey(NULL);
     RegistryCloseKey(ParametersKey);
@@ -507,8 +442,8 @@ DriverQueryIdCompletion(
 static FORCEINLINE NTSTATUS
 DriverQueryId(
     IN  PDEVICE_OBJECT      PhysicalDeviceObject,
-    IN  BUS_QUERY_ID_TYPE   IdType,
-    OUT PVOID               *Information
+    IN  BUS_QUERY_ID_TYPE   Type,
+    OUT PCHAR               Id
     )
 {
     PDEVICE_OBJECT          DeviceObject;
@@ -532,7 +467,7 @@ DriverQueryId(
     StackLocation->MajorFunction = IRP_MJ_PNP;
     StackLocation->MinorFunction = IRP_MN_QUERY_ID;
     StackLocation->Flags = 0;
-    StackLocation->Parameters.QueryId.IdType = IdType;
+    StackLocation->Parameters.QueryId.IdType = Type;
     StackLocation->DeviceObject = DeviceObject;
     StackLocation->FileObject = NULL;
 
@@ -563,7 +498,13 @@ DriverQueryId(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    *Information = (PVOID)Irp->IoStatus.Information;
+    status = RtlStringCbPrintfA(Id,
+                                MAX_DEVICE_ID_LEN,
+                                "%ws",
+                                (PWCHAR)Irp->IoStatus.Information);
+    ASSERT(NT_SUCCESS(status));
+
+    ExFreePool((PVOID)Irp->IoStatus.Information);
 
     IoFreeIrp(Irp);
     ObDereferenceObject(DeviceObject);
@@ -606,10 +547,8 @@ DriverAddDevice(
     )
 {
     HANDLE              ParametersKey;
-    PWCHAR              DeviceID;
-    PWCHAR              InstanceID;
-    UNICODE_STRING      Unicode;
-    ANSI_STRING         Name;
+    CHAR                DeviceID[MAX_DEVICE_ID_LEN];
+    CHAR                InstanceID[MAX_DEVICE_ID_LEN];
     PANSI_STRING        Type;
     NTSTATUS            status;
 
@@ -617,22 +556,20 @@ DriverAddDevice(
 
     ParametersKey = __DriverGetParametersKey();
 
-    status = DriverQueryId(PhysicalDeviceObject, BusQueryDeviceID, &DeviceID);
+    status = DriverQueryId(PhysicalDeviceObject,
+                           BusQueryDeviceID,
+                           DeviceID);
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    status = DriverQueryId(PhysicalDeviceObject, BusQueryInstanceID, &InstanceID);
+    status = DriverQueryId(PhysicalDeviceObject,
+                           BusQueryInstanceID,
+                           InstanceID);
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    RtlInitUnicodeString(&Unicode, DeviceID);
-
-    status = RtlUnicodeStringToAnsiString(&Name, &Unicode, TRUE);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
     status = RegistryQuerySzValue(ParametersKey,
-                                  Name.Buffer,
+                                  DeviceID,
                                   &Type);
     if (NT_SUCCESS(status)) {
         status = FdoCreate(PhysicalDeviceObject,
@@ -641,28 +578,15 @@ DriverAddDevice(
                            DriverGetEmulatedType(Type));
 
         if (!NT_SUCCESS(status))
-            goto fail4;
+            goto fail3;
 
         RegistryFreeSzValue(Type);
     }
 
-    RtlFreeAnsiString(&Name);
-    ExFreePool(InstanceID);
-    ExFreePool(DeviceID);
-
     return STATUS_SUCCESS;
 
-fail4:
-    RegistryFreeSzValue(Type);
-
-    RtlFreeAnsiString(&Name);
-
 fail3:
-    ExFreePool(InstanceID);
-
 fail2:
-    ExFreePool(DeviceID);
-
 fail1:
     return status;
 }
@@ -723,6 +647,7 @@ DriverEntry(
     HANDLE                      ServiceKey;
     HANDLE                      ParametersKey;
     PXENFILT_EMULATED_CONTEXT   EmulatedContext;
+    PXENFILT_PVDEVICE_CONTEXT   PvdeviceContext;
     ULONG                       Index;
     NTSTATUS                    status;
 
@@ -773,26 +698,29 @@ DriverEntry(
 
     __DriverSetParametersKey(ParametersKey);
 
-    status = DriverSetActiveDeviceInstance();
+    status = EmulatedInitialize(&EmulatedContext);
     if (!NT_SUCCESS(status))
         goto fail4;
 
-    status = EmulatedInitialize(&EmulatedContext);
+    __DriverSetEmulatedContext(EmulatedContext);
+
+    status = PvdeviceInitialize(&PvdeviceContext);
     if (!NT_SUCCESS(status))
         goto fail5;
 
-    __DriverSetEmulatedContext(EmulatedContext);
+    __DriverSetPvdeviceContext(PvdeviceContext);
 
     status = EmulatedGetInterface(__DriverGetEmulatedContext(),
                                   XENFILT_EMULATED_INTERFACE_VERSION_MAX,
                                   (PINTERFACE)&Driver.EmulatedInterface,
                                   sizeof (Driver.EmulatedInterface));
     ASSERT(NT_SUCCESS(status));
-    ASSERT(Driver.EmulatedInterface.Interface.Context != NULL);
 
-    status = XENFILT_EMULATED(Acquire, &Driver.EmulatedInterface);
-    if (!NT_SUCCESS(status))
-        goto fail6;
+    status = PvdeviceGetInterface(__DriverGetPvdeviceContext(),
+                                  XENFILT_PVDEVICE_INTERFACE_VERSION_MAX,
+                                  (PINTERFACE)&Driver.PvdeviceInterface,
+                                  sizeof (Driver.PvdeviceInterface));
+    ASSERT(NT_SUCCESS(status));
 
     RegistryCloseKey(ServiceKey);
 
@@ -812,22 +740,11 @@ done:
     Trace("<====\n");
     return STATUS_SUCCESS;
 
-fail6:
-    Error("fail6\n");
-
-    EmulatedTeardown(Driver.EmulatedContext);
-    Driver.EmulatedContext = NULL;
-
 fail5:
     Error("fail5\n");
 
-    if (Driver.ActiveDeviceID != NULL) {
-        __DriverFree(Driver.ActiveDeviceID);
-        Driver.ActiveDeviceID = NULL;
-
-        __DriverFree(Driver.ActiveInstanceID);
-        Driver.ActiveInstanceID = NULL;
-    }
+    EmulatedTeardown(Driver.EmulatedContext);
+    Driver.EmulatedContext = NULL;
 
 fail4:
     Error("fail4\n");
diff --git a/src/xenfilt/driver.h b/src/xenfilt/driver.h
index f906d36..772436d 100644
--- a/src/xenfilt/driver.h
+++ b/src/xenfilt/driver.h
@@ -42,16 +42,6 @@ DriverGetParametersKey(
     VOID
     );
 
-extern PCHAR
-DriverGetActiveDeviceID(
-    VOID
-    );
-
-extern PCHAR
-DriverGetActiveInstanceID(
-    VOID
-    );
-
 extern VOID
 DriverAcquireMutex(
     VOID
@@ -85,6 +75,13 @@ DriverGetEmulatedContext(
     VOID
     );
 
+#include "pvdevice.h"
+
+PXENFILT_PVDEVICE_CONTEXT
+DriverGetPvdeviceContext(
+    VOID
+    );
+
 typedef struct _XENFILT_FDO XENFILT_FDO, *PXENFILT_FDO;
 typedef struct _XENFILT_PDO XENFILT_PDO, *PXENFILT_PDO;
 
@@ -116,8 +113,8 @@ typedef struct _XENFILT_DX {
     SYSTEM_POWER_STATE  SystemPowerState;
     DEVICE_POWER_STATE  DevicePowerState;
 
-    WCHAR               DeviceID[MAX_DEVICE_ID_LEN];
-    WCHAR               InstanceID[MAX_DEVICE_ID_LEN];
+    CHAR                DeviceID[MAX_DEVICE_ID_LEN];
+    CHAR                InstanceID[MAX_DEVICE_ID_LEN];
 
     IO_REMOVE_LOCK      RemoveLock;
 
diff --git a/src/xenfilt/emulated.c b/src/xenfilt/emulated.c
index 485fed6..31391ed 100644
--- a/src/xenfilt/emulated.c
+++ b/src/xenfilt/emulated.c
@@ -92,21 +92,21 @@ __EmulatedFree(
 static NTSTATUS
 EmulatedSetObjectDeviceData(
     IN  PXENFILT_EMULATED_OBJECT    EmulatedObject,
-    IN  PWCHAR                      DeviceID,
-    IN  PWCHAR                      InstanceID
+    IN  PCHAR                       DeviceID,
+    IN  PCHAR                       InstanceID
     )
 {
     NTSTATUS                        status;
 
     status = RtlStringCbPrintfA(EmulatedObject->Data.Device.DeviceID,
                                 MAXNAMELEN,
-                                "%ws",
+                                "%s",
                                 DeviceID);
     ASSERT(NT_SUCCESS(status));
 
     status = RtlStringCbPrintfA(EmulatedObject->Data.Device.InstanceID,
                                 MAXNAMELEN,
-                                "%ws",
+                                "%s",
                                 InstanceID);
     ASSERT(NT_SUCCESS(status));
 
@@ -116,12 +116,10 @@ EmulatedSetObjectDeviceData(
 static NTSTATUS
 EmulatedSetObjectDiskData(
     IN  PXENFILT_EMULATED_OBJECT    EmulatedObject,
-    IN  PWCHAR                      DeviceID,
-    IN  PWCHAR                      InstanceID
+    IN  PCHAR                       DeviceID,
+    IN  PCHAR                       InstanceID
     )
 {
-    UNICODE_STRING                  Unicode;
-    ANSI_STRING                     Ansi;
     PCHAR                           End;
     ULONG                           Controller;
     ULONG                           Target;
@@ -130,17 +128,11 @@ EmulatedSetObjectDiskData(
 
     UNREFERENCED_PARAMETER(DeviceID);
 
-    RtlInitUnicodeString(&Unicode, InstanceID);
-
-    status = RtlUnicodeStringToAnsiString(&Ansi, &Unicode, TRUE);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
-    Controller = strtol(Ansi.Buffer, &End, 10);
+    Controller = strtol(InstanceID, &End, 10);
 
     status = STATUS_INVALID_PARAMETER;
     if (*End != '.')
-        goto fail2;
+        goto fail1;
 
     End++;
 
@@ -148,7 +140,7 @@ EmulatedSetObjectDiskData(
 
     status = STATUS_INVALID_PARAMETER;
     if (*End != '.')
-        goto fail3;
+        goto fail2;
 
     End++;
 
@@ -156,27 +148,20 @@ EmulatedSetObjectDiskData(
 
     status = STATUS_INVALID_PARAMETER;
     if (*End != '\0')
-        goto fail4;
+        goto fail3;
 
     EmulatedObject->Data.Disk.Controller = Controller;
     EmulatedObject->Data.Disk.Target = Target;
     EmulatedObject->Data.Disk.Lun = Lun;
 
-    RtlFreeAnsiString(&Ansi);
-
     return STATUS_SUCCESS;
 
-fail4:
-    Error("fail4\n");
-
 fail3:
     Error("fail3\n");
 
 fail2:
     Error("fail2\n");
 
-    RtlFreeAnsiString(&Ansi);
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -186,8 +171,8 @@ fail1:
 NTSTATUS
 EmulatedAddObject(
     IN  PXENFILT_EMULATED_CONTEXT       Context,
-    IN  PWCHAR                          DeviceID,
-    IN  PWCHAR                          InstanceID,
+    IN  PCHAR                           DeviceID,
+    IN  PCHAR                           InstanceID,
     IN  XENFILT_EMULATED_OBJECT_TYPE    Type,
     OUT PXENFILT_EMULATED_OBJECT        *EmulatedObject
     )
diff --git a/src/xenfilt/emulated.h b/src/xenfilt/emulated.h
index cc63a25..778c784 100644
--- a/src/xenfilt/emulated.h
+++ b/src/xenfilt/emulated.h
@@ -67,8 +67,8 @@ EmulatedTeardown(
 extern NTSTATUS
 EmulatedAddObject(
     IN  PXENFILT_EMULATED_CONTEXT       Context,
-    IN  PWCHAR                          DeviceID,
-    IN  PWCHAR                          InstanceID,
+    IN  PCHAR                           DeviceID,
+    IN  PCHAR                           InstanceID,
     IN  XENFILT_EMULATED_OBJECT_TYPE    Type,
     OUT PXENFILT_EMULATED_OBJECT        *EmulatedObject
     );
diff --git a/src/xenfilt/fdo.c b/src/xenfilt/fdo.c
index 25b3dc2..7121eb2 100644
--- a/src/xenfilt/fdo.c
+++ b/src/xenfilt/fdo.c
@@ -186,23 +186,39 @@ FdoGetDeviceObject(
     return __FdoGetDeviceObject(Fdo);
 }
 
+static FORCEINLINE PDEVICE_OBJECT
+__FdoGetPhysicalDeviceObject(
+    IN  PXENFILT_FDO    Fdo
+    )
+{
+    return Fdo->PhysicalDeviceObject;
+}
+
+PDEVICE_OBJECT
+FdoGetPhysicalDeviceObject(
+    IN  PXENFILT_FDO    Fdo
+    )
+{
+    return __FdoGetPhysicalDeviceObject(Fdo);
+}
+
 static FORCEINLINE VOID
 __FdoSetDeviceID(
     IN  PXENFILT_FDO    Fdo,
-    IN  PWCHAR          DeviceID
+    IN  PCHAR           DeviceID
     )
 {
     PXENFILT_DX         Dx = Fdo->Dx;
     NTSTATUS            status;
 
-    status = RtlStringCbPrintfW(Dx->DeviceID,
+    status = RtlStringCbPrintfA(Dx->DeviceID,
                                 MAX_DEVICE_ID_LEN,
-                                L"%ws",
+                                "%s",
                                 DeviceID);
     ASSERT(NT_SUCCESS(status));
 }
 
-static FORCEINLINE PWCHAR
+static FORCEINLINE PCHAR
 __FdoGetDeviceID(
     IN  PXENFILT_FDO    Fdo
     )
@@ -215,20 +231,20 @@ __FdoGetDeviceID(
 static FORCEINLINE VOID
 __FdoSetInstanceID(
     IN  PXENFILT_FDO    Fdo,
-    IN  PWCHAR          InstanceID
+    IN  PCHAR           InstanceID
     )
 {
     PXENFILT_DX         Dx = Fdo->Dx;
     NTSTATUS            status;
 
-    status = RtlStringCbPrintfW(Dx->InstanceID,
+    status = RtlStringCbPrintfA(Dx->InstanceID,
                                 MAX_DEVICE_ID_LEN,
-                                L"%ws",
+                                "%s",
                                 InstanceID);
     ASSERT(NT_SUCCESS(status));
 }
 
-static FORCEINLINE PWCHAR
+static FORCEINLINE PCHAR
 __FdoGetInstanceID(
     IN  PXENFILT_FDO    Fdo
     )
@@ -247,7 +263,7 @@ __FdoSetName(
 
     status = RtlStringCbPrintfA(Fdo->Name,
                                 MAXNAMELEN,
-                                "%ws\\%ws",
+                                "%s\\%s",
                                 __FdoGetDeviceID(Fdo),
                                 __FdoGetInstanceID(Fdo));
     ASSERT(NT_SUCCESS(status));
@@ -261,14 +277,6 @@ __FdoGetName(
     return Fdo->Name;
 }
 
-static FORCEINLINE PDEVICE_OBJECT
-__FdoGetPhysicalDeviceObject(
-    IN  PXENFILT_FDO    Fdo
-    )
-{
-    return Fdo->PhysicalDeviceObject;
-}
-
 VOID
 FdoAddPhysicalDeviceObject(
     IN  PXENFILT_FDO    Fdo,
@@ -388,8 +396,8 @@ static NTSTATUS
 FdoQueryId(
     IN  PXENFILT_FDO        Fdo,
     IN  PDEVICE_OBJECT      DeviceObject,
-    IN  BUS_QUERY_ID_TYPE   IdType,
-    OUT PVOID               *Information
+    IN  BUS_QUERY_ID_TYPE   Type,
+    OUT PCHAR               Id
     )
 {
     PIRP                    Irp;
@@ -412,7 +420,7 @@ FdoQueryId(
     StackLocation->MajorFunction = IRP_MJ_PNP;
     StackLocation->MinorFunction = IRP_MN_QUERY_ID;
     StackLocation->Flags = 0;
-    StackLocation->Parameters.QueryId.IdType = IdType;
+    StackLocation->Parameters.QueryId.IdType = Type;
     StackLocation->DeviceObject = DeviceObject;
     StackLocation->FileObject = NULL;
 
@@ -443,7 +451,13 @@ FdoQueryId(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    *Information = (PVOID)Irp->IoStatus.Information;
+    status = RtlStringCbPrintfA(Id,
+                                MAX_DEVICE_ID_LEN,
+                                "%ws",
+                                (PWCHAR)Irp->IoStatus.Information);
+    ASSERT(NT_SUCCESS(status));
+
+    ExFreePool((PVOID)Irp->IoStatus.Information);
 
     IoFreeIrp(Irp);
 
@@ -462,21 +476,21 @@ FdoAddDevice(
     IN  PDEVICE_OBJECT  PhysicalDeviceObject
     )
 {
-    PWCHAR              DeviceID;
-    PWCHAR              InstanceID;
+    CHAR                DeviceID[MAX_DEVICE_ID_LEN];
+    CHAR                InstanceID[MAX_DEVICE_ID_LEN];
     NTSTATUS            status;
 
     status = FdoQueryId(Fdo,
                         PhysicalDeviceObject,
                         BusQueryDeviceID,
-                        &DeviceID);
+                        DeviceID);
     if (!NT_SUCCESS(status))
         goto fail1;
 
     status = FdoQueryId(Fdo,
                         PhysicalDeviceObject,
                         BusQueryInstanceID,
-                        &InstanceID);
+                        InstanceID);
     if (!NT_SUCCESS(status))
         goto fail2;
 
@@ -488,17 +502,10 @@ FdoAddDevice(
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    ExFreePool(InstanceID);
-    ExFreePool(DeviceID);
-
     return STATUS_SUCCESS;
 
 fail3:
-    ExFreePool(InstanceID);
-
 fail2:
-    ExFreePool(DeviceID);
-
 fail1:
     return status;
 }
@@ -1983,8 +1990,8 @@ FdoDispatch(
 NTSTATUS
 FdoCreate(
     IN  PDEVICE_OBJECT                  PhysicalDeviceObject,
-    IN  PWCHAR                          DeviceID,
-    IN  PWCHAR                          InstanceID,
+    IN  PCHAR                           DeviceID,
+    IN  PCHAR                           InstanceID,
     IN  XENFILT_EMULATED_OBJECT_TYPE    Type
     )
 {
diff --git a/src/xenfilt/fdo.h b/src/xenfilt/fdo.h
index b871b26..62a667f 100644
--- a/src/xenfilt/fdo.h
+++ b/src/xenfilt/fdo.h
@@ -43,8 +43,8 @@ typedef struct _XENFILT_FDO XENFILT_FDO, *PXENFILT_FDO;
 extern NTSTATUS
 FdoCreate(
     IN  PDEVICE_OBJECT                  PhysicalDeviceObject,
-    IN  PWCHAR                          DeviceID,
-    IN  PWCHAR                          InstanceID,
+    IN  PCHAR                           DeviceID,
+    IN  PCHAR                           InstanceID,
     IN  XENFILT_EMULATED_OBJECT_TYPE    Type
     );
 
@@ -85,6 +85,11 @@ FdoGetDeviceObject(
     IN  PXENFILT_FDO    Fdo
     );
 
+extern PDEVICE_OBJECT
+FdoGetPhysicalDeviceObject(
+    IN  PXENFILT_FDO    Fdo
+    );
+
 extern BOOLEAN
 FdoHasEnumerated(
     IN  PXENFILT_FDO    Fdo
diff --git a/src/xenfilt/pdo.c b/src/xenfilt/pdo.c
index 6fab346..57502f3 100644
--- a/src/xenfilt/pdo.c
+++ b/src/xenfilt/pdo.c
@@ -37,6 +37,7 @@
 #include <stdlib.h>
 
 #include "emulated.h"
+#include "pvdevice.h"
 #include "names.h"
 #include "fdo.h"
 #include "pdo.h"
@@ -65,6 +66,8 @@ struct _XENFILT_PDO {
 
     XENFILT_EMULATED_OBJECT_TYPE    Type;
     PXENFILT_EMULATED_OBJECT        EmulatedObject;
+
+    XENFILT_PVDEVICE_INTERFACE      PvdeviceInterface;
 };
 
 static FORCEINLINE PVOID
@@ -213,74 +216,74 @@ __PdoGetFdo(
     return Pdo->Fdo;
 }
 
-static FORCEINLINE VOID
-__PdoSetDeviceID(
+static NTSTATUS
+PdoSetDeviceInstance(
     IN  PXENFILT_PDO    Pdo,
-    IN  PWCHAR          DeviceID
+    IN  PCHAR           DeviceID,
+    IN  PCHAR           InstanceID
     )
 {
     PXENFILT_DX         Dx = Pdo->Dx;
+    CHAR                ActiveDeviceID[MAX_DEVICE_ID_LEN];
+    CHAR                ActiveInstanceID[MAX_DEVICE_ID_LEN];
     NTSTATUS            status;
 
-    status = RtlStringCbPrintfW(Dx->DeviceID,
-                                MAX_DEVICE_ID_LEN,
-                                L"%ws",
-                                DeviceID);
-    ASSERT(NT_SUCCESS(status));
-}
-
-static FORCEINLINE PWCHAR
-__PdoGetDeviceID(
-    IN  PXENFILT_PDO    Pdo
-    )
-{
-    PXENFILT_DX         Dx = Pdo->Dx;
-
-    return Dx->DeviceID;
-}
-
-static FORCEINLINE VOID
-__PdoSetInstanceID(
-    IN  PXENFILT_PDO    Pdo,
-    IN  PWCHAR          InstanceID
-    )
-{
-    WCHAR               ActiveDeviceID[MAX_DEVICE_ID_LEN];
-    WCHAR               ActiveInstanceID[MAX_DEVICE_ID_LEN];
-    PXENFILT_DX         Dx = Pdo->Dx;
-    NTSTATUS            status;
+    status = XENFILT_PVDEVICE(Acquire, &Pdo->PvdeviceInterface);
+    if (!NT_SUCCESS(status))
+        goto fail1;
 
-    RtlStringCbPrintfW(ActiveDeviceID,
-                       sizeof (ActiveDeviceID),
-                       L"%hs",
-                       DriverGetActiveDeviceID());
-    
-    RtlStringCbPrintfW(ActiveInstanceID,
-                       sizeof (ActiveInstanceID),
-                       L"%hs",
-                       DriverGetActiveInstanceID());
+    status = XENFILT_PVDEVICE(GetActive,
+                              &Pdo->PvdeviceInterface,
+                              ActiveDeviceID,
+                              ActiveInstanceID);
+    if (!NT_SUCCESS(status))
+        goto done;
 
-    if (_wcsicmp(Dx->DeviceID, ActiveDeviceID) != 0)
+    if (_stricmp(DeviceID, ActiveDeviceID) != 0)
         goto done;
 
-    if (_wcsicmp(InstanceID, ActiveInstanceID) != 0) {
-        Warning("(%ws) '%ws' -> '%ws'\n",
+    if (_stricmp(InstanceID, ActiveInstanceID) != 0) {
+        Warning("(%s) '%s' -> '%s'\n",
                 Dx->DeviceID,
                 InstanceID,
                 ActiveInstanceID);
-
         InstanceID = ActiveInstanceID;
     }
 
 done:
-    status = RtlStringCbPrintfW(Dx->InstanceID,
+    XENFILT_PVDEVICE(Release, &Pdo->PvdeviceInterface);
+
+    status = RtlStringCbPrintfA(Dx->DeviceID,
                                 MAX_DEVICE_ID_LEN,
-                                L"%ws",
+                                "%s",
+                                DeviceID);
+    ASSERT(NT_SUCCESS(status));
+
+    status = RtlStringCbPrintfA(Dx->InstanceID,
+                                MAX_DEVICE_ID_LEN,
+                                "%s",
                                 InstanceID);
     ASSERT(NT_SUCCESS(status));
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+static FORCEINLINE PCHAR
+__PdoGetDeviceID(
+    IN  PXENFILT_PDO    Pdo
+    )
+{
+    PXENFILT_DX         Dx = Pdo->Dx;
+
+    return Dx->DeviceID;
 }
 
-static FORCEINLINE PWCHAR
+static FORCEINLINE PCHAR
 __PdoGetInstanceID(
     IN  PXENFILT_PDO    Pdo
     )
@@ -300,7 +303,7 @@ __PdoSetName(
 
     status = RtlStringCbPrintfA(Pdo->Name,
                                 MAXNAMELEN,
-                                "%ws\\%ws",
+                                "%s\\%s",
                                 Dx->DeviceID,
                                 Dx->InstanceID);
     ASSERT(NT_SUCCESS(status));
@@ -793,6 +796,9 @@ done:
     PdoDestroy(Pdo);
     FdoReleaseMutex(Fdo);
 
+    IoInvalidateDeviceRelations(FdoGetPhysicalDeviceObject(Fdo),
+                                BusRelations);
+
     return status;
 
 fail1:
@@ -863,6 +869,7 @@ done:                                                               \
 }                                                                   \
 
 DEFINE_PDO_QUERY_INTERFACE(Emulated)
+DEFINE_PDO_QUERY_INTERFACE(Pvdevice)
 
 struct _INTERFACE_ENTRY {
     const GUID  *Guid;
@@ -875,6 +882,7 @@ struct _INTERFACE_ENTRY {
 
 struct _INTERFACE_ENTRY PdoInterfaceTable[] = {
     DEFINE_INTERFACE_ENTRY(EMULATED_INTERFACE, Emulated),
+    DEFINE_INTERFACE_ENTRY(PVDEVICE_INTERFACE, Pvdevice),
     { NULL, NULL, NULL }
 };
 
@@ -983,7 +991,7 @@ PdoQueryId(
     case BusQueryInstanceID:
         status = RtlStringCbPrintfW(Buffer,
                                     Id.MaximumLength,
-                                    L"%s",
+                                    L"%hs",
                                     __PdoGetInstanceID(Pdo));
         ASSERT(NT_SUCCESS(status));
 
@@ -993,7 +1001,7 @@ PdoQueryId(
     case BusQueryDeviceID:
         status = RtlStringCbPrintfW(Buffer,
                                     Id.MaximumLength,
-                                    L"%s",
+                                    L"%hs",
                                     __PdoGetDeviceID(Pdo));
         ASSERT(NT_SUCCESS(status));
 
@@ -1880,8 +1888,8 @@ NTSTATUS
 PdoCreate(
     PXENFILT_FDO                    Fdo,
     PDEVICE_OBJECT                  PhysicalDeviceObject,
-    PWCHAR                          DeviceID,
-    PWCHAR                          InstanceID,
+    PCHAR                           DeviceID,
+    PCHAR                           InstanceID,
     XENFILT_EMULATED_OBJECT_TYPE    Type
     )
 {
@@ -1953,8 +1961,16 @@ PdoCreate(
     if (!NT_SUCCESS(status))
         goto fail6;
 
-    __PdoSetDeviceID(Pdo, DeviceID);
-    __PdoSetInstanceID(Pdo, InstanceID);
+    status = PvdeviceGetInterface(DriverGetPvdeviceContext(),
+                                  XENFILT_PVDEVICE_INTERFACE_VERSION_MAX,
+                                  (PINTERFACE)&Pdo->PvdeviceInterface,
+                                  sizeof (Pdo->PvdeviceInterface));
+    ASSERT(NT_SUCCESS(status));
+
+    status = PdoSetDeviceInstance(Pdo, DeviceID, InstanceID);
+    if (!NT_SUCCESS(status))
+        goto fail7;
+
     __PdoSetName(Pdo);
 
     Info("%p (%s)\n",
@@ -1974,6 +1990,12 @@ PdoCreate(
 
     return STATUS_SUCCESS;
 
+fail7:
+    Error("fail7\n");
+
+    RtlZeroMemory(&Pdo->PvdeviceInterface,
+                  sizeof (XENFILT_PVDEVICE_INTERFACE));
+
 fail6:
     Error("fail6\n");
 
@@ -2038,6 +2060,9 @@ PdoDestroy(
 
     RtlZeroMemory(Pdo->Name, sizeof (Pdo->Name));
 
+    RtlZeroMemory(&Pdo->PvdeviceInterface,
+                  sizeof (XENFILT_PVDEVICE_INTERFACE));
+
     EmulatedRemoveObject(DriverGetEmulatedContext(),
                          Pdo->EmulatedObject);
     Pdo->EmulatedObject = NULL;
diff --git a/src/xenfilt/pdo.h b/src/xenfilt/pdo.h
index 05ca049..aac5702 100644
--- a/src/xenfilt/pdo.h
+++ b/src/xenfilt/pdo.h
@@ -65,8 +65,8 @@ extern NTSTATUS
 PdoCreate(
     IN  PXENFILT_FDO                    Fdo,
     IN  PDEVICE_OBJECT                  PhysicalDeviceObject,
-    IN  PWCHAR                          DeviceID,
-    IN  PWCHAR                          InstanceID,
+    IN  PCHAR                           DeviceID,
+    IN  PCHAR                           InstanceID,
     IN  XENFILT_EMULATED_OBJECT_TYPE    Type
     );
 
diff --git a/src/xenfilt/pvdevice.c b/src/xenfilt/pvdevice.c
new file mode 100644
index 0000000..5f9345d
--- /dev/null
+++ b/src/xenfilt/pvdevice.c
@@ -0,0 +1,439 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <ntddk.h>
+#include <ntstrsafe.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <xen.h>
+
+#include "driver.h"
+#include "registry.h"
+#include "emulated.h"
+#include "pvdevice.h"
+#include "mutex.h"
+#include "dbg_print.h"
+#include "assert.h"
+#include "util.h"
+
+struct _XENFILT_PVDEVICE_CONTEXT {
+    KSPIN_LOCK                  Lock;
+    LONG                        References;
+    XENFILT_EMULATED_INTERFACE  EmulatedInterface;
+    MUTEX                       Mutex;
+};
+
+#define XENFILT_PVDEVICE_TAG    'EDVP'
+
+static FORCEINLINE PVOID
+__PvdeviceAllocate(
+    IN  ULONG   Length
+    )
+{
+    return __AllocatePoolWithTag(NonPagedPool, Length, XENFILT_PVDEVICE_TAG);
+}
+
+static FORCEINLINE VOID
+__PvdeviceFree(
+    IN  PVOID   Buffer
+    )
+{
+    ExFreePoolWithTag(Buffer, XENFILT_PVDEVICE_TAG);
+}
+
+static const CHAR *PvdeviceLegacyPrefix[] = {
+    "PCI\\VEN_5853&DEV_0001",
+    "PCI\\VEN_5853&DEV_0002",
+};
+
+static BOOLEAN
+PvdeviceIsLegacy(
+    IN  PXENFILT_PVDEVICE_CONTEXT   Context,
+    IN  PCHAR                       DeviceID
+    )
+{
+    ULONG                           Index;
+
+    UNREFERENCED_PARAMETER(Context);
+
+    for (Index = 0; Index < ARRAYSIZE(PvdeviceLegacyPrefix); Index++) {
+        const CHAR  *Prefix = PvdeviceLegacyPrefix[Index];
+
+        if (_strnicmp(DeviceID, Prefix, strlen(Prefix)) == 0)
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
+static const CHAR *PvdeviceVendorDeviceID[] = {
+    "PCI\\VEN_5853&DEV_C000&SUBSYS_C0005853&REV_01", // XenServer
+};
+
+static BOOLEAN
+PvdeviceIsVendorPresent(
+    IN  PXENFILT_PVDEVICE_CONTEXT   Context
+    )
+{
+    ULONG                           Index;
+
+    for (Index = 0; Index < ARRAYSIZE(PvdeviceVendorDeviceID); Index++) {
+        const CHAR  *DeviceID = PvdeviceVendorDeviceID[Index];
+
+        if (XENFILT_EMULATED(IsDevicePresent,
+                             &Context->EmulatedInterface,
+                             (PCHAR)DeviceID,
+                             NULL))
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
+static NTSTATUS
+PvdeviceGetActive(
+    IN  PINTERFACE              Interface,
+    OUT PCHAR                   DeviceID,
+    OUT PCHAR                   InstanceID
+    )
+{
+    PXENFILT_PVDEVICE_CONTEXT   Context = Interface->Context;
+    HANDLE                      ParametersKey;
+    PANSI_STRING                Ansi;
+    NTSTATUS                    status;
+
+    Trace("====>\n");
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    ParametersKey = DriverGetParametersKey();
+
+    AcquireMutex(&Context->Mutex);
+
+    status = RegistryQuerySzValue(ParametersKey,
+                                  "ActiveDeviceID",
+                                  &Ansi);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = RtlStringCbPrintfA(DeviceID,
+                                MAX_DEVICE_ID_LEN,
+                                "%Z",
+                                &Ansi[0]);
+    ASSERT(NT_SUCCESS(status));
+
+    RegistryFreeSzValue(Ansi);
+
+    status = RegistryQuerySzValue(ParametersKey,
+                                  "ActiveInstanceID",
+                                  &Ansi);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = RtlStringCbPrintfA(InstanceID,
+                                MAX_DEVICE_ID_LEN,
+                                "%Z",
+                                &Ansi[0]);
+    ASSERT(NT_SUCCESS(status));
+
+    RegistryFreeSzValue(Ansi);
+
+    ReleaseMutex(&Context->Mutex);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail2:
+fail1:
+    ReleaseMutex(&Context->Mutex);
+
+    return status;
+}
+
+static NTSTATUS
+PvdeviceSetActive(
+    IN  PINTERFACE              Interface,
+    IN  PCHAR                   DeviceID,
+    IN  PCHAR                   InstanceID
+    )
+{
+    PXENFILT_PVDEVICE_CONTEXT   Context = Interface->Context;
+    HANDLE                      ParametersKey;
+    ANSI_STRING                 Ansi[2];
+    NTSTATUS                    status;
+
+    Trace("====>\n");
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    ParametersKey = DriverGetParametersKey();
+
+    AcquireMutex(&Context->Mutex);
+
+    status = STATUS_UNSUCCESSFUL;
+    if (PvdeviceIsLegacy(Context, DeviceID) &&
+        PvdeviceIsVendorPresent(Context))
+        goto fail1;
+
+    RtlZeroMemory(Ansi, sizeof (ANSI_STRING) * 2);
+
+    RtlInitAnsiString(&Ansi[0], DeviceID);
+
+    status = RegistryUpdateSzValue(ParametersKey,
+                                   "ActiveDeviceID",
+                                   Ansi);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    RtlInitAnsiString(&Ansi[0], InstanceID);
+
+    status = RegistryUpdateSzValue(ParametersKey,
+                                   "ActiveInstanceID",
+                                   Ansi);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Info("%s\\%s\n", DeviceID, InstanceID);
+
+    ReleaseMutex(&Context->Mutex);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail3:
+fail2:
+fail1:
+    ReleaseMutex(&Context->Mutex);
+
+    return status;
+}
+
+static NTSTATUS
+PvdeviceClearActive(
+    IN  PINTERFACE              Interface
+    )
+{
+    PXENFILT_PVDEVICE_CONTEXT   Context = Interface->Context;
+    HANDLE                      ParametersKey;
+    NTSTATUS                    status;
+
+    Trace("====>\n");
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    ParametersKey = DriverGetParametersKey();
+
+    AcquireMutex(&Context->Mutex);
+
+    status = RegistryDeleteValue(ParametersKey,
+                                 "ActiveDeviceID");
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = RegistryDeleteValue(ParametersKey,
+                                 "ActiveInstanceID");
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    Info("DONE\n");
+
+    ReleaseMutex(&Context->Mutex);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail2:
+fail1:
+    ReleaseMutex(&Context->Mutex);
+
+    return status;
+}
+
+static NTSTATUS
+PvdeviceAcquire(
+    IN  PINTERFACE              Interface
+    )
+{
+    PXENFILT_PVDEVICE_CONTEXT   Context = Interface->Context;
+    KIRQL                       Irql;
+    NTSTATUS                    status;
+
+    KeAcquireSpinLock(&Context->Lock, &Irql);
+
+    if (Context->References++ != 0)
+        goto done;
+
+    Trace("====>\n");
+
+    status = XENFILT_EMULATED(Acquire, &Context->EmulatedInterface);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Trace("<====\n");
+
+done:
+    KeReleaseSpinLock(&Context->Lock, Irql);
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    KeReleaseSpinLock(&Context->Lock, Irql);
+
+    return status;
+}
+
+static VOID
+PvdeviceRelease(
+    IN  PINTERFACE              Interface
+    )
+{
+    PXENFILT_PVDEVICE_CONTEXT   Context = Interface->Context;
+    KIRQL                       Irql;
+
+    KeAcquireSpinLock(&Context->Lock, &Irql);
+
+    if (--Context->References > 0)
+        goto done;
+
+    Trace("====>\n");
+
+    XENFILT_EMULATED(Release, &Context->EmulatedInterface);
+
+    Trace("<====\n");
+
+done:
+    KeReleaseSpinLock(&Context->Lock, Irql);
+}
+
+static struct _XENFILT_PVDEVICE_INTERFACE_V1 PvdeviceInterfaceVersion1 = {
+    { sizeof (struct _XENFILT_PVDEVICE_INTERFACE_V1), 1, NULL, NULL, NULL },
+    PvdeviceAcquire,
+    PvdeviceRelease,
+    PvdeviceGetActive,
+    PvdeviceSetActive,
+    PvdeviceClearActive
+};
+
+NTSTATUS
+PvdeviceInitialize(
+    OUT PXENFILT_PVDEVICE_CONTEXT   *Context
+    )
+{
+    NTSTATUS                        status;
+
+    Trace("====>\n");
+
+    *Context = __PvdeviceAllocate(sizeof (XENFILT_PVDEVICE_CONTEXT));
+
+    status = STATUS_NO_MEMORY;
+    if (*Context == NULL)
+        goto fail1;
+
+    status = EmulatedGetInterface(DriverGetEmulatedContext(),
+                                  XENFILT_EMULATED_INTERFACE_VERSION_MAX,
+                                  (PINTERFACE)&(*Context)->EmulatedInterface,
+                                  sizeof ((*Context)->EmulatedInterface));
+    ASSERT(NT_SUCCESS(status));
+
+    KeInitializeSpinLock(&(*Context)->Lock);
+    InitializeMutex(&(*Context)->Mutex);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+NTSTATUS
+PvdeviceGetInterface(
+    IN      PXENFILT_PVDEVICE_CONTEXT   Context,
+    IN      ULONG                       Version,
+    IN OUT  PINTERFACE                  Interface,
+    IN      ULONG                       Size
+    )
+{
+    NTSTATUS                            status;
+
+    ASSERT(Context != NULL);
+
+    switch (Version) {
+    case 1: {
+        struct _XENFILT_PVDEVICE_INTERFACE_V1   *PvdeviceInterface;
+
+        PvdeviceInterface = (struct _XENFILT_PVDEVICE_INTERFACE_V1 *)Interface;
+
+        status = STATUS_BUFFER_OVERFLOW;
+        if (Size < sizeof (struct _XENFILT_PVDEVICE_INTERFACE_V1))
+            break;
+
+        *PvdeviceInterface = PvdeviceInterfaceVersion1;
+
+        ASSERT3U(Interface->Version, ==, Version);
+        Interface->Context = Context;
+
+        status = STATUS_SUCCESS;
+        break;
+    }
+    default:
+        status = STATUS_NOT_SUPPORTED;
+        break;
+    }
+
+    return status;
+}
+
+VOID
+PvdeviceTeardown(
+    IN  PXENFILT_PVDEVICE_CONTEXT   Context
+    )
+{
+    Trace("====>\n");
+
+    RtlZeroMemory(&Context->Mutex, sizeof (MUTEX));
+    RtlZeroMemory(&Context->Lock, sizeof (KSPIN_LOCK));
+
+    RtlZeroMemory(&Context->EmulatedInterface,
+                  sizeof (XENFILT_EMULATED_INTERFACE));
+
+    ASSERT(IsZeroMemory(Context, sizeof (XENFILT_PVDEVICE_CONTEXT)));
+    __PvdeviceFree(Context);
+
+    Trace("<====\n");
+}
diff --git a/src/xenfilt/pvdevice.h b/src/xenfilt/pvdevice.h
new file mode 100644
index 0000000..30cd81c
--- /dev/null
+++ b/src/xenfilt/pvdevice.h
@@ -0,0 +1,59 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XENFILT_PVDEVICE_H
+#define _XENFILT_PVDEVICE_H
+
+#include <ntddk.h>
+#include <xen.h>
+#include <pvdevice_interface.h>
+
+typedef struct _XENFILT_PVDEVICE_CONTEXT XENFILT_PVDEVICE_CONTEXT, *PXENFILT_PVDEVICE_CONTEXT;
+
+extern NTSTATUS
+PvdeviceInitialize(
+    OUT PXENFILT_PVDEVICE_CONTEXT   *Context
+    );
+
+extern NTSTATUS
+PvdeviceGetInterface(
+    IN      PXENFILT_PVDEVICE_CONTEXT   Context,
+    IN      ULONG                       Version,
+    IN OUT  PINTERFACE                  Interface,
+    IN      ULONG                       Size
+    );
+
+extern VOID
+PvdeviceTeardown(
+    IN  PXENFILT_PVDEVICE_CONTEXT   Context
+    );
+
+#endif  // _XENFILT_PVDEVICE_H
diff --git a/vs2012/xenbus/xenbus.vcxproj b/vs2012/xenbus/xenbus.vcxproj
index 82f0dbf..b4fe992 100644
--- a/vs2012/xenbus/xenbus.vcxproj
+++ b/vs2012/xenbus/xenbus.vcxproj
@@ -83,6 +83,7 @@
     <ClCompile Include="..\..\src\xenbus\evtchn_2l.c" />
     <ClCompile Include="..\..\src\xenbus\evtchn_fifo.c" />
     <ClCompile Include="..\..\src\xenbus\fdo.c" />
+    <ClCompile Include="..\..\src\xenbus\filters.c" />
     <ClCompile Include="..\..\src\xenbus\gnttab.c" />
     <ClCompile Include="..\..\src\xenbus\pdo.c" />
     <ClCompile Include="..\..\src\xenbus\shared_info.c" />
diff --git a/vs2012/xenfilt/xenfilt.vcxproj b/vs2012/xenfilt/xenfilt.vcxproj
index 4d5747d..6554ec9 100644
--- a/vs2012/xenfilt/xenfilt.vcxproj
+++ b/vs2012/xenfilt/xenfilt.vcxproj
@@ -69,6 +69,7 @@
     <ClCompile Include="../../src/common/registry.c" />
     <ClCompile Include="../../src/xenfilt/driver.c" />
     <ClCompile Include="../../src/xenfilt/emulated.c" />
+    <ClCompile Include="../../src/xenfilt/pvdevice.c" />
     <ClCompile Include="../../src/xenfilt/fdo.c" />
     <ClCompile Include="../../src/xenfilt/pdo.c" />
     <ClCompile Include="../../src/xenfilt/thread.c" />
diff --git a/vs2013/xenbus/xenbus.vcxproj b/vs2013/xenbus/xenbus.vcxproj
index fb0b0dd..f6e0575 100644
--- a/vs2013/xenbus/xenbus.vcxproj
+++ b/vs2013/xenbus/xenbus.vcxproj
@@ -86,6 +86,7 @@
     <ClCompile Include="..\..\src\xenbus\evtchn_2l.c" />
     <ClCompile Include="..\..\src\xenbus\evtchn_fifo.c" />
     <ClCompile Include="..\..\src\xenbus\fdo.c" />
+    <ClCompile Include="..\..\src\xenbus\filters.c" />
     <ClCompile Include="..\..\src\xenbus\gnttab.c" />
     <ClCompile Include="..\..\src\xenbus\pdo.c" />
     <ClCompile Include="..\..\src\xenbus\shared_info.c" />
diff --git a/vs2013/xenfilt/xenfilt.vcxproj b/vs2013/xenfilt/xenfilt.vcxproj
index 4f749b1..6250fcb 100644
--- a/vs2013/xenfilt/xenfilt.vcxproj
+++ b/vs2013/xenfilt/xenfilt.vcxproj
@@ -72,6 +72,7 @@
     <ClCompile Include="../../src/common/registry.c" />
     <ClCompile Include="../../src/xenfilt/driver.c" />
     <ClCompile Include="../../src/xenfilt/emulated.c" />
+    <ClCompile Include="../../src/xenfilt/pvdevice.c" />
     <ClCompile Include="../../src/xenfilt/fdo.c" />
     <ClCompile Include="../../src/xenfilt/pdo.c" />
     <ClCompile Include="../../src/xenfilt/thread.c" />
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:52:31 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:52:31 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwJr-0004zI-Ox; Wed, 22 Jul 2015 15:52:31 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwJq-0004y9-BZ
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:52:30 +0000
Received: from [85.158.137.68] by server-5.bemta-3.messagelabs.com id
	31/E2-23832-D3CBFA55; Wed, 22 Jul 2015 15:52:29 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-7.tower-31.messagelabs.com!1437580349!28312558!1
X-Originating-IP: [209.85.212.172]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21893 invoked from network); 22 Jul 2015 15:52:29 -0000
Received: from mail-wi0-f172.google.com (HELO mail-wi0-f172.google.com)
	(209.85.212.172)
	by server-7.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:52:29 -0000
Received: by wibxm9 with SMTP id xm9so169696991wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:52:29 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=l/DRvsMkEBbKfGD8ZyjmkCYP8rnTYdSWTqyNN8V9ZIg=;
	b=wTbuXN0wN+udsm6O8AcO1H4KPsGPRCL84EFkQP3m8/lU4zQsQ2HUI3aYpu5aWEsYem
	OCP7hSVLkWwsbX+xEmx/NAPUL24xBNAyCyTXJPjM2QJT7CeVCG12m6RVafJpTxZCgG+B
	IOwFiCFlBUR3xi7RPUItKB2DiJCyW4vvBy8LsO5E+W9+HnUHTEMBuvimP6l17cG/yWDo
	NIBtyvZlQ6xNLI8A3iaIDxKsn2aoaj4gPj9SFh40s4FXxYzOgbK3Zltk76201yW1EG4O
	37r10oP4FvB1emBczGRF+paa+V5SI9AOjir5tq2JacyJINEfDdfvlFukZFsmtFcpYY4X
	944w==
X-Received: by 10.180.86.163 with SMTP id q3mr7906732wiz.75.1437580349153;
	Wed, 22 Jul 2015 08:52:29 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	fz16sm4029038wic.3.2015.07.22.08.52.28
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:52:28 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:52:26 +0100
Message-Id: <1437580347-2796-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/2] Fix co-installer compatibility check
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It was using the wrong enumerator name.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 0c0ac61..60ed2bc 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -757,7 +757,7 @@ SupportChildDrivers(
             goto fail4;
         }
 
-        Success = OpenDeviceKey("XENBUS", SubKeyName, &DeviceKey);
+        Success = OpenDeviceKey("XENVIF", SubKeyName, &DeviceKey);
         if (!Success)
             goto fail5;
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:52:31 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:52:31 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwJr-0004zI-Ox; Wed, 22 Jul 2015 15:52:31 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwJq-0004y9-BZ
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:52:30 +0000
Received: from [85.158.137.68] by server-5.bemta-3.messagelabs.com id
	31/E2-23832-D3CBFA55; Wed, 22 Jul 2015 15:52:29 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-7.tower-31.messagelabs.com!1437580349!28312558!1
X-Originating-IP: [209.85.212.172]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21893 invoked from network); 22 Jul 2015 15:52:29 -0000
Received: from mail-wi0-f172.google.com (HELO mail-wi0-f172.google.com)
	(209.85.212.172)
	by server-7.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:52:29 -0000
Received: by wibxm9 with SMTP id xm9so169696991wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:52:29 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=l/DRvsMkEBbKfGD8ZyjmkCYP8rnTYdSWTqyNN8V9ZIg=;
	b=wTbuXN0wN+udsm6O8AcO1H4KPsGPRCL84EFkQP3m8/lU4zQsQ2HUI3aYpu5aWEsYem
	OCP7hSVLkWwsbX+xEmx/NAPUL24xBNAyCyTXJPjM2QJT7CeVCG12m6RVafJpTxZCgG+B
	IOwFiCFlBUR3xi7RPUItKB2DiJCyW4vvBy8LsO5E+W9+HnUHTEMBuvimP6l17cG/yWDo
	NIBtyvZlQ6xNLI8A3iaIDxKsn2aoaj4gPj9SFh40s4FXxYzOgbK3Zltk76201yW1EG4O
	37r10oP4FvB1emBczGRF+paa+V5SI9AOjir5tq2JacyJINEfDdfvlFukZFsmtFcpYY4X
	944w==
X-Received: by 10.180.86.163 with SMTP id q3mr7906732wiz.75.1437580349153;
	Wed, 22 Jul 2015 08:52:29 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	fz16sm4029038wic.3.2015.07.22.08.52.28
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:52:28 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:52:26 +0100
Message-Id: <1437580347-2796-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/2] Fix co-installer compatibility check
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It was using the wrong enumerator name.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 0c0ac61..60ed2bc 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -757,7 +757,7 @@ SupportChildDrivers(
             goto fail4;
         }
 
-        Success = OpenDeviceKey("XENBUS", SubKeyName, &DeviceKey);
+        Success = OpenDeviceKey("XENVIF", SubKeyName, &DeviceKey);
         if (!Success)
             goto fail5;
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:52:32 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:52:32 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwJs-0004zu-QW; Wed, 22 Jul 2015 15:52:32 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwJr-0004z8-TC
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:52:32 +0000
Received: from [85.158.139.211] by server-15.bemta-5.messagelabs.com id
	36/94-12200-F3CBFA55; Wed, 22 Jul 2015 15:52:31 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1437580350!22949529!1
X-Originating-IP: [209.85.212.169]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17376 invoked from network); 22 Jul 2015 15:52:30 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-6.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:52:30 -0000
Received: by wibxm9 with SMTP id xm9so109244930wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:52:30 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=2i5JIw2jz3IdFMxIgIRu+20Wg7HyWKV2dNl31D8HpLk=;
	b=JlxQKIALkop0xHkSQtFV76sa0ag+pc2gOIbf0Gu3u7VRLCztplAgj6Fhav0+xgqac2
	Q/CWnScIDIumy4bwAYhreBSXeCZzmd6IqjIIniXzsHwotLbqzcHKa+zPboYYXi4zXx1k
	vNPxa2r5FVkbkRJuIKmAGd9bluOjwYVBj8prCJSxjkLRnDOhj3s45ljAJ8Y7SqsvvOjX
	Eowo/5us1LY7rBHec38Xc2xMNnTcsPRa1OydRhiDpdmypsJ4sC1zFWXpuIvTfXTrX/6N
	mzt02r5QF3rOP1N1258+rjLKl5c8685GmpQGMvDIs07GudKsn0agE2VxWCEGOtkHCA9+
	/hOg==
X-Received: by 10.194.110.100 with SMTP id hz4mr6492242wjb.6.1437580350302;
	Wed, 22 Jul 2015 08:52:30 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	fz16sm4029038wic.3.2015.07.22.08.52.29
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:52:29 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:52:27 +0100
Message-Id: <1437580347-2796-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437580347-2796-1-git-send-email-paul.durrant@citrix.com>
References: <1437580347-2796-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Move friendly name setting into driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

XENVIF can set the friendly name of each PDO during start device processing
which removes the need for the XENNET co-installer to handle this.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/driver.c |   2 +
 src/xenvif/pdo.c    | 110 +++++++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 93 insertions(+), 19 deletions(-)

diff --git a/src/xenvif/driver.c b/src/xenvif/driver.c
index 95a56e3..26ab79e 100644
--- a/src/xenvif/driver.c
+++ b/src/xenvif/driver.c
@@ -157,6 +157,8 @@ DriverUnload(
     if (*InitSafeBootMode > 0)
         goto done;
 
+    Driver.NeedReboot = FALSE;
+
     StatusKey = __DriverGetStatusKey();
     __DriverSetStatusKey(NULL);
 
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index c61f7e8..e8264e2 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -62,6 +62,8 @@
 
 #define PDO_POOL 'ODP'
 
+#define MAXNAMELEN  128
+
 struct _XENVIF_PDO {
     PXENVIF_DX                  Dx;
 
@@ -733,6 +735,60 @@ PdoGetPermanentAddress(
     return __PdoGetPermanentAddress(Pdo);
 }
 
+static NTSTATUS
+PdoSetFriendlyName(
+    IN  PXENVIF_PDO Pdo,
+    IN  HANDLE      SoftwareKey,
+    IN  HANDLE      HardwareKey
+    )
+{
+    PANSI_STRING    DriverDesc;
+    CHAR            Buffer[MAXNAMELEN];
+    ANSI_STRING     FriendlyName[2];
+    NTSTATUS        status;
+
+    status = RegistryQuerySzValue(SoftwareKey,
+                                  "DriverDesc",
+                                  &DriverDesc);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = RtlStringCbPrintfA(Buffer,
+                                MAXNAMELEN,
+                                "%Z #%s",
+                                &DriverDesc[0],
+                                __PdoGetName(Pdo)
+                                );
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    RtlZeroMemory(FriendlyName, sizeof (ANSI_STRING) * 2);
+    RtlInitAnsiString(&FriendlyName[0], Buffer);
+
+    status = RegistryUpdateSzValue(HardwareKey,
+                                   "FriendlyName",
+                                   FriendlyName);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Info("%Z\n", &FriendlyName[0]);
+
+    RegistryFreeSzValue(DriverDesc);
+
+    return STATUS_SUCCESS;
+
+fail3:
+    Error("fail3\n");
+
+fail2:
+    Error("fail2\n");
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
 static FORCEINLINE NTSTATUS
 __PdoSetCurrentAddress(
     IN  PXENVIF_PDO Pdo,
@@ -1096,7 +1152,8 @@ PdoStartDevice(
     ULONG               Index;
     PMIB_IF_ROW2        Row;
     PIO_STACK_LOCATION  StackLocation;
-    HANDLE              Key;
+    HANDLE              SoftwareKey;
+    HANDLE              HardwareKey;
     GUID                Guid;
     NTSTATUS            status;
 
@@ -1110,29 +1167,39 @@ PdoStartDevice(
 
     status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo),
                                      KEY_ALL_ACCESS,
-                                     &Key);
+                                     &SoftwareKey);
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    status = __PdoSetCurrentAddress(Pdo, Key);
+    status = RegistryOpenHardwareKey(__PdoGetDeviceObject(Pdo),
+                                     KEY_ALL_ACCESS,
+                                     &HardwareKey);
     if (!NT_SUCCESS(status))
         goto fail4;
 
+    (VOID) PdoSetFriendlyName(Pdo,
+                              SoftwareKey,
+                              HardwareKey);
+
+    status = __PdoSetCurrentAddress(Pdo, SoftwareKey);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
     status = LinkGetRoutineAddress("netio.sys",
                                    "GetIfTable2",
                                    (PVOID *)&__GetIfTable2);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail6;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "FreeMibTable",
                                    (PVOID *)&__FreeMibTable);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail7;
 
     status = __GetIfTable2(&Table);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail8;
 
     //
     // Look for a network interface with the same permanent address
@@ -1158,14 +1225,14 @@ PdoStartDevice(
             continue;
 
         status = STATUS_UNSUCCESSFUL;
-        goto fail8;
+        goto fail9;
     }
 
     //
     // If there is a stack bound then restore any settings that
     // may have been saved from an aliasing emulated device.
     //
-    status = PdoGetInterfaceGuid(Pdo, Key, &Guid);
+    status = PdoGetInterfaceGuid(Pdo, SoftwareKey, &Guid);
     if (NT_SUCCESS(status)) {
         for (Index = 0; Index < Table->NumEntries; Index++) {
             Row = &Table->Table[Index];
@@ -1173,7 +1240,7 @@ PdoStartDevice(
             if (!IsEqualGUID(&Row->InterfaceGuid, &Guid))
                 continue;
 
-            (VOID) SettingsRestore(Key,
+            (VOID) SettingsRestore(SoftwareKey,
                                    Row->Alias,
                                    Row->Description,
                                    &Row->InterfaceGuid,
@@ -1186,7 +1253,7 @@ PdoStartDevice(
 
     status = PdoD3ToD0(Pdo);
     if (!NT_SUCCESS(status))
-        goto fail9;
+        goto fail10;
 
     __PdoSetDevicePnpState(Pdo, Started);
 
@@ -1195,21 +1262,21 @@ PdoStartDevice(
 
     __FreeMibTable(Table);
 
-    RegistryCloseKey(Key);
+    RegistryCloseKey(SoftwareKey);
 
     return STATUS_SUCCESS;
 
-fail9:
-    Error("fail9\n");
+fail10:
+    Error("fail10\n");
 
     __FreeMibTable(Table);
 
-    goto fail6;
+    goto fail7;
 
-fail8:
-    Error("fail8\n");
+fail9:
+    Error("fail9\n");
 
-    (VOID) SettingsSave(Key,
+    (VOID) SettingsSave(SoftwareKey,
                         Row->Alias,
                         Row->Description,
                         &Row->InterfaceGuid,
@@ -1223,21 +1290,26 @@ fail8:
     DriverRequestReboot();
     __FreeMibTable(Table);
 
+fail8:
+    Error("fail8\n");
+
 fail7:
     Error("fail7\n");
 
 fail6:
     Error("fail6\n");
 
+    RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
+
 fail5:
     Error("fail5\n");
 
-    RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
+    RegistryCloseKey(HardwareKey);
 
 fail4:
     Error("fail4\n");
 
-    RegistryCloseKey(Key);
+    RegistryCloseKey(SoftwareKey);
 
 fail3:
     Error("fail3\n");
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:52:32 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:52:32 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwJs-0004zu-QW; Wed, 22 Jul 2015 15:52:32 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwJr-0004z8-TC
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:52:32 +0000
Received: from [85.158.139.211] by server-15.bemta-5.messagelabs.com id
	36/94-12200-F3CBFA55; Wed, 22 Jul 2015 15:52:31 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1437580350!22949529!1
X-Originating-IP: [209.85.212.169]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17376 invoked from network); 22 Jul 2015 15:52:30 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-6.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:52:30 -0000
Received: by wibxm9 with SMTP id xm9so109244930wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:52:30 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=2i5JIw2jz3IdFMxIgIRu+20Wg7HyWKV2dNl31D8HpLk=;
	b=JlxQKIALkop0xHkSQtFV76sa0ag+pc2gOIbf0Gu3u7VRLCztplAgj6Fhav0+xgqac2
	Q/CWnScIDIumy4bwAYhreBSXeCZzmd6IqjIIniXzsHwotLbqzcHKa+zPboYYXi4zXx1k
	vNPxa2r5FVkbkRJuIKmAGd9bluOjwYVBj8prCJSxjkLRnDOhj3s45ljAJ8Y7SqsvvOjX
	Eowo/5us1LY7rBHec38Xc2xMNnTcsPRa1OydRhiDpdmypsJ4sC1zFWXpuIvTfXTrX/6N
	mzt02r5QF3rOP1N1258+rjLKl5c8685GmpQGMvDIs07GudKsn0agE2VxWCEGOtkHCA9+
	/hOg==
X-Received: by 10.194.110.100 with SMTP id hz4mr6492242wjb.6.1437580350302;
	Wed, 22 Jul 2015 08:52:30 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	fz16sm4029038wic.3.2015.07.22.08.52.29
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:52:29 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:52:27 +0100
Message-Id: <1437580347-2796-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437580347-2796-1-git-send-email-paul.durrant@citrix.com>
References: <1437580347-2796-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Move friendly name setting into driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

XENVIF can set the friendly name of each PDO during start device processing
which removes the need for the XENNET co-installer to handle this.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/driver.c |   2 +
 src/xenvif/pdo.c    | 110 +++++++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 93 insertions(+), 19 deletions(-)

diff --git a/src/xenvif/driver.c b/src/xenvif/driver.c
index 95a56e3..26ab79e 100644
--- a/src/xenvif/driver.c
+++ b/src/xenvif/driver.c
@@ -157,6 +157,8 @@ DriverUnload(
     if (*InitSafeBootMode > 0)
         goto done;
 
+    Driver.NeedReboot = FALSE;
+
     StatusKey = __DriverGetStatusKey();
     __DriverSetStatusKey(NULL);
 
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index c61f7e8..e8264e2 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -62,6 +62,8 @@
 
 #define PDO_POOL 'ODP'
 
+#define MAXNAMELEN  128
+
 struct _XENVIF_PDO {
     PXENVIF_DX                  Dx;
 
@@ -733,6 +735,60 @@ PdoGetPermanentAddress(
     return __PdoGetPermanentAddress(Pdo);
 }
 
+static NTSTATUS
+PdoSetFriendlyName(
+    IN  PXENVIF_PDO Pdo,
+    IN  HANDLE      SoftwareKey,
+    IN  HANDLE      HardwareKey
+    )
+{
+    PANSI_STRING    DriverDesc;
+    CHAR            Buffer[MAXNAMELEN];
+    ANSI_STRING     FriendlyName[2];
+    NTSTATUS        status;
+
+    status = RegistryQuerySzValue(SoftwareKey,
+                                  "DriverDesc",
+                                  &DriverDesc);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = RtlStringCbPrintfA(Buffer,
+                                MAXNAMELEN,
+                                "%Z #%s",
+                                &DriverDesc[0],
+                                __PdoGetName(Pdo)
+                                );
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    RtlZeroMemory(FriendlyName, sizeof (ANSI_STRING) * 2);
+    RtlInitAnsiString(&FriendlyName[0], Buffer);
+
+    status = RegistryUpdateSzValue(HardwareKey,
+                                   "FriendlyName",
+                                   FriendlyName);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    Info("%Z\n", &FriendlyName[0]);
+
+    RegistryFreeSzValue(DriverDesc);
+
+    return STATUS_SUCCESS;
+
+fail3:
+    Error("fail3\n");
+
+fail2:
+    Error("fail2\n");
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
 static FORCEINLINE NTSTATUS
 __PdoSetCurrentAddress(
     IN  PXENVIF_PDO Pdo,
@@ -1096,7 +1152,8 @@ PdoStartDevice(
     ULONG               Index;
     PMIB_IF_ROW2        Row;
     PIO_STACK_LOCATION  StackLocation;
-    HANDLE              Key;
+    HANDLE              SoftwareKey;
+    HANDLE              HardwareKey;
     GUID                Guid;
     NTSTATUS            status;
 
@@ -1110,29 +1167,39 @@ PdoStartDevice(
 
     status = RegistryOpenSoftwareKey(__PdoGetDeviceObject(Pdo),
                                      KEY_ALL_ACCESS,
-                                     &Key);
+                                     &SoftwareKey);
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    status = __PdoSetCurrentAddress(Pdo, Key);
+    status = RegistryOpenHardwareKey(__PdoGetDeviceObject(Pdo),
+                                     KEY_ALL_ACCESS,
+                                     &HardwareKey);
     if (!NT_SUCCESS(status))
         goto fail4;
 
+    (VOID) PdoSetFriendlyName(Pdo,
+                              SoftwareKey,
+                              HardwareKey);
+
+    status = __PdoSetCurrentAddress(Pdo, SoftwareKey);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
     status = LinkGetRoutineAddress("netio.sys",
                                    "GetIfTable2",
                                    (PVOID *)&__GetIfTable2);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail6;
 
     status = LinkGetRoutineAddress("netio.sys",
                                    "FreeMibTable",
                                    (PVOID *)&__FreeMibTable);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail7;
 
     status = __GetIfTable2(&Table);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail8;
 
     //
     // Look for a network interface with the same permanent address
@@ -1158,14 +1225,14 @@ PdoStartDevice(
             continue;
 
         status = STATUS_UNSUCCESSFUL;
-        goto fail8;
+        goto fail9;
     }
 
     //
     // If there is a stack bound then restore any settings that
     // may have been saved from an aliasing emulated device.
     //
-    status = PdoGetInterfaceGuid(Pdo, Key, &Guid);
+    status = PdoGetInterfaceGuid(Pdo, SoftwareKey, &Guid);
     if (NT_SUCCESS(status)) {
         for (Index = 0; Index < Table->NumEntries; Index++) {
             Row = &Table->Table[Index];
@@ -1173,7 +1240,7 @@ PdoStartDevice(
             if (!IsEqualGUID(&Row->InterfaceGuid, &Guid))
                 continue;
 
-            (VOID) SettingsRestore(Key,
+            (VOID) SettingsRestore(SoftwareKey,
                                    Row->Alias,
                                    Row->Description,
                                    &Row->InterfaceGuid,
@@ -1186,7 +1253,7 @@ PdoStartDevice(
 
     status = PdoD3ToD0(Pdo);
     if (!NT_SUCCESS(status))
-        goto fail9;
+        goto fail10;
 
     __PdoSetDevicePnpState(Pdo, Started);
 
@@ -1195,21 +1262,21 @@ PdoStartDevice(
 
     __FreeMibTable(Table);
 
-    RegistryCloseKey(Key);
+    RegistryCloseKey(SoftwareKey);
 
     return STATUS_SUCCESS;
 
-fail9:
-    Error("fail9\n");
+fail10:
+    Error("fail10\n");
 
     __FreeMibTable(Table);
 
-    goto fail6;
+    goto fail7;
 
-fail8:
-    Error("fail8\n");
+fail9:
+    Error("fail9\n");
 
-    (VOID) SettingsSave(Key,
+    (VOID) SettingsSave(SoftwareKey,
                         Row->Alias,
                         Row->Description,
                         &Row->InterfaceGuid,
@@ -1223,21 +1290,26 @@ fail8:
     DriverRequestReboot();
     __FreeMibTable(Table);
 
+fail8:
+    Error("fail8\n");
+
 fail7:
     Error("fail7\n");
 
 fail6:
     Error("fail6\n");
 
+    RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
+
 fail5:
     Error("fail5\n");
 
-    RtlZeroMemory(&Pdo->CurrentAddress, sizeof (ETHERNET_ADDRESS));
+    RegistryCloseKey(HardwareKey);
 
 fail4:
     Error("fail4\n");
 
-    RegistryCloseKey(Key);
+    RegistryCloseKey(SoftwareKey);
 
 fail3:
     Error("fail3\n");
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:53:08 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:53:08 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwKS-0005B7-TS; Wed, 22 Jul 2015 15:53:08 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwKR-0005Aj-Ph
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:53:07 +0000
Received: from [193.109.254.147] by server-1.bemta-14.messagelabs.com id
	C9/01-06739-36CBFA55; Wed, 22 Jul 2015 15:53:07 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1437580386!34333908!1
X-Originating-IP: [209.85.212.178]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10563 invoked from network); 22 Jul 2015 15:53:06 -0000
Received: from mail-wi0-f178.google.com (HELO mail-wi0-f178.google.com)
	(209.85.212.178)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:53:06 -0000
Received: by wibxm9 with SMTP id xm9so109270569wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:53:06 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=9tpML3EDJCIi0k+3WFLbhiGCmwiecD8hNKvYv/JDir4=;
	b=dM/2XI4cbpkldMbznh8ixWZnKwaslLEl15WQF+AK6g8HHnYj7wvKAgxz8s9JNIYQg5
	GLYyYy+3hKEj6/eXd8wcX1//JceDPawpYqJnBBh/HktbbSfhH8GKFVyxCVYDBlqGvdwO
	Fs+ZE6UeYYr0aEXYOsBB9b8zZHgEus93gOD9b1nYiqtYbRXbjrLZVYqV/dip7OuwPwRi
	tkTZehL2EoY0sebued40s6IO+E/UiD/TzKZFJrk0bOR3bGDw2hi45HkSdxVIYz1WWMMJ
	KTD4z+fwGok/UQlQgwhPuzjbO6cupaG5G9y9L7Mo0EiEdUEar5znxfDqxoYufA2F1ubh
	LGeQ==
X-Received: by 10.194.48.108 with SMTP id k12mr6719846wjn.151.1437580386021;
	Wed, 22 Jul 2015 08:53:06 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	l14sm3012583wjq.21.2015.07.22.08.53.05
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:53:05 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:53:04 +0100
Message-Id: <1437580384-7268-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] We no longer need to set the friendly name
	in the co-installer
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This is now handled by XENVIF.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 170 +---------------------------------------------------
 1 file changed, 3 insertions(+), 167 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index a4bbd53..c04b7e8 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -190,151 +190,6 @@ __FunctionName(
 #undef  _NAME
 }
 
-static PTCHAR
-GetProperty(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData,
-    IN  DWORD               Index
-    )
-{
-    DWORD                   Type;
-    DWORD                   PropertyLength;
-    PTCHAR                  Property;
-    HRESULT                 Error;
-
-    if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          Index,
-                                          &Type,
-                                          NULL,
-                                          0,
-                                          &PropertyLength)) {
-        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
-            goto fail1;
-    }
-
-    if (Type != REG_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail2;
-    }
-
-    PropertyLength += sizeof (TCHAR);
-
-    Property = calloc(1, PropertyLength);
-    if (Property == NULL)
-        goto fail3;
-
-    if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          Index,
-                                          NULL,
-                                          (PBYTE)Property,
-                                          PropertyLength,
-                                          NULL))
-        goto fail4;
-
-    return Property;
-
-fail4:
-    free(Property);
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static BOOLEAN
-SetFriendlyName(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData
-    )
-{
-    PTCHAR                  Description;
-    PTCHAR                  Location;
-    TCHAR                   FriendlyName[MAX_PATH];
-    DWORD                   FriendlyNameLength;
-    HRESULT                 Result;
-    HRESULT                 Error;
-
-    Description = GetProperty(DeviceInfoSet,
-                              DeviceInfoData,
-                              SPDRP_DEVICEDESC);
-    if (Description == NULL)
-        goto fail1;
-
-    Location = GetProperty(DeviceInfoSet,
-                           DeviceInfoData,
-                           SPDRP_LOCATION_INFORMATION);
-    if (Location == NULL)
-        goto fail2;
-
-    Result = StringCbPrintf(FriendlyName,
-                            MAX_PATH,
-                            "%s #%s",
-                            Description,
-                            Location);
-    if (!SUCCEEDED(Result))
-        goto fail3;
-
-    FriendlyNameLength = (DWORD)(strlen(FriendlyName) + sizeof (TCHAR));
-
-    if (!SetupDiSetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          SPDRP_FRIENDLYNAME,
-                                          (PBYTE)FriendlyName,
-                                          FriendlyNameLength))
-        goto fail4;
-
-    Log("%s", FriendlyName);
-
-    free(Location);
-
-    free(Description);
-
-    return TRUE;
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-    free(Location);
-
-fail2:
-    Log("fail2");
-
-    free(Description);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
 static BOOLEAN
 CheckStatus(
     OUT PBOOLEAN    NeedReboot
@@ -476,41 +331,22 @@ __DifInstallPostProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
-    BOOLEAN                         Success;
     BOOLEAN                         NeedReboot;
-    HRESULT                         Error;
 
     UNREFERENCED_PARAMETER(Context);
 
     Log("====>");
 
-    Success = SetFriendlyName(DeviceInfoSet,
-                              DeviceInfoData);
-    if (!Success)
-        goto fail1;
-
     NeedReboot = FALSE;
 
-    Success = CheckStatus(&NeedReboot);
-    if (Success && NeedReboot)
+    (VOID) CheckStatus(&NeedReboot);
+
+    if (NeedReboot)
         (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData);
 
     Log("<====");
 
     return NO_ERROR;
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return Error;
 }
 
 static DECLSPEC_NOINLINE HRESULT
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:53:08 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:53:08 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwKS-0005B7-TS; Wed, 22 Jul 2015 15:53:08 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwKR-0005Aj-Ph
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:53:07 +0000
Received: from [193.109.254.147] by server-1.bemta-14.messagelabs.com id
	C9/01-06739-36CBFA55; Wed, 22 Jul 2015 15:53:07 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1437580386!34333908!1
X-Originating-IP: [209.85.212.178]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10563 invoked from network); 22 Jul 2015 15:53:06 -0000
Received: from mail-wi0-f178.google.com (HELO mail-wi0-f178.google.com)
	(209.85.212.178)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:53:06 -0000
Received: by wibxm9 with SMTP id xm9so109270569wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:53:06 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=9tpML3EDJCIi0k+3WFLbhiGCmwiecD8hNKvYv/JDir4=;
	b=dM/2XI4cbpkldMbznh8ixWZnKwaslLEl15WQF+AK6g8HHnYj7wvKAgxz8s9JNIYQg5
	GLYyYy+3hKEj6/eXd8wcX1//JceDPawpYqJnBBh/HktbbSfhH8GKFVyxCVYDBlqGvdwO
	Fs+ZE6UeYYr0aEXYOsBB9b8zZHgEus93gOD9b1nYiqtYbRXbjrLZVYqV/dip7OuwPwRi
	tkTZehL2EoY0sebued40s6IO+E/UiD/TzKZFJrk0bOR3bGDw2hi45HkSdxVIYz1WWMMJ
	KTD4z+fwGok/UQlQgwhPuzjbO6cupaG5G9y9L7Mo0EiEdUEar5znxfDqxoYufA2F1ubh
	LGeQ==
X-Received: by 10.194.48.108 with SMTP id k12mr6719846wjn.151.1437580386021;
	Wed, 22 Jul 2015 08:53:06 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	l14sm3012583wjq.21.2015.07.22.08.53.05
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:53:05 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:53:04 +0100
Message-Id: <1437580384-7268-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] We no longer need to set the friendly name
	in the co-installer
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This is now handled by XENVIF.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 170 +---------------------------------------------------
 1 file changed, 3 insertions(+), 167 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index a4bbd53..c04b7e8 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -190,151 +190,6 @@ __FunctionName(
 #undef  _NAME
 }
 
-static PTCHAR
-GetProperty(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData,
-    IN  DWORD               Index
-    )
-{
-    DWORD                   Type;
-    DWORD                   PropertyLength;
-    PTCHAR                  Property;
-    HRESULT                 Error;
-
-    if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          Index,
-                                          &Type,
-                                          NULL,
-                                          0,
-                                          &PropertyLength)) {
-        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
-            goto fail1;
-    }
-
-    if (Type != REG_SZ) {
-        SetLastError(ERROR_BAD_FORMAT);
-        goto fail2;
-    }
-
-    PropertyLength += sizeof (TCHAR);
-
-    Property = calloc(1, PropertyLength);
-    if (Property == NULL)
-        goto fail3;
-
-    if (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          Index,
-                                          NULL,
-                                          (PBYTE)Property,
-                                          PropertyLength,
-                                          NULL))
-        goto fail4;
-
-    return Property;
-
-fail4:
-    free(Property);
-
-fail3:
-    Log("fail3");
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return NULL;
-}
-
-static BOOLEAN
-SetFriendlyName(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData
-    )
-{
-    PTCHAR                  Description;
-    PTCHAR                  Location;
-    TCHAR                   FriendlyName[MAX_PATH];
-    DWORD                   FriendlyNameLength;
-    HRESULT                 Result;
-    HRESULT                 Error;
-
-    Description = GetProperty(DeviceInfoSet,
-                              DeviceInfoData,
-                              SPDRP_DEVICEDESC);
-    if (Description == NULL)
-        goto fail1;
-
-    Location = GetProperty(DeviceInfoSet,
-                           DeviceInfoData,
-                           SPDRP_LOCATION_INFORMATION);
-    if (Location == NULL)
-        goto fail2;
-
-    Result = StringCbPrintf(FriendlyName,
-                            MAX_PATH,
-                            "%s #%s",
-                            Description,
-                            Location);
-    if (!SUCCEEDED(Result))
-        goto fail3;
-
-    FriendlyNameLength = (DWORD)(strlen(FriendlyName) + sizeof (TCHAR));
-
-    if (!SetupDiSetDeviceRegistryProperty(DeviceInfoSet,
-                                          DeviceInfoData,
-                                          SPDRP_FRIENDLYNAME,
-                                          (PBYTE)FriendlyName,
-                                          FriendlyNameLength))
-        goto fail4;
-
-    Log("%s", FriendlyName);
-
-    free(Location);
-
-    free(Description);
-
-    return TRUE;
-
-fail4:
-    Log("fail4");
-
-fail3:
-    Log("fail3");
-
-    free(Location);
-
-fail2:
-    Log("fail2");
-
-    free(Description);
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
 static BOOLEAN
 CheckStatus(
     OUT PBOOLEAN    NeedReboot
@@ -476,41 +331,22 @@ __DifInstallPostProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
-    BOOLEAN                         Success;
     BOOLEAN                         NeedReboot;
-    HRESULT                         Error;
 
     UNREFERENCED_PARAMETER(Context);
 
     Log("====>");
 
-    Success = SetFriendlyName(DeviceInfoSet,
-                              DeviceInfoData);
-    if (!Success)
-        goto fail1;
-
     NeedReboot = FALSE;
 
-    Success = CheckStatus(&NeedReboot);
-    if (Success && NeedReboot)
+    (VOID) CheckStatus(&NeedReboot);
+
+    if (NeedReboot)
         (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData);
 
     Log("<====");
 
     return NO_ERROR;
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = __GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return Error;
 }
 
 static DECLSPEC_NOINLINE HRESULT
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:53:50 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:53:50 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwL8-0005Gk-CZ; Wed, 22 Jul 2015 15:53:50 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwL7-0005GP-5b
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:53:49 +0000
Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id
	4B/00-10796-C8CBFA55; Wed, 22 Jul 2015 15:53:48 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-206.messagelabs.com!1437580427!22921853!1
X-Originating-IP: [209.85.212.171]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13246 invoked from network); 22 Jul 2015 15:53:48 -0000
Received: from mail-wi0-f171.google.com (HELO mail-wi0-f171.google.com)
	(209.85.212.171)
	by server-12.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:53:48 -0000
Received: by wibxm9 with SMTP id xm9so109299839wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:53:47 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=OvQ00QmIVpkvhZ1/8Ra3uJDEXz9BL0bMVSmrj3uxTG4=;
	b=RieGbZQJH84QiQUOzBJ2zHEGZg10nqSMXnM5NRmunA3E32JIXoqhNifxmHvywi0M6G
	a5BhYn7S6Nd+0TiaxKE6oyExIRCIP7niCubeYX2KaYUyVvIkJUM+DN+/dS8sB6sTAZWj
	k3/4zXZQ/efXxkrksqplf9Kk2rf05NiuiDnb0W60ZHCoS0A4g6xKXy90InLW0fM0GTDI
	OmprRk8oHrfn7/JmPOhQeioNqftETDR0Bd47gubri7fWjswJPK/L3Ms6Q2eadfyobh08
	egJQ5bI4XDR+0qW3vf00/xoW2pvQxMPu7aUNAnXPQtgpfNRCnj33Z3JDSS/nLKERJEU6
	KSew==
X-Received: by 10.180.92.40 with SMTP id cj8mr7338396wib.92.1437580427714;
	Wed, 22 Jul 2015 08:53:47 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	m10sm4012235wib.17.2015.07.22.08.53.46
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:53:47 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:53:44 +0100
Message-Id: <1437580425-8212-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/2] Force a re-enumeration of PDOs after
	filter destruction
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

If the underlying PDO has not gone away then we need to create a fresh
filter object.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xendisk/fdo.c | 8 ++++++++
 src/xendisk/fdo.h | 5 +++++
 src/xendisk/pdo.c | 3 +++
 3 files changed, 16 insertions(+)

diff --git a/src/xendisk/fdo.c b/src/xendisk/fdo.c
index 09f785f..cfa1ad3 100644
--- a/src/xendisk/fdo.c
+++ b/src/xendisk/fdo.c
@@ -165,6 +165,14 @@ __FdoGetPhysicalDeviceObject(
     return Fdo->PhysicalDeviceObject;
 }
 
+PDEVICE_OBJECT
+FdoGetPhysicalDeviceObject(
+    IN  PXENDISK_FDO    Fdo
+    )
+{
+    return __FdoGetPhysicalDeviceObject(Fdo);
+}
+
 VOID
 FdoAddPhysicalDeviceObject(
     IN  PXENDISK_FDO    Fdo,
diff --git a/src/xendisk/fdo.h b/src/xendisk/fdo.h
index 0b30911..a6fb68b 100644
--- a/src/xendisk/fdo.h
+++ b/src/xendisk/fdo.h
@@ -59,6 +59,11 @@ FdoReleaseMutex(
     IN  PXENDISK_FDO     Fdo
     );
 
+extern PDEVICE_OBJECT
+FdoGetPhysicalDeviceObject(
+    IN  PXENDISK_FDO    Fdo
+    );
+
 extern NTSTATUS
 FdoDispatch(
     IN  PXENDISK_FDO    Fdo,
diff --git a/src/xendisk/pdo.c b/src/xendisk/pdo.c
index dffb294..07f4cfd 100644
--- a/src/xendisk/pdo.c
+++ b/src/xendisk/pdo.c
@@ -1098,6 +1098,9 @@ done:
     PdoDestroy(Pdo);
     FdoReleaseMutex(Fdo);
 
+    IoInvalidateDeviceRelations(FdoGetPhysicalDeviceObject(Fdo),
+                                BusRelations);
+
     return status;
 
 fail1:
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:53:50 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:53:50 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwL8-0005Gk-CZ; Wed, 22 Jul 2015 15:53:50 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwL7-0005GP-5b
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:53:49 +0000
Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id
	4B/00-10796-C8CBFA55; Wed, 22 Jul 2015 15:53:48 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-206.messagelabs.com!1437580427!22921853!1
X-Originating-IP: [209.85.212.171]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13246 invoked from network); 22 Jul 2015 15:53:48 -0000
Received: from mail-wi0-f171.google.com (HELO mail-wi0-f171.google.com)
	(209.85.212.171)
	by server-12.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:53:48 -0000
Received: by wibxm9 with SMTP id xm9so109299839wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:53:47 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=OvQ00QmIVpkvhZ1/8Ra3uJDEXz9BL0bMVSmrj3uxTG4=;
	b=RieGbZQJH84QiQUOzBJ2zHEGZg10nqSMXnM5NRmunA3E32JIXoqhNifxmHvywi0M6G
	a5BhYn7S6Nd+0TiaxKE6oyExIRCIP7niCubeYX2KaYUyVvIkJUM+DN+/dS8sB6sTAZWj
	k3/4zXZQ/efXxkrksqplf9Kk2rf05NiuiDnb0W60ZHCoS0A4g6xKXy90InLW0fM0GTDI
	OmprRk8oHrfn7/JmPOhQeioNqftETDR0Bd47gubri7fWjswJPK/L3Ms6Q2eadfyobh08
	egJQ5bI4XDR+0qW3vf00/xoW2pvQxMPu7aUNAnXPQtgpfNRCnj33Z3JDSS/nLKERJEU6
	KSew==
X-Received: by 10.180.92.40 with SMTP id cj8mr7338396wib.92.1437580427714;
	Wed, 22 Jul 2015 08:53:47 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	m10sm4012235wib.17.2015.07.22.08.53.46
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:53:47 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:53:44 +0100
Message-Id: <1437580425-8212-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/2] Force a re-enumeration of PDOs after
	filter destruction
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

If the underlying PDO has not gone away then we need to create a fresh
filter object.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xendisk/fdo.c | 8 ++++++++
 src/xendisk/fdo.h | 5 +++++
 src/xendisk/pdo.c | 3 +++
 3 files changed, 16 insertions(+)

diff --git a/src/xendisk/fdo.c b/src/xendisk/fdo.c
index 09f785f..cfa1ad3 100644
--- a/src/xendisk/fdo.c
+++ b/src/xendisk/fdo.c
@@ -165,6 +165,14 @@ __FdoGetPhysicalDeviceObject(
     return Fdo->PhysicalDeviceObject;
 }
 
+PDEVICE_OBJECT
+FdoGetPhysicalDeviceObject(
+    IN  PXENDISK_FDO    Fdo
+    )
+{
+    return __FdoGetPhysicalDeviceObject(Fdo);
+}
+
 VOID
 FdoAddPhysicalDeviceObject(
     IN  PXENDISK_FDO    Fdo,
diff --git a/src/xendisk/fdo.h b/src/xendisk/fdo.h
index 0b30911..a6fb68b 100644
--- a/src/xendisk/fdo.h
+++ b/src/xendisk/fdo.h
@@ -59,6 +59,11 @@ FdoReleaseMutex(
     IN  PXENDISK_FDO     Fdo
     );
 
+extern PDEVICE_OBJECT
+FdoGetPhysicalDeviceObject(
+    IN  PXENDISK_FDO    Fdo
+    );
+
 extern NTSTATUS
 FdoDispatch(
     IN  PXENDISK_FDO    Fdo,
diff --git a/src/xendisk/pdo.c b/src/xendisk/pdo.c
index dffb294..07f4cfd 100644
--- a/src/xendisk/pdo.c
+++ b/src/xendisk/pdo.c
@@ -1098,6 +1098,9 @@ done:
     PdoDestroy(Pdo);
     FdoReleaseMutex(Fdo);
 
+    IoInvalidateDeviceRelations(FdoGetPhysicalDeviceObject(Fdo),
+                                BusRelations);
+
     return status;
 
 fail1:
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:53:55 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:53:55 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwLD-0005IR-EB; Wed, 22 Jul 2015 15:53:55 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwLB-0005Ho-SY
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:53:54 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	3B/85-17050-19CBFA55; Wed, 22 Jul 2015 15:53:53 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-31.messagelabs.com!1437580428!28288874!1
X-Originating-IP: [209.85.212.181]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8738 invoked from network); 22 Jul 2015 15:53:48 -0000
Received: from mail-wi0-f181.google.com (HELO mail-wi0-f181.google.com)
	(209.85.212.181)
	by server-2.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:53:48 -0000
Received: by wicgb10 with SMTP id gb10so104555465wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:53:48 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=V9ZfCU9oTrdr7MnWLL9sChX7CzHJEp8PLbwioygMcJY=;
	b=oEQnYXb/IgixA+USaYNfqkka3ewxLwDkdRZGeZ35hWOJDJpe9Lq9eoYKsRHyxLrAw+
	uM8sg+tEvg7rfemomtBdjOqL5p08v0pngs2H84S49i7EDzbpNyjrEGGiHFriOec1XuA1
	7hH/HjqtQIN6NIiwowUBja9q2+pILquVlrrVuPhIdcDZHu5zYnnI/xI9liXc8++sIYOX
	G/9JcfIxTg2TSag5jry7+gyvXxcLfim3vmy7wHrQAxHawJPYJ6xmJq75Zri7YgPulkHn
	whi4yyJ5bsuQTE5D8DsbJwxrGCwOGIXV7VsZjZ664NctmyjNeGPyTVmqE4d2oxbc6epk
	qDEA==
X-Received: by 10.194.77.179 with SMTP id t19mr6897081wjw.30.1437580428710;
	Wed, 22 Jul 2015 08:53:48 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	m10sm4012235wib.17.2015.07.22.08.53.47
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:53:48 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:53:45 +0100
Message-Id: <1437580425-8212-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437580425-8212-1-git-send-email-paul.durrant@citrix.com>
References: <1437580425-8212-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Add missing unplug request
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

If a new target is enumerated during a device relations query then no
request is made for unplug, or reboot. This patch adds the necessary code
to rectify this issue.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvbd/fdo.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index 3a569f3..8d5231f 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -1680,6 +1680,21 @@ FdoDispatchPnp(
 
             if (NeedInvalidate)
                 FdoLogTargets("QUERY_RELATIONS", Fdo);
+
+            if (NeedReboot) {
+                PXENBUS_UNPLUG_INTERFACE    Unplug;
+
+                Unplug = FdoAcquireUnplug(Fdo);
+                ASSERT(Unplug != NULL);
+
+                XENBUS_UNPLUG(Request,
+                              Unplug,
+                              XENBUS_UNPLUG_DEVICE_TYPE_DISKS,
+                              TRUE);
+                XENBUS_UNPLUG(Release, Unplug);
+
+                __FdoNotifyInstaller(Fdo);
+            }
         }
         FdoDereference(Fdo);
         break;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 15:53:55 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 15:53:55 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHwLD-0005IR-EB; Wed, 22 Jul 2015 15:53:55 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHwLB-0005Ho-SY
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 15:53:54 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	3B/85-17050-19CBFA55; Wed, 22 Jul 2015 15:53:53 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-31.messagelabs.com!1437580428!28288874!1
X-Originating-IP: [209.85.212.181]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8738 invoked from network); 22 Jul 2015 15:53:48 -0000
Received: from mail-wi0-f181.google.com (HELO mail-wi0-f181.google.com)
	(209.85.212.181)
	by server-2.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 15:53:48 -0000
Received: by wicgb10 with SMTP id gb10so104555465wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 08:53:48 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=V9ZfCU9oTrdr7MnWLL9sChX7CzHJEp8PLbwioygMcJY=;
	b=oEQnYXb/IgixA+USaYNfqkka3ewxLwDkdRZGeZ35hWOJDJpe9Lq9eoYKsRHyxLrAw+
	uM8sg+tEvg7rfemomtBdjOqL5p08v0pngs2H84S49i7EDzbpNyjrEGGiHFriOec1XuA1
	7hH/HjqtQIN6NIiwowUBja9q2+pILquVlrrVuPhIdcDZHu5zYnnI/xI9liXc8++sIYOX
	G/9JcfIxTg2TSag5jry7+gyvXxcLfim3vmy7wHrQAxHawJPYJ6xmJq75Zri7YgPulkHn
	whi4yyJ5bsuQTE5D8DsbJwxrGCwOGIXV7VsZjZ664NctmyjNeGPyTVmqE4d2oxbc6epk
	qDEA==
X-Received: by 10.194.77.179 with SMTP id t19mr6897081wjw.30.1437580428710;
	Wed, 22 Jul 2015 08:53:48 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	m10sm4012235wib.17.2015.07.22.08.53.47
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 08:53:48 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 16:53:45 +0100
Message-Id: <1437580425-8212-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437580425-8212-1-git-send-email-paul.durrant@citrix.com>
References: <1437580425-8212-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Add missing unplug request
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

If a new target is enumerated during a device relations query then no
request is made for unplug, or reboot. This patch adds the necessary code
to rectify this issue.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvbd/fdo.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index 3a569f3..8d5231f 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -1680,6 +1680,21 @@ FdoDispatchPnp(
 
             if (NeedInvalidate)
                 FdoLogTargets("QUERY_RELATIONS", Fdo);
+
+            if (NeedReboot) {
+                PXENBUS_UNPLUG_INTERFACE    Unplug;
+
+                Unplug = FdoAcquireUnplug(Fdo);
+                ASSERT(Unplug != NULL);
+
+                XENBUS_UNPLUG(Request,
+                              Unplug,
+                              XENBUS_UNPLUG_DEVICE_TYPE_DISKS,
+                              TRUE);
+                XENBUS_UNPLUG(Release, Unplug);
+
+                __FdoNotifyInstaller(Fdo);
+            }
         }
         FdoDereference(Fdo);
         break;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 16:55:20 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 16:55:20 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHxId-0001wU-Pj; Wed, 22 Jul 2015 16:55:19 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHxIc-0001wP-Ct
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 16:55:18 +0000
Received: from [193.109.254.147] by server-1.bemta-14.messagelabs.com id
	F2/58-06739-5FACFA55; Wed, 22 Jul 2015 16:55:17 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1437584116!34402141!1
X-Originating-IP: [209.85.160.175]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18125 invoked from network); 22 Jul 2015 16:55:16 -0000
Received: from mail-yk0-f175.google.com (HELO mail-yk0-f175.google.com)
	(209.85.160.175)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 16:55:16 -0000
Received: by ykay190 with SMTP id y190so197470595yka.3
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 09:55:15 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=Tb5EwG4xB1WZovOAgVkcsgi7oF09lrBi5TKUt1v97Us=;
	b=fjtBt/0IJZohCrLppY2UdVZIaumGzS6RxiqRcX0FWymvBYKo0SfudoyI/OPJcyVkqY
	vNoe1WTXoS2wp7fgFRmLw/v+EyLngXxnt/0RnjlULIM5ZXh9A8Hwm1D6/jrrVJ4GI1iE
	OwfOHiN3ckUGhgW2Mcyi3PdMaKAzrXwYhR6UwlgiBGBpwK/YGeUvXwVjxwlAdk9ykCzB
	f2eYF/s1PZFlKXxgA2b932WIrBeKOY4EQI2rPSqxbDwU2RxZW9cBimN8a86eIZKmUesD
	xgQ5UxqMxWrnoqgzuNmN0ryt5UGM/TbEIwBpw8odunvrNzMHmwdx6RsPFbRFF3GVdmHf
	mRyg==
X-Received: by 10.170.143.213 with SMTP id k204mr3401490ykc.91.1437584115851; 
	Wed, 22 Jul 2015 09:55:15 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	u78sm1853377ywu.13.2015.07.22.09.55.13
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 09:55:15 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 17:55:09 +0100
Message-Id: <1437584109-5624-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove redundant function from the
	co-installer
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

GetDeviceInstanceID() is not used by anything any more, so it can go.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 129 ----------------------------------------------------
 1 file changed, 129 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 755eb06..68e3265 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -649,110 +649,6 @@ fail1:
 }
 
 static BOOLEAN
-GetDeviceInstanceID(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData,
-    OUT PTCHAR              *DeviceID,
-    OUT PTCHAR              *InstanceID
-    )
-{
-    DWORD                   DeviceInstanceIDLength;
-    PTCHAR                  DeviceInstanceID;
-    DWORD                   Index;
-    PTCHAR                  Prefix;
-    DWORD                   InstanceIDLength;
-    HRESULT                 Result;
-    HRESULT                 Error;
-
-    if (!SetupDiGetDeviceInstanceId(DeviceInfoSet,
-                                    DeviceInfoData,
-                                    NULL,
-                                    0,
-                                    &DeviceInstanceIDLength)) {
-        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
-            goto fail1;
-    }
-
-    DeviceInstanceIDLength += sizeof (TCHAR);
-
-    DeviceInstanceID = calloc(1, DeviceInstanceIDLength);
-    if (DeviceInstanceID == NULL)
-        goto fail2;
-
-    if (!SetupDiGetDeviceInstanceId(DeviceInfoSet,
-                                    DeviceInfoData,
-                                    DeviceInstanceID,
-                                    DeviceInstanceIDLength,
-                                    NULL))
-        goto fail3;
-
-    for (Index = 0; Index < strlen(DeviceInstanceID); Index++)
-        DeviceInstanceID[Index] = (CHAR)toupper(DeviceInstanceID[Index]);
-
-    *DeviceID = DeviceInstanceID;
-
-    Prefix = strrchr(DeviceInstanceID, '\\');
-    assert(Prefix != NULL);
-    *Prefix++ = '\0';
-
-    DeviceInstanceID = strrchr(Prefix, '&');
-    if (DeviceInstanceID != NULL) {
-        *DeviceInstanceID++ = '\0';
-    } else {
-        DeviceInstanceID = Prefix;
-        Prefix = NULL;
-    }
-
-    if (Prefix != NULL)
-        Log("Parent Prefix = %s", Prefix);
-
-    InstanceIDLength = (ULONG)((strlen(DeviceInstanceID) +
-                                1) * sizeof (TCHAR));
-
-    *InstanceID = calloc(1, InstanceIDLength);
-    if (*InstanceID == NULL)
-        goto fail4;
-
-    Result = StringCbPrintf(*InstanceID,
-                            InstanceIDLength,
-                            "%s",
-                            DeviceInstanceID);
-    assert(SUCCEEDED(Result));
-    
-    Log("DeviceID = %s", *DeviceID);
-    Log("InstanceID = %s", *InstanceID);
-
-    return TRUE;
-
-fail4:
-    Log("fail4");
-
-    DeviceInstanceID = *DeviceID;
-    *DeviceID = NULL;
-
-fail3:
-    Log("fail3");
-
-    free(DeviceInstanceID);
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
 MatchExistingDriver(
     VOID
     )
@@ -1423,21 +1319,12 @@ DifInstallPostProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
-    BOOLEAN                         Success;
-    PTCHAR                          DeviceID;
-    PTCHAR                          InstanceID;
     BOOLEAN                         NeedReboot;
-    HRESULT                         Error;
 
     UNREFERENCED_PARAMETER(Context);
 
     Log("====>");
 
-    Success = GetDeviceInstanceID(DeviceInfoSet, DeviceInfoData,
-                                  &DeviceID, &InstanceID);
-    if (!Success)
-        goto fail1;
-
     NeedReboot = FALSE;
 
     (VOID) CheckStatus("XEN", &NeedReboot);
@@ -1447,25 +1334,9 @@ DifInstallPostProcess(
     if (NeedReboot)
         (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData);
 
-    free(DeviceID);
-    free(InstanceID);
-
     Log("<====");
 
     return NO_ERROR;
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return Error;
 }
 
 static HRESULT
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Jul 22 16:55:20 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 22 Jul 2015 16:55:20 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZHxId-0001wU-Pj; Wed, 22 Jul 2015 16:55:19 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZHxIc-0001wP-Ct
	for win-pv-devel@lists.xenproject.org; Wed, 22 Jul 2015 16:55:18 +0000
Received: from [193.109.254.147] by server-1.bemta-14.messagelabs.com id
	F2/58-06739-5FACFA55; Wed, 22 Jul 2015 16:55:17 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1437584116!34402141!1
X-Originating-IP: [209.85.160.175]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18125 invoked from network); 22 Jul 2015 16:55:16 -0000
Received: from mail-yk0-f175.google.com (HELO mail-yk0-f175.google.com)
	(209.85.160.175)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Jul 2015 16:55:16 -0000
Received: by ykay190 with SMTP id y190so197470595yka.3
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 22 Jul 2015 09:55:15 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=Tb5EwG4xB1WZovOAgVkcsgi7oF09lrBi5TKUt1v97Us=;
	b=fjtBt/0IJZohCrLppY2UdVZIaumGzS6RxiqRcX0FWymvBYKo0SfudoyI/OPJcyVkqY
	vNoe1WTXoS2wp7fgFRmLw/v+EyLngXxnt/0RnjlULIM5ZXh9A8Hwm1D6/jrrVJ4GI1iE
	OwfOHiN3ckUGhgW2Mcyi3PdMaKAzrXwYhR6UwlgiBGBpwK/YGeUvXwVjxwlAdk9ykCzB
	f2eYF/s1PZFlKXxgA2b932WIrBeKOY4EQI2rPSqxbDwU2RxZW9cBimN8a86eIZKmUesD
	xgQ5UxqMxWrnoqgzuNmN0ryt5UGM/TbEIwBpw8odunvrNzMHmwdx6RsPFbRFF3GVdmHf
	mRyg==
X-Received: by 10.170.143.213 with SMTP id k204mr3401490ykc.91.1437584115851; 
	Wed, 22 Jul 2015 09:55:15 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	u78sm1853377ywu.13.2015.07.22.09.55.13
	(version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 22 Jul 2015 09:55:15 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed, 22 Jul 2015 17:55:09 +0100
Message-Id: <1437584109-5624-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove redundant function from the
	co-installer
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

GetDeviceInstanceID() is not used by anything any more, so it can go.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/coinst/coinst.c | 129 ----------------------------------------------------
 1 file changed, 129 deletions(-)

diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index 755eb06..68e3265 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -649,110 +649,6 @@ fail1:
 }
 
 static BOOLEAN
-GetDeviceInstanceID(
-    IN  HDEVINFO            DeviceInfoSet,
-    IN  PSP_DEVINFO_DATA    DeviceInfoData,
-    OUT PTCHAR              *DeviceID,
-    OUT PTCHAR              *InstanceID
-    )
-{
-    DWORD                   DeviceInstanceIDLength;
-    PTCHAR                  DeviceInstanceID;
-    DWORD                   Index;
-    PTCHAR                  Prefix;
-    DWORD                   InstanceIDLength;
-    HRESULT                 Result;
-    HRESULT                 Error;
-
-    if (!SetupDiGetDeviceInstanceId(DeviceInfoSet,
-                                    DeviceInfoData,
-                                    NULL,
-                                    0,
-                                    &DeviceInstanceIDLength)) {
-        if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
-            goto fail1;
-    }
-
-    DeviceInstanceIDLength += sizeof (TCHAR);
-
-    DeviceInstanceID = calloc(1, DeviceInstanceIDLength);
-    if (DeviceInstanceID == NULL)
-        goto fail2;
-
-    if (!SetupDiGetDeviceInstanceId(DeviceInfoSet,
-                                    DeviceInfoData,
-                                    DeviceInstanceID,
-                                    DeviceInstanceIDLength,
-                                    NULL))
-        goto fail3;
-
-    for (Index = 0; Index < strlen(DeviceInstanceID); Index++)
-        DeviceInstanceID[Index] = (CHAR)toupper(DeviceInstanceID[Index]);
-
-    *DeviceID = DeviceInstanceID;
-
-    Prefix = strrchr(DeviceInstanceID, '\\');
-    assert(Prefix != NULL);
-    *Prefix++ = '\0';
-
-    DeviceInstanceID = strrchr(Prefix, '&');
-    if (DeviceInstanceID != NULL) {
-        *DeviceInstanceID++ = '\0';
-    } else {
-        DeviceInstanceID = Prefix;
-        Prefix = NULL;
-    }
-
-    if (Prefix != NULL)
-        Log("Parent Prefix = %s", Prefix);
-
-    InstanceIDLength = (ULONG)((strlen(DeviceInstanceID) +
-                                1) * sizeof (TCHAR));
-
-    *InstanceID = calloc(1, InstanceIDLength);
-    if (*InstanceID == NULL)
-        goto fail4;
-
-    Result = StringCbPrintf(*InstanceID,
-                            InstanceIDLength,
-                            "%s",
-                            DeviceInstanceID);
-    assert(SUCCEEDED(Result));
-    
-    Log("DeviceID = %s", *DeviceID);
-    Log("InstanceID = %s", *InstanceID);
-
-    return TRUE;
-
-fail4:
-    Log("fail4");
-
-    DeviceInstanceID = *DeviceID;
-    *DeviceID = NULL;
-
-fail3:
-    Log("fail3");
-
-    free(DeviceInstanceID);
-
-fail2:
-    Log("fail2");
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return FALSE;
-}
-
-static BOOLEAN
 MatchExistingDriver(
     VOID
     )
@@ -1423,21 +1319,12 @@ DifInstallPostProcess(
     IN  PCOINSTALLER_CONTEXT_DATA   Context
     )
 {
-    BOOLEAN                         Success;
-    PTCHAR                          DeviceID;
-    PTCHAR                          InstanceID;
     BOOLEAN                         NeedReboot;
-    HRESULT                         Error;
 
     UNREFERENCED_PARAMETER(Context);
 
     Log("====>");
 
-    Success = GetDeviceInstanceID(DeviceInfoSet, DeviceInfoData,
-                                  &DeviceID, &InstanceID);
-    if (!Success)
-        goto fail1;
-
     NeedReboot = FALSE;
 
     (VOID) CheckStatus("XEN", &NeedReboot);
@@ -1447,25 +1334,9 @@ DifInstallPostProcess(
     if (NeedReboot)
         (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData);
 
-    free(DeviceID);
-    free(InstanceID);
-
     Log("<====");
 
     return NO_ERROR;
-
-fail1:
-    Error = GetLastError();
-
-    {
-        PTCHAR  Message;
-
-        Message = GetErrorMessage(Error);
-        Log("fail1 (%s)", Message);
-        LocalFree(Message);
-    }
-
-    return Error;
 }
 
 static HRESULT
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 11:38:10 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 11:38:10 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIEpG-0007s5-4x; Thu, 23 Jul 2015 11:38:10 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIEpF-0007rd-4J
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 11:38:09 +0000
Received: from [85.158.139.211] by server-11.bemta-5.messagelabs.com id
	86/07-30603-022D0B55; Thu, 23 Jul 2015 11:38:08 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-8.tower-206.messagelabs.com!1437651485!23134371!1
X-Originating-IP: [209.85.212.179]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11057 invoked from network); 23 Jul 2015 11:38:05 -0000
Received: from mail-wi0-f179.google.com (HELO mail-wi0-f179.google.com)
	(209.85.212.179)
	by server-8.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 11:38:05 -0000
Received: by wibxm9 with SMTP id xm9so204198936wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 04:38:05 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=ia6UYBywuylbMhNQH/splYRiqIoPbsx/LiT5twkY+lc=;
	b=u1woAn5vtzS4NAb4JZj5YIHzYYuRTQnPmGAHPkcOVowewaKW7dMwPXyKj8xRfCcvIF
	b+M0Sgg5E5IYb2Xz0sQuNfNxXhmNWVW/mC3NX+Lo4odDqz93lrZm1Cll20Np+U1UUHiq
	cHIRcyTeC4xFlHR1mVN5PIg5vWfz9c4ad3L2A4NnEWW3XorTtNutoskmZgS79npFGeF0
	iZ3TlBKWWh2asZkqn043EQqMwvkpU0LXAtx2vUMWuBfi/YpgF8mR1UJzhSaBGj8UlnaC
	3CCpjFI2qJccnW5Cox4p22yxCJdXvZZMTFhX55YX4k5wldHIkQ9ZzCIcV7NnfWBNdNJ5
	4R6Q==
X-Received: by 10.180.101.138 with SMTP id fg10mr16363808wib.46.1437651485443; 
	Thu, 23 Jul 2015 04:38:05 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	nb9sm8102509wic.10.2015.07.23.04.38.04
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 04:38:04 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 12:37:58 +0100
Message-Id: <1437651478-5880-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Don't drop FDO mutex between PDO enumeration
	and Relations Count check
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

A PDO can disappear between these two, leading to an assertion failure so
keep the lock held to stop the list from being changed.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xendisk/fdo.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/src/xendisk/fdo.c b/src/xendisk/fdo.c
index cfa1ad3..779b7ad 100644
--- a/src/xendisk/fdo.c
+++ b/src/xendisk/fdo.c
@@ -265,8 +265,6 @@ __FdoEnumerate(
                   Relations->Objects,
                   sizeof (PDEVICE_OBJECT) * Count);
 
-    __FdoAcquireMutex(Fdo);
-
     // Remove any PDOs that do not appear in the device list
     ListEntry = Fdo->Dx->ListEntry.Flink;
     while (ListEntry != &Fdo->Dx->ListEntry) {
@@ -294,8 +292,6 @@ __FdoEnumerate(
         }
     }
 
-    __FdoReleaseMutex(Fdo);
-
     __FdoFree(PhysicalDeviceObject);
     return;
 
@@ -865,11 +861,11 @@ FdoQueryDeviceRelations(
 
     Relations = (PDEVICE_RELATIONS)Irp->IoStatus.Information;
 
+    __FdoAcquireMutex(Fdo);
+
     if (Relations->Count != 0)
         __FdoEnumerate(Fdo, Relations);
 
-    __FdoAcquireMutex(Fdo);
-
     Count = 0;
     for (ListEntry = Fdo->Dx->ListEntry.Flink;
          ListEntry != &Fdo->Dx->ListEntry;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 11:38:10 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 11:38:10 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIEpG-0007s5-4x; Thu, 23 Jul 2015 11:38:10 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIEpF-0007rd-4J
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 11:38:09 +0000
Received: from [85.158.139.211] by server-11.bemta-5.messagelabs.com id
	86/07-30603-022D0B55; Thu, 23 Jul 2015 11:38:08 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-8.tower-206.messagelabs.com!1437651485!23134371!1
X-Originating-IP: [209.85.212.179]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11057 invoked from network); 23 Jul 2015 11:38:05 -0000
Received: from mail-wi0-f179.google.com (HELO mail-wi0-f179.google.com)
	(209.85.212.179)
	by server-8.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 11:38:05 -0000
Received: by wibxm9 with SMTP id xm9so204198936wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 04:38:05 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=ia6UYBywuylbMhNQH/splYRiqIoPbsx/LiT5twkY+lc=;
	b=u1woAn5vtzS4NAb4JZj5YIHzYYuRTQnPmGAHPkcOVowewaKW7dMwPXyKj8xRfCcvIF
	b+M0Sgg5E5IYb2Xz0sQuNfNxXhmNWVW/mC3NX+Lo4odDqz93lrZm1Cll20Np+U1UUHiq
	cHIRcyTeC4xFlHR1mVN5PIg5vWfz9c4ad3L2A4NnEWW3XorTtNutoskmZgS79npFGeF0
	iZ3TlBKWWh2asZkqn043EQqMwvkpU0LXAtx2vUMWuBfi/YpgF8mR1UJzhSaBGj8UlnaC
	3CCpjFI2qJccnW5Cox4p22yxCJdXvZZMTFhX55YX4k5wldHIkQ9ZzCIcV7NnfWBNdNJ5
	4R6Q==
X-Received: by 10.180.101.138 with SMTP id fg10mr16363808wib.46.1437651485443; 
	Thu, 23 Jul 2015 04:38:05 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	nb9sm8102509wic.10.2015.07.23.04.38.04
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 04:38:04 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 12:37:58 +0100
Message-Id: <1437651478-5880-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Don't drop FDO mutex between PDO enumeration
	and Relations Count check
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

A PDO can disappear between these two, leading to an assertion failure so
keep the lock held to stop the list from being changed.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xendisk/fdo.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/src/xendisk/fdo.c b/src/xendisk/fdo.c
index cfa1ad3..779b7ad 100644
--- a/src/xendisk/fdo.c
+++ b/src/xendisk/fdo.c
@@ -265,8 +265,6 @@ __FdoEnumerate(
                   Relations->Objects,
                   sizeof (PDEVICE_OBJECT) * Count);
 
-    __FdoAcquireMutex(Fdo);
-
     // Remove any PDOs that do not appear in the device list
     ListEntry = Fdo->Dx->ListEntry.Flink;
     while (ListEntry != &Fdo->Dx->ListEntry) {
@@ -294,8 +292,6 @@ __FdoEnumerate(
         }
     }
 
-    __FdoReleaseMutex(Fdo);
-
     __FdoFree(PhysicalDeviceObject);
     return;
 
@@ -865,11 +861,11 @@ FdoQueryDeviceRelations(
 
     Relations = (PDEVICE_RELATIONS)Irp->IoStatus.Information;
 
+    __FdoAcquireMutex(Fdo);
+
     if (Relations->Count != 0)
         __FdoEnumerate(Fdo, Relations);
 
-    __FdoAcquireMutex(Fdo);
-
     Count = 0;
     for (ListEntry = Fdo->Dx->ListEntry.Flink;
          ListEntry != &Fdo->Dx->ListEntry;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 11:40:01 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 11:40:01 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIEr3-0008Bx-Lg; Thu, 23 Jul 2015 11:40:01 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIEr2-0008Bl-Kh
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 11:40:00 +0000
Received: from [193.109.254.147] by server-13.bemta-14.messagelabs.com id
	AC/64-16813-F82D0B55; Thu, 23 Jul 2015 11:39:59 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1437651595!28491775!1
X-Originating-IP: [209.85.212.180]
X-SpamReason: No, hits=0.2 required=7.0 tests=UPPERCASE_50_75
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27800 invoked from network); 23 Jul 2015 11:39:55 -0000
Received: from mail-wi0-f180.google.com (HELO mail-wi0-f180.google.com)
	(209.85.212.180)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 11:39:55 -0000
Received: by wibxm9 with SMTP id xm9so204263383wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 04:39:55 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=8CAWHoQk9nXJ3BGEtO59P1IZUVmdQjR7AnJhJHG4Yv0=;
	b=CbO0vTtW3qXTxOjVqEbGdT5j4sJoMkmXh93jBe/OXDt4JVD+ug3nHvhpHrGr32GVUt
	atRnvRw3FNz6LdvdYzgstK7pWO2+FLFF+sfxfys62jVg3L1RETAq5XVN8oaVPdz6tl61
	444iZZH8uLqhS0ozhewmUH2AJLcyrmCHs1FO0iE6pqd/CZSVQI4L8dHithGRUQZmi/PI
	rGBC1qS9rzPa3s2/KeH50GOXJrcvReGXJgfqP8bCEjms+Gjkc+ShzLc4fX9HPZ1AiEXR
	wMXNcDXqOpc/2HYvyFMbqvybjBZ2V6lR94HfV6cgCcaX5K0iorZYae3K2vhZCcLCnUQJ
	tW2w==
X-Received: by 10.194.79.225 with SMTP id m1mr15069504wjx.8.1437651595317;
	Thu, 23 Jul 2015 04:39:55 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	iy4sm8077088wic.24.2015.07.23.04.39.54
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 04:39:54 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 12:39:52 +0100
Message-Id: <1437651592-10196-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Don't mess with DbgPrint filters
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/dbg_print.h | 23 -----------------------
 src/xenvif/driver.c    |  2 --
 2 files changed, 25 deletions(-)

diff --git a/src/xenvif/dbg_print.h b/src/xenvif/dbg_print.h
index ddd5b55..a31af9e 100644
--- a/src/xenvif/dbg_print.h
+++ b/src/xenvif/dbg_print.h
@@ -150,27 +150,4 @@ __Info(
 #define Info(...)  \
         __Info(__MODULE__ "|"  __FUNCTION__ ": ", __VA_ARGS__)
 
-#define DBG_PRINT_ENABLE_FILTER(_Id, _Level)                       \
-        do {                                                        \
-            DbgSetDebugFilterState((_Id), (_Level), TRUE);          \
-        } while (FALSE)
-
-static __inline VOID
-__DbgPrintEnable(
-    VOID
-    )
-{
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_IHVDRIVER_ID, DPFLTR_WARNING_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_IHVDRIVER_ID, DPFLTR_TRACE_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL);
-
-#if DBG
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_DEFAULT_ID, DPFLTR_ERROR_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_DEFAULT_ID, DPFLTR_WARNING_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_DEFAULT_ID, DPFLTR_TRACE_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_DEFAULT_ID, DPFLTR_INFO_LEVEL);
-#endif // DBG
-}
-
 #endif  // _XENVIF_DBG_PRINT_H
diff --git a/src/xenvif/driver.c b/src/xenvif/driver.c
index 26ab79e..f8a8777 100644
--- a/src/xenvif/driver.c
+++ b/src/xenvif/driver.c
@@ -280,8 +280,6 @@ DriverEntry(
     ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
     WdmlibProcgrpInitialize();
 
-    __DbgPrintEnable();
-
     Trace("====>\n");
 
     __DriverSetDriverObject(DriverObject);
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 11:40:01 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 11:40:01 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIEr3-0008Bx-Lg; Thu, 23 Jul 2015 11:40:01 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIEr2-0008Bl-Kh
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 11:40:00 +0000
Received: from [193.109.254.147] by server-13.bemta-14.messagelabs.com id
	AC/64-16813-F82D0B55; Thu, 23 Jul 2015 11:39:59 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1437651595!28491775!1
X-Originating-IP: [209.85.212.180]
X-SpamReason: No, hits=0.2 required=7.0 tests=UPPERCASE_50_75
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27800 invoked from network); 23 Jul 2015 11:39:55 -0000
Received: from mail-wi0-f180.google.com (HELO mail-wi0-f180.google.com)
	(209.85.212.180)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 11:39:55 -0000
Received: by wibxm9 with SMTP id xm9so204263383wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 04:39:55 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=8CAWHoQk9nXJ3BGEtO59P1IZUVmdQjR7AnJhJHG4Yv0=;
	b=CbO0vTtW3qXTxOjVqEbGdT5j4sJoMkmXh93jBe/OXDt4JVD+ug3nHvhpHrGr32GVUt
	atRnvRw3FNz6LdvdYzgstK7pWO2+FLFF+sfxfys62jVg3L1RETAq5XVN8oaVPdz6tl61
	444iZZH8uLqhS0ozhewmUH2AJLcyrmCHs1FO0iE6pqd/CZSVQI4L8dHithGRUQZmi/PI
	rGBC1qS9rzPa3s2/KeH50GOXJrcvReGXJgfqP8bCEjms+Gjkc+ShzLc4fX9HPZ1AiEXR
	wMXNcDXqOpc/2HYvyFMbqvybjBZ2V6lR94HfV6cgCcaX5K0iorZYae3K2vhZCcLCnUQJ
	tW2w==
X-Received: by 10.194.79.225 with SMTP id m1mr15069504wjx.8.1437651595317;
	Thu, 23 Jul 2015 04:39:55 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	iy4sm8077088wic.24.2015.07.23.04.39.54
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 04:39:54 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 12:39:52 +0100
Message-Id: <1437651592-10196-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Don't mess with DbgPrint filters
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/dbg_print.h | 23 -----------------------
 src/xenvif/driver.c    |  2 --
 2 files changed, 25 deletions(-)

diff --git a/src/xenvif/dbg_print.h b/src/xenvif/dbg_print.h
index ddd5b55..a31af9e 100644
--- a/src/xenvif/dbg_print.h
+++ b/src/xenvif/dbg_print.h
@@ -150,27 +150,4 @@ __Info(
 #define Info(...)  \
         __Info(__MODULE__ "|"  __FUNCTION__ ": ", __VA_ARGS__)
 
-#define DBG_PRINT_ENABLE_FILTER(_Id, _Level)                       \
-        do {                                                        \
-            DbgSetDebugFilterState((_Id), (_Level), TRUE);          \
-        } while (FALSE)
-
-static __inline VOID
-__DbgPrintEnable(
-    VOID
-    )
-{
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_IHVDRIVER_ID, DPFLTR_WARNING_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_IHVDRIVER_ID, DPFLTR_TRACE_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL);
-
-#if DBG
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_DEFAULT_ID, DPFLTR_ERROR_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_DEFAULT_ID, DPFLTR_WARNING_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_DEFAULT_ID, DPFLTR_TRACE_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_DEFAULT_ID, DPFLTR_INFO_LEVEL);
-#endif // DBG
-}
-
 #endif  // _XENVIF_DBG_PRINT_H
diff --git a/src/xenvif/driver.c b/src/xenvif/driver.c
index 26ab79e..f8a8777 100644
--- a/src/xenvif/driver.c
+++ b/src/xenvif/driver.c
@@ -280,8 +280,6 @@ DriverEntry(
     ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
     WdmlibProcgrpInitialize();
 
-    __DbgPrintEnable();
-
     Trace("====>\n");
 
     __DriverSetDriverObject(DriverObject);
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 14:09:48 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 14:09:48 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIHC0-0003Ui-CE; Thu, 23 Jul 2015 14:09:48 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIHBy-0003UT-Vs
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 14:09:47 +0000
Received: from [85.158.139.211] by server-16.bemta-5.messagelabs.com id
	7F/EC-22101-AA5F0B55; Thu, 23 Jul 2015 14:09:46 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-7.tower-206.messagelabs.com!1437660585!23237934!1
X-Originating-IP: [209.85.212.170]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9253 invoked from network); 23 Jul 2015 14:09:45 -0000
Received: from mail-wi0-f170.google.com (HELO mail-wi0-f170.google.com)
	(209.85.212.170)
	by server-7.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 14:09:45 -0000
Received: by wibud3 with SMTP id ud3so26140811wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 07:09:45 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=wr+7ehAYef1QiTvRXDfPVaYOLXo6dhBDBn7nCSWx/Tg=;
	b=L7UR5hCM4rW0hAtAPjmE0QCL4yGVPxGMFlRU0FLj3k8v/DuQOzF5DMoS9WgIj770yE
	8QogNIVoL0oOZ7+dygB4Ru8Ik3NAqg75VOOaN+KCnfpmywmHMXf7w4hlQFlHt7LyM6Om
	K9ZX+MYiLpXLZRYu5qisJzzUexGXkpzr0i5d3XVQuGl0JTD3SHADoqhX45FqFehC46xg
	lTkAKTVory9TzucSm/lkEQmWrOBLPZqy1yYju3w+sJ54XXYLfTTa6IcsMeHCn2mkRTkz
	8kHCUEj3EkhDo7ep5pnlKobu5nKAvXbds31I/yHseG2/Z9uhXLO/ynuLJxXi/PFlbcdO
	mUUw==
X-Received: by 10.180.72.145 with SMTP id d17mr53468399wiv.69.1437660585585;
	Thu, 23 Jul 2015 07:09:45 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	ed10sm3311263wic.0.2015.07.23.07.09.44
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 07:09:44 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 15:09:35 +0100
Message-Id: <1437660575-7820-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove Relations->Count assertion
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It's bogus in the case of block-detach

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xendisk/fdo.c | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/src/xendisk/fdo.c b/src/xendisk/fdo.c
index 779b7ad..082e115 100644
--- a/src/xendisk/fdo.c
+++ b/src/xendisk/fdo.c
@@ -866,7 +866,6 @@ FdoQueryDeviceRelations(
     if (Relations->Count != 0)
         __FdoEnumerate(Fdo, Relations);
 
-    Count = 0;
     for (ListEntry = Fdo->Dx->ListEntry.Flink;
          ListEntry != &Fdo->Dx->ListEntry;
          ListEntry = ListEntry->Flink) {
@@ -877,10 +876,7 @@ FdoQueryDeviceRelations(
 
         if (PdoGetDevicePnpState(Pdo) == Present)
             PdoSetDevicePnpState(Pdo, Enumerated);
-
-        Count++;
     }
-    ASSERT3U(Relations->Count, ==, Count);
 
     __FdoReleaseMutex(Fdo);
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 14:09:48 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 14:09:48 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIHC0-0003Ui-CE; Thu, 23 Jul 2015 14:09:48 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIHBy-0003UT-Vs
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 14:09:47 +0000
Received: from [85.158.139.211] by server-16.bemta-5.messagelabs.com id
	7F/EC-22101-AA5F0B55; Thu, 23 Jul 2015 14:09:46 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-7.tower-206.messagelabs.com!1437660585!23237934!1
X-Originating-IP: [209.85.212.170]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9253 invoked from network); 23 Jul 2015 14:09:45 -0000
Received: from mail-wi0-f170.google.com (HELO mail-wi0-f170.google.com)
	(209.85.212.170)
	by server-7.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 14:09:45 -0000
Received: by wibud3 with SMTP id ud3so26140811wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 07:09:45 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=wr+7ehAYef1QiTvRXDfPVaYOLXo6dhBDBn7nCSWx/Tg=;
	b=L7UR5hCM4rW0hAtAPjmE0QCL4yGVPxGMFlRU0FLj3k8v/DuQOzF5DMoS9WgIj770yE
	8QogNIVoL0oOZ7+dygB4Ru8Ik3NAqg75VOOaN+KCnfpmywmHMXf7w4hlQFlHt7LyM6Om
	K9ZX+MYiLpXLZRYu5qisJzzUexGXkpzr0i5d3XVQuGl0JTD3SHADoqhX45FqFehC46xg
	lTkAKTVory9TzucSm/lkEQmWrOBLPZqy1yYju3w+sJ54XXYLfTTa6IcsMeHCn2mkRTkz
	8kHCUEj3EkhDo7ep5pnlKobu5nKAvXbds31I/yHseG2/Z9uhXLO/ynuLJxXi/PFlbcdO
	mUUw==
X-Received: by 10.180.72.145 with SMTP id d17mr53468399wiv.69.1437660585585;
	Thu, 23 Jul 2015 07:09:45 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	ed10sm3311263wic.0.2015.07.23.07.09.44
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 07:09:44 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 15:09:35 +0100
Message-Id: <1437660575-7820-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove Relations->Count assertion
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It's bogus in the case of block-detach

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xendisk/fdo.c | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/src/xendisk/fdo.c b/src/xendisk/fdo.c
index 779b7ad..082e115 100644
--- a/src/xendisk/fdo.c
+++ b/src/xendisk/fdo.c
@@ -866,7 +866,6 @@ FdoQueryDeviceRelations(
     if (Relations->Count != 0)
         __FdoEnumerate(Fdo, Relations);
 
-    Count = 0;
     for (ListEntry = Fdo->Dx->ListEntry.Flink;
          ListEntry != &Fdo->Dx->ListEntry;
          ListEntry = ListEntry->Flink) {
@@ -877,10 +876,7 @@ FdoQueryDeviceRelations(
 
         if (PdoGetDevicePnpState(Pdo) == Present)
             PdoSetDevicePnpState(Pdo, Enumerated);
-
-        Count++;
     }
-    ASSERT3U(Relations->Count, ==, Count);
 
     __FdoReleaseMutex(Fdo);
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 14:13:07 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 14:13:07 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIHFD-0003al-Ki; Thu, 23 Jul 2015 14:13:07 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIHFC-0003ag-Oy
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 14:13:06 +0000
Received: from [85.158.137.68] by server-13.bemta-3.messagelabs.com id
	B1/F6-11060-276F0B55; Thu, 23 Jul 2015 14:13:06 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-7.tower-31.messagelabs.com!1437660785!28650023!1
X-Originating-IP: [209.85.212.169]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8861 invoked from network); 23 Jul 2015 14:13:05 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-7.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 14:13:05 -0000
Received: by wibxm9 with SMTP id xm9so151426631wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 07:13:05 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=HUyLYDPh0v/WBwBlyCBkQFNBeAIYMmAeiqdjletE1EQ=;
	b=EvYvsvXsWo3RdC5JV5SEv47J40uU/csOgTUGVzyjAyNrKa0tCtlp9FS8WVmXTwsHES
	xzHTe+0T0CoYcBncH3/jCMljL5of45KixXUgq2thUMCOm9K37CNAhQsbSXYfKSxbejXR
	UXmJJgDMOc/VxMgmwWjEiY8Q9NymnbaQ9sdzkHoE28/bEqa57JoMYr9H2TbKn3lvHBkP
	CqBdojO3b3XUMInKer45WXOQ1cdb57JtLrueAh/Ndvecl9bNcZA3xxPfCRBcP3ETRG4W
	LsXS/SHREkucRWZH32xDMKu6FI1gm0Y6qlqqx2MqL4wPAXKHMiCbIS9TXCBw92963JoN
	Sivg==
X-Received: by 10.194.109.229 with SMTP id hv5mr17498839wjb.119.1437660785095; 
	Thu, 23 Jul 2015 07:13:05 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id h9sm7744794wjx.20.2015.07.23.07.13.04
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 07:13:04 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 15:12:47 +0100
Message-Id: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/7] Give List member of XENBUS_FDO a better
	name
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The list contains interrupt tracking structures so call it InterruptList.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/fdo.c | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 01ffdc3..7908f47 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -137,7 +137,7 @@ struct _XENBUS_FDO {
     XENBUS_BALLOON_INTERFACE        BalloonInterface;
 
     PXENBUS_RANGE_SET               RangeSet;
-    LIST_ENTRY                      List;
+    LIST_ENTRY                      InterruptList;
 
     PXENBUS_EVTCHN_CHANNEL          Channel;
     PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
@@ -2220,7 +2220,7 @@ FdoCreateInterrupt(
     PXENBUS_INTERRUPT   Interrupt;
     NTSTATUS            status;
 
-    InitializeListHead(&Fdo->List);
+    InitializeListHead(&Fdo->InterruptList);
 
     for (Index = 0; Index < Fdo->TranslatedResourceList->Count; Index++) {
         PCM_PARTIAL_RESOURCE_DESCRIPTOR Raw = &Fdo->RawResourceList->PartialDescriptors[Index];
@@ -2233,7 +2233,7 @@ FdoCreateInterrupt(
         if (!NT_SUCCESS(status))
             goto fail1;
 
-        InsertTailList(&Fdo->List, &Interrupt->ListEntry);
+        InsertTailList(&Fdo->InterruptList, &Interrupt->ListEntry);
     }
 
     return STATUS_SUCCESS;
@@ -2241,11 +2241,11 @@ FdoCreateInterrupt(
 fail1:
     Error("fail1 (%08x)\n", status);
 
-    while (!IsListEmpty(&Fdo->List)) {
+    while (!IsListEmpty(&Fdo->InterruptList)) {
         PLIST_ENTRY ListEntry;
 
-        ListEntry = RemoveHeadList(&Fdo->List);
-        ASSERT(ListEntry != &Fdo->List);
+        ListEntry = RemoveHeadList(&Fdo->InterruptList);
+        ASSERT(ListEntry != &Fdo->InterruptList);
 
         RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
 
@@ -2254,7 +2254,7 @@ fail1:
         FdoDisconnectInterrupt(Fdo, Interrupt);
     }
 
-    RtlZeroMemory(&Fdo->List, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Fdo->InterruptList, sizeof (LIST_ENTRY));
 
     return status;
 }
@@ -2273,8 +2273,8 @@ FdoAllocateInterrupt(
     PXENBUS_INTERRUPT       Interrupt;
     KIRQL                   Irql;
 
-    for (ListEntry = Fdo->List.Flink;
-         ListEntry != &Fdo->List;
+    for (ListEntry = Fdo->InterruptList.Flink;
+         ListEntry != &Fdo->InterruptList;
          ListEntry = ListEntry->Flink) {
         Interrupt = CONTAINING_RECORD(ListEntry, XENBUS_INTERRUPT, ListEntry);
 
@@ -2340,12 +2340,12 @@ FdoDestroyInterrupt(
     IN  PXENBUS_FDO     Fdo
     )
 {
-    while (!IsListEmpty(&Fdo->List)) {
+    while (!IsListEmpty(&Fdo->InterruptList)) {
         PLIST_ENTRY         ListEntry;
         PXENBUS_INTERRUPT   Interrupt;
 
-        ListEntry = RemoveHeadList(&Fdo->List);
-        ASSERT(ListEntry != &Fdo->List);
+        ListEntry = RemoveHeadList(&Fdo->InterruptList);
+        ASSERT(ListEntry != &Fdo->InterruptList);
 
         RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
 
@@ -2361,7 +2361,7 @@ FdoDestroyInterrupt(
         FdoDisconnectInterrupt(Fdo, Interrupt);
     }
 
-    RtlZeroMemory(&Fdo->List, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Fdo->InterruptList, sizeof (LIST_ENTRY));
 }
 
 static
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 14:13:07 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 14:13:07 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIHFD-0003al-Ki; Thu, 23 Jul 2015 14:13:07 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIHFC-0003ag-Oy
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 14:13:06 +0000
Received: from [85.158.137.68] by server-13.bemta-3.messagelabs.com id
	B1/F6-11060-276F0B55; Thu, 23 Jul 2015 14:13:06 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-7.tower-31.messagelabs.com!1437660785!28650023!1
X-Originating-IP: [209.85.212.169]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8861 invoked from network); 23 Jul 2015 14:13:05 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-7.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 14:13:05 -0000
Received: by wibxm9 with SMTP id xm9so151426631wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 07:13:05 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=HUyLYDPh0v/WBwBlyCBkQFNBeAIYMmAeiqdjletE1EQ=;
	b=EvYvsvXsWo3RdC5JV5SEv47J40uU/csOgTUGVzyjAyNrKa0tCtlp9FS8WVmXTwsHES
	xzHTe+0T0CoYcBncH3/jCMljL5of45KixXUgq2thUMCOm9K37CNAhQsbSXYfKSxbejXR
	UXmJJgDMOc/VxMgmwWjEiY8Q9NymnbaQ9sdzkHoE28/bEqa57JoMYr9H2TbKn3lvHBkP
	CqBdojO3b3XUMInKer45WXOQ1cdb57JtLrueAh/Ndvecl9bNcZA3xxPfCRBcP3ETRG4W
	LsXS/SHREkucRWZH32xDMKu6FI1gm0Y6qlqqx2MqL4wPAXKHMiCbIS9TXCBw92963JoN
	Sivg==
X-Received: by 10.194.109.229 with SMTP id hv5mr17498839wjb.119.1437660785095; 
	Thu, 23 Jul 2015 07:13:05 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id h9sm7744794wjx.20.2015.07.23.07.13.04
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 07:13:04 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 15:12:47 +0100
Message-Id: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/7] Give List member of XENBUS_FDO a better
	name
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The list contains interrupt tracking structures so call it InterruptList.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/fdo.c | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 01ffdc3..7908f47 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -137,7 +137,7 @@ struct _XENBUS_FDO {
     XENBUS_BALLOON_INTERFACE        BalloonInterface;
 
     PXENBUS_RANGE_SET               RangeSet;
-    LIST_ENTRY                      List;
+    LIST_ENTRY                      InterruptList;
 
     PXENBUS_EVTCHN_CHANNEL          Channel;
     PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
@@ -2220,7 +2220,7 @@ FdoCreateInterrupt(
     PXENBUS_INTERRUPT   Interrupt;
     NTSTATUS            status;
 
-    InitializeListHead(&Fdo->List);
+    InitializeListHead(&Fdo->InterruptList);
 
     for (Index = 0; Index < Fdo->TranslatedResourceList->Count; Index++) {
         PCM_PARTIAL_RESOURCE_DESCRIPTOR Raw = &Fdo->RawResourceList->PartialDescriptors[Index];
@@ -2233,7 +2233,7 @@ FdoCreateInterrupt(
         if (!NT_SUCCESS(status))
             goto fail1;
 
-        InsertTailList(&Fdo->List, &Interrupt->ListEntry);
+        InsertTailList(&Fdo->InterruptList, &Interrupt->ListEntry);
     }
 
     return STATUS_SUCCESS;
@@ -2241,11 +2241,11 @@ FdoCreateInterrupt(
 fail1:
     Error("fail1 (%08x)\n", status);
 
-    while (!IsListEmpty(&Fdo->List)) {
+    while (!IsListEmpty(&Fdo->InterruptList)) {
         PLIST_ENTRY ListEntry;
 
-        ListEntry = RemoveHeadList(&Fdo->List);
-        ASSERT(ListEntry != &Fdo->List);
+        ListEntry = RemoveHeadList(&Fdo->InterruptList);
+        ASSERT(ListEntry != &Fdo->InterruptList);
 
         RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
 
@@ -2254,7 +2254,7 @@ fail1:
         FdoDisconnectInterrupt(Fdo, Interrupt);
     }
 
-    RtlZeroMemory(&Fdo->List, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Fdo->InterruptList, sizeof (LIST_ENTRY));
 
     return status;
 }
@@ -2273,8 +2273,8 @@ FdoAllocateInterrupt(
     PXENBUS_INTERRUPT       Interrupt;
     KIRQL                   Irql;
 
-    for (ListEntry = Fdo->List.Flink;
-         ListEntry != &Fdo->List;
+    for (ListEntry = Fdo->InterruptList.Flink;
+         ListEntry != &Fdo->InterruptList;
          ListEntry = ListEntry->Flink) {
         Interrupt = CONTAINING_RECORD(ListEntry, XENBUS_INTERRUPT, ListEntry);
 
@@ -2340,12 +2340,12 @@ FdoDestroyInterrupt(
     IN  PXENBUS_FDO     Fdo
     )
 {
-    while (!IsListEmpty(&Fdo->List)) {
+    while (!IsListEmpty(&Fdo->InterruptList)) {
         PLIST_ENTRY         ListEntry;
         PXENBUS_INTERRUPT   Interrupt;
 
-        ListEntry = RemoveHeadList(&Fdo->List);
-        ASSERT(ListEntry != &Fdo->List);
+        ListEntry = RemoveHeadList(&Fdo->InterruptList);
+        ASSERT(ListEntry != &Fdo->InterruptList);
 
         RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
 
@@ -2361,7 +2361,7 @@ FdoDestroyInterrupt(
         FdoDisconnectInterrupt(Fdo, Interrupt);
     }
 
-    RtlZeroMemory(&Fdo->List, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Fdo->InterruptList, sizeof (LIST_ENTRY));
 }
 
 static
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 14:13:09 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 14:13:09 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIHFF-0003bF-Lr; Thu, 23 Jul 2015 14:13:09 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIHFE-0003ag-6u
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 14:13:08 +0000
Received: from [85.158.137.68] by server-13.bemta-3.messagelabs.com id
	F0/17-11060-376F0B55; Thu, 23 Jul 2015 14:13:07 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-31.messagelabs.com!1437660786!26213129!1
X-Originating-IP: [209.85.212.176]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2938 invoked from network); 23 Jul 2015 14:13:07 -0000
Received: from mail-wi0-f176.google.com (HELO mail-wi0-f176.google.com)
	(209.85.212.176)
	by server-14.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 14:13:07 -0000
Received: by wibxm9 with SMTP id xm9so151427522wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 07:13:06 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=wxLg7MvdnXhFI3YHTrdaRB76E5NwqWrWrE7tLL2VnEU=;
	b=DktNu2as/GSl0ugeFvzCqO3JU8hA++q/HDPSDGS428J0KzmCCo48VQFOVOiKRSNjXF
	wOL5+IU/oNTZyN8UauJUNzjoq0YFwnwEnHOMIK0vR85rGc+wM51yCRzEiaFAJfxkgHkH
	DyaraqxbyG32spQg9FCnWgc2qsWODJbSV25ySy+9CNCZEjhCXqcDIW4eQ0pslHHLCi6Y
	tTHyD5IgEKm6Ok4X61bm6WcTdO+Z6rRs2QcEijSR+l6I5YrkTi1SAEsBQixXhK4hEKyd
	HnfDvELsJ9cWudcb4JT4sZ69YjL8tBfHKif+U1jGT64Y1t9ZsM+2PDyLAyUOW5w+APWd
	tKdA==
X-Received: by 10.194.23.106 with SMTP id l10mr17422856wjf.1.1437660786036;
	Thu, 23 Jul 2015 07:13:06 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id h9sm7744794wjx.20.2015.07.23.07.13.05
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 07:13:05 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 15:12:48 +0100
Message-Id: <1437660773-6412-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
References: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/7] Give the RangeSet memmber of XENBUS_FDO
	a better name
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It is used to hold I/O space ranges so call it IoRangeSet.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/fdo.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 7908f47..9eca2ca 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -136,7 +136,7 @@ struct _XENBUS_FDO {
     XENBUS_RANGE_SET_INTERFACE      RangeSetInterface;
     XENBUS_BALLOON_INTERFACE        BalloonInterface;
 
-    PXENBUS_RANGE_SET               RangeSet;
+    PXENBUS_RANGE_SET               IoRangeSet;
     LIST_ENTRY                      InterruptList;
 
     PXENBUS_EVTCHN_CHANNEL          Channel;
@@ -2583,13 +2583,13 @@ found:
     status = XENBUS_RANGE_SET(Create,
                               &Fdo->RangeSetInterface,
                               "io_space",
-                              &Fdo->RangeSet);
+                              &Fdo->IoRangeSet);
     if (!NT_SUCCESS(status))
         goto fail2;
 
     status = XENBUS_RANGE_SET(Put,
                               &Fdo->RangeSetInterface,
-                              Fdo->RangeSet,
+                              Fdo->IoRangeSet,
                               Translated->u.Memory.Start.QuadPart,
                               Translated->u.Memory.Length);
     if (!NT_SUCCESS(status))
@@ -2610,8 +2610,8 @@ fail3:
 
     XENBUS_RANGE_SET(Destroy,
                      &Fdo->RangeSetInterface,
-                     Fdo->RangeSet);
-    Fdo->RangeSet = NULL;
+                     Fdo->IoRangeSet);
+    Fdo->IoRangeSet = NULL;
 
 fail2:
     Error("fail2\n");
@@ -2635,7 +2635,7 @@ FdoAllocateIoSpace(
 
     status = XENBUS_RANGE_SET(Pop,
                               &Fdo->RangeSetInterface,
-                              Fdo->RangeSet,
+                              Fdo->IoRangeSet,
                               Size,
                               &Address->QuadPart);
     if (!NT_SUCCESS(status))
@@ -2665,7 +2665,7 @@ FdoFreeIoSpace(
 
     status = XENBUS_RANGE_SET(Put,
                               &Fdo->RangeSetInterface,
-                              Fdo->RangeSet,
+                              Fdo->IoRangeSet,
                               Address.QuadPart,
                               Size);
     ASSERT(NT_SUCCESS(status));
@@ -2693,15 +2693,15 @@ FdoDestroyIoSpace(
 found:
     status = XENBUS_RANGE_SET(Get,
                               &Fdo->RangeSetInterface,
-                              Fdo->RangeSet,
+                              Fdo->IoRangeSet,
                               Translated->u.Memory.Start.QuadPart,
                               Translated->u.Memory.Length);
     ASSERT(NT_SUCCESS(status));
 
     XENBUS_RANGE_SET(Destroy,
                      &Fdo->RangeSetInterface,
-                     Fdo->RangeSet);
-    Fdo->RangeSet = NULL;
+                     Fdo->IoRangeSet);
+    Fdo->IoRangeSet = NULL;
 }
 
 // This function must not touch pageable code or data
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 14:13:09 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 14:13:09 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIHFF-0003bF-Lr; Thu, 23 Jul 2015 14:13:09 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIHFE-0003ag-6u
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 14:13:08 +0000
Received: from [85.158.137.68] by server-13.bemta-3.messagelabs.com id
	F0/17-11060-376F0B55; Thu, 23 Jul 2015 14:13:07 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-31.messagelabs.com!1437660786!26213129!1
X-Originating-IP: [209.85.212.176]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2938 invoked from network); 23 Jul 2015 14:13:07 -0000
Received: from mail-wi0-f176.google.com (HELO mail-wi0-f176.google.com)
	(209.85.212.176)
	by server-14.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 14:13:07 -0000
Received: by wibxm9 with SMTP id xm9so151427522wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 07:13:06 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=wxLg7MvdnXhFI3YHTrdaRB76E5NwqWrWrE7tLL2VnEU=;
	b=DktNu2as/GSl0ugeFvzCqO3JU8hA++q/HDPSDGS428J0KzmCCo48VQFOVOiKRSNjXF
	wOL5+IU/oNTZyN8UauJUNzjoq0YFwnwEnHOMIK0vR85rGc+wM51yCRzEiaFAJfxkgHkH
	DyaraqxbyG32spQg9FCnWgc2qsWODJbSV25ySy+9CNCZEjhCXqcDIW4eQ0pslHHLCi6Y
	tTHyD5IgEKm6Ok4X61bm6WcTdO+Z6rRs2QcEijSR+l6I5YrkTi1SAEsBQixXhK4hEKyd
	HnfDvELsJ9cWudcb4JT4sZ69YjL8tBfHKif+U1jGT64Y1t9ZsM+2PDyLAyUOW5w+APWd
	tKdA==
X-Received: by 10.194.23.106 with SMTP id l10mr17422856wjf.1.1437660786036;
	Thu, 23 Jul 2015 07:13:06 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id h9sm7744794wjx.20.2015.07.23.07.13.05
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 07:13:05 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 15:12:48 +0100
Message-Id: <1437660773-6412-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
References: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/7] Give the RangeSet memmber of XENBUS_FDO
	a better name
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It is used to hold I/O space ranges so call it IoRangeSet.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/fdo.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 7908f47..9eca2ca 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -136,7 +136,7 @@ struct _XENBUS_FDO {
     XENBUS_RANGE_SET_INTERFACE      RangeSetInterface;
     XENBUS_BALLOON_INTERFACE        BalloonInterface;
 
-    PXENBUS_RANGE_SET               RangeSet;
+    PXENBUS_RANGE_SET               IoRangeSet;
     LIST_ENTRY                      InterruptList;
 
     PXENBUS_EVTCHN_CHANNEL          Channel;
@@ -2583,13 +2583,13 @@ found:
     status = XENBUS_RANGE_SET(Create,
                               &Fdo->RangeSetInterface,
                               "io_space",
-                              &Fdo->RangeSet);
+                              &Fdo->IoRangeSet);
     if (!NT_SUCCESS(status))
         goto fail2;
 
     status = XENBUS_RANGE_SET(Put,
                               &Fdo->RangeSetInterface,
-                              Fdo->RangeSet,
+                              Fdo->IoRangeSet,
                               Translated->u.Memory.Start.QuadPart,
                               Translated->u.Memory.Length);
     if (!NT_SUCCESS(status))
@@ -2610,8 +2610,8 @@ fail3:
 
     XENBUS_RANGE_SET(Destroy,
                      &Fdo->RangeSetInterface,
-                     Fdo->RangeSet);
-    Fdo->RangeSet = NULL;
+                     Fdo->IoRangeSet);
+    Fdo->IoRangeSet = NULL;
 
 fail2:
     Error("fail2\n");
@@ -2635,7 +2635,7 @@ FdoAllocateIoSpace(
 
     status = XENBUS_RANGE_SET(Pop,
                               &Fdo->RangeSetInterface,
-                              Fdo->RangeSet,
+                              Fdo->IoRangeSet,
                               Size,
                               &Address->QuadPart);
     if (!NT_SUCCESS(status))
@@ -2665,7 +2665,7 @@ FdoFreeIoSpace(
 
     status = XENBUS_RANGE_SET(Put,
                               &Fdo->RangeSetInterface,
-                              Fdo->RangeSet,
+                              Fdo->IoRangeSet,
                               Address.QuadPart,
                               Size);
     ASSERT(NT_SUCCESS(status));
@@ -2693,15 +2693,15 @@ FdoDestroyIoSpace(
 found:
     status = XENBUS_RANGE_SET(Get,
                               &Fdo->RangeSetInterface,
-                              Fdo->RangeSet,
+                              Fdo->IoRangeSet,
                               Translated->u.Memory.Start.QuadPart,
                               Translated->u.Memory.Length);
     ASSERT(NT_SUCCESS(status));
 
     XENBUS_RANGE_SET(Destroy,
                      &Fdo->RangeSetInterface,
-                     Fdo->RangeSet);
-    Fdo->RangeSet = NULL;
+                     Fdo->IoRangeSet);
+    Fdo->IoRangeSet = NULL;
 }
 
 // This function must not touch pageable code or data
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 14:13:10 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 14:13:10 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIHFG-0003bk-NQ; Thu, 23 Jul 2015 14:13:10 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIHFF-0003bC-Th
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 14:13:10 +0000
Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id
	D0/90-21115-576F0B55; Thu, 23 Jul 2015 14:13:09 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1437660787!23205557!1
X-Originating-IP: [209.85.212.182]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22151 invoked from network); 23 Jul 2015 14:13:07 -0000
Received: from mail-wi0-f182.google.com (HELO mail-wi0-f182.google.com)
	(209.85.212.182)
	by server-6.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 14:13:07 -0000
Received: by wibud3 with SMTP id ud3so26293873wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 07:13:07 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=UPSjULm4qbU1cubOYq1DN5EL6YT+8BpDPVYXdqHXj78=;
	b=VXrJvFwALkIHcJeulcMA515wAsBDIo6cY6Nl5Xxtj2nH3u/0GTu6tnfZmRTWBYGvT3
	l+E7mVQ2+bjLz0rIWgBQ8P/Ntxm6DioPTX/teWGXyUz/7FQPSIrjJFFONHH1awbUcdCN
	ZvO2kNSbDewZ4JQElY5/0n+HomGAHG9YL/PS+bFOlbTI8UCI7qDkV82JO9Y6jabrMDbg
	QdYw1LylEzqRp3Zkj7NCpAxklfn03f6aLe2s/Zxua68IZRY6KM2LItKYBtH1IRgTB0Dt
	Kj6B24Qz8z1pH4umVrsNbNb7HX6eDIvTbX6zGZULA0BP5/mv8thrwtsIqTtQy2pn32gN
	n0Qw==
X-Received: by 10.194.171.200 with SMTP id aw8mr94137wjc.62.1437660787145;
	Thu, 23 Jul 2015 07:13:07 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id h9sm7744794wjx.20.2015.07.23.07.13.06
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 07:13:06 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 15:12:49 +0100
Message-Id: <1437660773-6412-3-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
References: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 3/7] Stop using XENBUS_DX ListEntry as the
	FDOs list of PDOs
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Add a new List member to XENBUS_FDO for this purpose and hence bring it
into line with XENFILT_FDO.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/fdo.c | 40 +++++++++++++++++++++-------------------
 1 file changed, 21 insertions(+), 19 deletions(-)

diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 9eca2ca..28ccb36 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -97,6 +97,7 @@ struct _XENBUS_FDO {
     CHAR                            VendorName[MAXNAMELEN];
 
     MUTEX                           Mutex;
+    LIST_ENTRY                      List;
     ULONG                           References;
 
     PXENBUS_THREAD                  ScanThread;
@@ -951,7 +952,7 @@ FdoAddPhysicalDeviceObject(
     Dx = (PXENBUS_DX)DeviceObject->DeviceExtension;
     ASSERT3U(Dx->Type, ==, PHYSICAL_DEVICE_OBJECT);
 
-    InsertTailList(&Fdo->Dx->ListEntry, &Dx->ListEntry);
+    InsertTailList(&Fdo->List, &Dx->ListEntry);
     ASSERT3U(Fdo->References, !=, 0);
     Fdo->References++;
 
@@ -1048,8 +1049,8 @@ FdoEnumerate(
 
     __FdoAcquireMutex(Fdo);
 
-    ListEntry = Fdo->Dx->ListEntry.Flink;
-    while (ListEntry != &Fdo->Dx->ListEntry) {
+    ListEntry = Fdo->List.Flink;
+    while (ListEntry != &Fdo->List) {
         PLIST_ENTRY     Next = ListEntry->Flink;
         PXENBUS_DX      Dx = CONTAINING_RECORD(ListEntry, XENBUS_DX, ListEntry);
         PCHAR           Name = Dx->Name;
@@ -2781,8 +2782,8 @@ not_active:
 
     __FdoAcquireMutex(Fdo);
 
-    for (ListEntry = Fdo->Dx->ListEntry.Flink;
-         ListEntry != &Fdo->Dx->ListEntry;
+    for (ListEntry = Fdo->List.Flink;
+         ListEntry != &Fdo->List;
          ListEntry = ListEntry->Flink) {
         PXENBUS_DX  Dx = CONTAINING_RECORD(ListEntry, XENBUS_DX, ListEntry);
         PXENBUS_PDO Pdo = Dx->Pdo;
@@ -2864,8 +2865,8 @@ FdoD0ToD3(
 
     __FdoAcquireMutex(Fdo);
 
-    for (ListEntry = Fdo->Dx->ListEntry.Flink;
-         ListEntry != &Fdo->Dx->ListEntry;
+    for (ListEntry = Fdo->List.Flink;
+         ListEntry != &Fdo->List;
          ListEntry = ListEntry->Flink) {
         PXENBUS_DX  Dx = CONTAINING_RECORD(ListEntry, XENBUS_DX, ListEntry);
         PXENBUS_PDO Pdo = Dx->Pdo;
@@ -3384,8 +3385,8 @@ FdoSurpriseRemoval(
 
     __FdoAcquireMutex(Fdo);
 
-    for (ListEntry = Fdo->Dx->ListEntry.Flink;
-         ListEntry != &Fdo->Dx->ListEntry;
+    for (ListEntry = Fdo->List.Flink;
+         ListEntry != &Fdo->List;
          ListEntry = ListEntry->Flink) {
         PXENBUS_DX  Dx = CONTAINING_RECORD(ListEntry, XENBUS_DX, ListEntry);
         PXENBUS_PDO Pdo = Dx->Pdo;
@@ -3437,8 +3438,8 @@ FdoRemoveDevice(
 
     __FdoAcquireMutex(Fdo);
 
-    ListEntry = Fdo->Dx->ListEntry.Flink;
-    while (ListEntry != &Fdo->Dx->ListEntry) {
+    ListEntry = Fdo->List.Flink;
+    while (ListEntry != &Fdo->List) {
         PLIST_ENTRY Flink = ListEntry->Flink;
         PXENBUS_DX  Dx = CONTAINING_RECORD(ListEntry, XENBUS_DX, ListEntry);
         PXENBUS_PDO Pdo = Dx->Pdo;
@@ -3574,8 +3575,8 @@ FdoQueryDeviceRelations(
     __FdoAcquireMutex(Fdo);
 
     Count = 0;
-    for (ListEntry = Fdo->Dx->ListEntry.Flink;
-         ListEntry != &Fdo->Dx->ListEntry;
+    for (ListEntry = Fdo->List.Flink;
+         ListEntry != &Fdo->List;
          ListEntry = ListEntry->Flink)
         Count++;
 
@@ -3587,8 +3588,8 @@ FdoQueryDeviceRelations(
     if (Relations == NULL)
         goto fail1;
 
-    for (ListEntry = Fdo->Dx->ListEntry.Flink;
-         ListEntry != &Fdo->Dx->ListEntry;
+    for (ListEntry = Fdo->List.Flink;
+         ListEntry != &Fdo->List;
          ListEntry = ListEntry->Flink) {
         PXENBUS_DX  Dx = CONTAINING_RECORD(ListEntry, XENBUS_DX, ListEntry);
         PXENBUS_PDO Pdo = Dx->Pdo;
@@ -3626,8 +3627,8 @@ FdoQueryDeviceRelations(
 
     __FdoAcquireMutex(Fdo);
 
-    for (ListEntry = Fdo->Dx->ListEntry.Flink;
-         ListEntry != &Fdo->Dx->ListEntry;
+    for (ListEntry = Fdo->List.Flink;
+         ListEntry != &Fdo->List;
          ListEntry = ListEntry->Flink) {
         PXENBUS_DX  Dx = CONTAINING_RECORD(ListEntry, XENBUS_DX, ListEntry);
         PXENBUS_PDO Pdo = Dx->Pdo;
@@ -4909,7 +4910,7 @@ FdoCreate(
 
 done:
     InitializeMutex(&Fdo->Mutex);
-    InitializeListHead(&Dx->ListEntry);
+    InitializeListHead(&Fdo->List);
     Fdo->References = 1;
 
     (VOID) FdoSetFriendlyName(Fdo, Header.DeviceID);
@@ -5048,7 +5049,7 @@ FdoDestroy(
     PXENBUS_DX      Dx = Fdo->Dx;
     PDEVICE_OBJECT  FunctionDeviceObject = Dx->DeviceObject;
 
-    ASSERT(IsListEmpty(&Dx->ListEntry));
+    ASSERT(IsListEmpty(&Fdo->List));
     ASSERT3U(Fdo->References, ==, 0);
     ASSERT3U(__FdoGetDevicePnpState(Fdo), ==, Deleted);
 
@@ -5060,6 +5061,7 @@ FdoDestroy(
 
     Dx->Fdo = NULL;
 
+    RtlZeroMemory(&Fdo->List, sizeof (LIST_ENTRY));
     RtlZeroMemory(&Fdo->Mutex, sizeof (MUTEX));
 
     if (__FdoIsActive(Fdo)) {
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 14:13:10 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 14:13:10 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIHFG-0003bk-NQ; Thu, 23 Jul 2015 14:13:10 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIHFF-0003bC-Th
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 14:13:10 +0000
Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id
	D0/90-21115-576F0B55; Thu, 23 Jul 2015 14:13:09 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-6.tower-206.messagelabs.com!1437660787!23205557!1
X-Originating-IP: [209.85.212.182]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22151 invoked from network); 23 Jul 2015 14:13:07 -0000
Received: from mail-wi0-f182.google.com (HELO mail-wi0-f182.google.com)
	(209.85.212.182)
	by server-6.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 14:13:07 -0000
Received: by wibud3 with SMTP id ud3so26293873wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 07:13:07 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=UPSjULm4qbU1cubOYq1DN5EL6YT+8BpDPVYXdqHXj78=;
	b=VXrJvFwALkIHcJeulcMA515wAsBDIo6cY6Nl5Xxtj2nH3u/0GTu6tnfZmRTWBYGvT3
	l+E7mVQ2+bjLz0rIWgBQ8P/Ntxm6DioPTX/teWGXyUz/7FQPSIrjJFFONHH1awbUcdCN
	ZvO2kNSbDewZ4JQElY5/0n+HomGAHG9YL/PS+bFOlbTI8UCI7qDkV82JO9Y6jabrMDbg
	QdYw1LylEzqRp3Zkj7NCpAxklfn03f6aLe2s/Zxua68IZRY6KM2LItKYBtH1IRgTB0Dt
	Kj6B24Qz8z1pH4umVrsNbNb7HX6eDIvTbX6zGZULA0BP5/mv8thrwtsIqTtQy2pn32gN
	n0Qw==
X-Received: by 10.194.171.200 with SMTP id aw8mr94137wjc.62.1437660787145;
	Thu, 23 Jul 2015 07:13:07 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id h9sm7744794wjx.20.2015.07.23.07.13.06
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 07:13:06 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 15:12:49 +0100
Message-Id: <1437660773-6412-3-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
References: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 3/7] Stop using XENBUS_DX ListEntry as the
	FDOs list of PDOs
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Add a new List member to XENBUS_FDO for this purpose and hence bring it
into line with XENFILT_FDO.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/fdo.c | 40 +++++++++++++++++++++-------------------
 1 file changed, 21 insertions(+), 19 deletions(-)

diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 9eca2ca..28ccb36 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -97,6 +97,7 @@ struct _XENBUS_FDO {
     CHAR                            VendorName[MAXNAMELEN];
 
     MUTEX                           Mutex;
+    LIST_ENTRY                      List;
     ULONG                           References;
 
     PXENBUS_THREAD                  ScanThread;
@@ -951,7 +952,7 @@ FdoAddPhysicalDeviceObject(
     Dx = (PXENBUS_DX)DeviceObject->DeviceExtension;
     ASSERT3U(Dx->Type, ==, PHYSICAL_DEVICE_OBJECT);
 
-    InsertTailList(&Fdo->Dx->ListEntry, &Dx->ListEntry);
+    InsertTailList(&Fdo->List, &Dx->ListEntry);
     ASSERT3U(Fdo->References, !=, 0);
     Fdo->References++;
 
@@ -1048,8 +1049,8 @@ FdoEnumerate(
 
     __FdoAcquireMutex(Fdo);
 
-    ListEntry = Fdo->Dx->ListEntry.Flink;
-    while (ListEntry != &Fdo->Dx->ListEntry) {
+    ListEntry = Fdo->List.Flink;
+    while (ListEntry != &Fdo->List) {
         PLIST_ENTRY     Next = ListEntry->Flink;
         PXENBUS_DX      Dx = CONTAINING_RECORD(ListEntry, XENBUS_DX, ListEntry);
         PCHAR           Name = Dx->Name;
@@ -2781,8 +2782,8 @@ not_active:
 
     __FdoAcquireMutex(Fdo);
 
-    for (ListEntry = Fdo->Dx->ListEntry.Flink;
-         ListEntry != &Fdo->Dx->ListEntry;
+    for (ListEntry = Fdo->List.Flink;
+         ListEntry != &Fdo->List;
          ListEntry = ListEntry->Flink) {
         PXENBUS_DX  Dx = CONTAINING_RECORD(ListEntry, XENBUS_DX, ListEntry);
         PXENBUS_PDO Pdo = Dx->Pdo;
@@ -2864,8 +2865,8 @@ FdoD0ToD3(
 
     __FdoAcquireMutex(Fdo);
 
-    for (ListEntry = Fdo->Dx->ListEntry.Flink;
-         ListEntry != &Fdo->Dx->ListEntry;
+    for (ListEntry = Fdo->List.Flink;
+         ListEntry != &Fdo->List;
          ListEntry = ListEntry->Flink) {
         PXENBUS_DX  Dx = CONTAINING_RECORD(ListEntry, XENBUS_DX, ListEntry);
         PXENBUS_PDO Pdo = Dx->Pdo;
@@ -3384,8 +3385,8 @@ FdoSurpriseRemoval(
 
     __FdoAcquireMutex(Fdo);
 
-    for (ListEntry = Fdo->Dx->ListEntry.Flink;
-         ListEntry != &Fdo->Dx->ListEntry;
+    for (ListEntry = Fdo->List.Flink;
+         ListEntry != &Fdo->List;
          ListEntry = ListEntry->Flink) {
         PXENBUS_DX  Dx = CONTAINING_RECORD(ListEntry, XENBUS_DX, ListEntry);
         PXENBUS_PDO Pdo = Dx->Pdo;
@@ -3437,8 +3438,8 @@ FdoRemoveDevice(
 
     __FdoAcquireMutex(Fdo);
 
-    ListEntry = Fdo->Dx->ListEntry.Flink;
-    while (ListEntry != &Fdo->Dx->ListEntry) {
+    ListEntry = Fdo->List.Flink;
+    while (ListEntry != &Fdo->List) {
         PLIST_ENTRY Flink = ListEntry->Flink;
         PXENBUS_DX  Dx = CONTAINING_RECORD(ListEntry, XENBUS_DX, ListEntry);
         PXENBUS_PDO Pdo = Dx->Pdo;
@@ -3574,8 +3575,8 @@ FdoQueryDeviceRelations(
     __FdoAcquireMutex(Fdo);
 
     Count = 0;
-    for (ListEntry = Fdo->Dx->ListEntry.Flink;
-         ListEntry != &Fdo->Dx->ListEntry;
+    for (ListEntry = Fdo->List.Flink;
+         ListEntry != &Fdo->List;
          ListEntry = ListEntry->Flink)
         Count++;
 
@@ -3587,8 +3588,8 @@ FdoQueryDeviceRelations(
     if (Relations == NULL)
         goto fail1;
 
-    for (ListEntry = Fdo->Dx->ListEntry.Flink;
-         ListEntry != &Fdo->Dx->ListEntry;
+    for (ListEntry = Fdo->List.Flink;
+         ListEntry != &Fdo->List;
          ListEntry = ListEntry->Flink) {
         PXENBUS_DX  Dx = CONTAINING_RECORD(ListEntry, XENBUS_DX, ListEntry);
         PXENBUS_PDO Pdo = Dx->Pdo;
@@ -3626,8 +3627,8 @@ FdoQueryDeviceRelations(
 
     __FdoAcquireMutex(Fdo);
 
-    for (ListEntry = Fdo->Dx->ListEntry.Flink;
-         ListEntry != &Fdo->Dx->ListEntry;
+    for (ListEntry = Fdo->List.Flink;
+         ListEntry != &Fdo->List;
          ListEntry = ListEntry->Flink) {
         PXENBUS_DX  Dx = CONTAINING_RECORD(ListEntry, XENBUS_DX, ListEntry);
         PXENBUS_PDO Pdo = Dx->Pdo;
@@ -4909,7 +4910,7 @@ FdoCreate(
 
 done:
     InitializeMutex(&Fdo->Mutex);
-    InitializeListHead(&Dx->ListEntry);
+    InitializeListHead(&Fdo->List);
     Fdo->References = 1;
 
     (VOID) FdoSetFriendlyName(Fdo, Header.DeviceID);
@@ -5048,7 +5049,7 @@ FdoDestroy(
     PXENBUS_DX      Dx = Fdo->Dx;
     PDEVICE_OBJECT  FunctionDeviceObject = Dx->DeviceObject;
 
-    ASSERT(IsListEmpty(&Dx->ListEntry));
+    ASSERT(IsListEmpty(&Fdo->List));
     ASSERT3U(Fdo->References, ==, 0);
     ASSERT3U(__FdoGetDevicePnpState(Fdo), ==, Deleted);
 
@@ -5060,6 +5061,7 @@ FdoDestroy(
 
     Dx->Fdo = NULL;
 
+    RtlZeroMemory(&Fdo->List, sizeof (LIST_ENTRY));
     RtlZeroMemory(&Fdo->Mutex, sizeof (MUTEX));
 
     if (__FdoIsActive(Fdo)) {
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 14:13:14 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 14:13:14 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIHFK-0003cY-Oe; Thu, 23 Jul 2015 14:13:14 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIHFJ-0003ba-Fd
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 14:13:13 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	B1/BA-31258-576F0B55; Thu, 23 Jul 2015 14:13:09 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1437660788!34639964!1
X-Originating-IP: [209.85.212.174]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18093 invoked from network); 23 Jul 2015 14:13:08 -0000
Received: from mail-wi0-f174.google.com (HELO mail-wi0-f174.google.com)
	(209.85.212.174)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 14:13:08 -0000
Received: by wibxm9 with SMTP id xm9so151429186wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 07:13:08 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=vyMSHH9X/t2nA9XVasxpmwnnpSDuy50+CvB9AOz3pLg=;
	b=pWSDji6wNSIl4UndQoYnDmIoP5t8ynA5xd84Zo5BD00BVlt8k17ZAYHqZfaQfc9QKk
	gKi/jxPTH8c/NhV9jwhI5HIFQPP2hS4hEikND1Pqb5Reo3GB8qsToS/xida8lDMSytjc
	x5HUUbuTh+yG657yeGZkSpcPPATezlHBdWi2Fna2OEnfzIfgbNncr9fQHmcsfONlSU8n
	EpSbj6KLSJNBlgrz0pouDIFOSWQXKxqnj5p6+tz5jfSj/ifmVtga83CgQgDo2ffTIq/Y
	wvkkf45OkwypniX7zh/UZ0Hf1lRMHSezauAkxryvOhWYiIWgIl34vl4iaZX1fCJjm1U9
	zp8g==
X-Received: by 10.181.25.234 with SMTP id it10mr17777898wid.0.1437660788369;
	Thu, 23 Jul 2015 07:13:08 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id h9sm7744794wjx.20.2015.07.23.07.13.07
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 07:13:07 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 15:12:50 +0100
Message-Id: <1437660773-6412-4-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
References: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 4/7] Maintain a global list of FDOs in XENBUS
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...similar to that in XENFILT.

Also add a missing mutex acquisition around FdoCreate() in XENFILT.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/driver.c  | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/xenbus/driver.h  | 18 ++++++++---
 src/xenbus/fdo.c     | 32 +++++++++++++++++--
 src/xenbus/fdo.h     |  5 +++
 src/xenfilt/driver.c |  6 ++++
 5 files changed, 141 insertions(+), 7 deletions(-)

diff --git a/src/xenbus/driver.c b/src/xenbus/driver.c
index 6135400..3409270 100644
--- a/src/xenbus/driver.c
+++ b/src/xenbus/driver.c
@@ -38,6 +38,7 @@
 #include "pdo.h"
 #include "driver.h"
 #include "names.h"
+#include "mutex.h"
 #include "dbg_print.h"
 #include "assert.h"
 #include "util.h"
@@ -49,6 +50,10 @@ typedef struct _XENBUS_DRIVER {
     PDRIVER_OBJECT      DriverObject;
     HANDLE              ParametersKey;
     HANDLE              StatusKey;
+
+    MUTEX               Mutex;
+    LIST_ENTRY          List;
+    ULONG               References;
 } XENBUS_DRIVER, *PXENBUS_DRIVER;
 
 static XENBUS_DRIVER    Driver;
@@ -149,6 +154,71 @@ DriverRequestReboot(
                                     1);
 }
 
+static FORCEINLINE VOID
+__DriverAcquireMutex(
+    VOID
+    )
+{
+    AcquireMutex(&Driver.Mutex);
+}
+
+VOID
+DriverAcquireMutex(
+    VOID
+    )
+{
+    __DriverAcquireMutex();
+}
+
+static FORCEINLINE VOID
+__DriverReleaseMutex(
+    VOID
+    )
+{
+    ReleaseMutex(&Driver.Mutex);
+}
+
+VOID
+DriverReleaseMutex(
+    VOID
+    )
+{
+    __DriverReleaseMutex();
+}
+
+VOID
+DriverAddFunctionDeviceObject(
+    IN  PXENBUS_FDO Fdo
+    )
+{
+    PDEVICE_OBJECT  DeviceObject;
+    PXENBUS_DX      Dx;
+
+    DeviceObject = FdoGetDeviceObject(Fdo);
+    Dx = (PXENBUS_DX)DeviceObject->DeviceExtension;
+    ASSERT3U(Dx->Type, ==, FUNCTION_DEVICE_OBJECT);
+
+    InsertTailList(&Driver.List, &Dx->ListEntry);
+    Driver.References++;
+}
+
+VOID
+DriverRemoveFunctionDeviceObject(
+    IN  PXENBUS_FDO Fdo
+    )
+{
+    PDEVICE_OBJECT  DeviceObject;
+    PXENBUS_DX      Dx;
+
+    DeviceObject = FdoGetDeviceObject(Fdo);
+    Dx = (PXENBUS_DX)DeviceObject->DeviceExtension;
+    ASSERT3U(Dx->Type, ==, FUNCTION_DEVICE_OBJECT);
+
+    RemoveEntryList(&Dx->ListEntry);
+    ASSERT3U(Driver.References, !=, 0);
+    --Driver.References;
+}
+
 DRIVER_UNLOAD       DriverUnload;
 
 VOID
@@ -166,6 +236,13 @@ DriverUnload(
     if (*InitSafeBootMode > 0)
         goto done;
 
+    ASSERT(IsListEmpty(&Driver.List));
+    ASSERT3U(Driver.References, ==, 1);
+    --Driver.References;
+
+    RtlZeroMemory(&Driver.List, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Driver.Mutex, sizeof (MUTEX));
+
     StatusKey = __DriverGetStatusKey();
     __DriverSetStatusKey(NULL);
 
@@ -210,16 +287,20 @@ DriverAddDevice(
 
     Trace("====>\n");
 
+    __DriverAcquireMutex();
+
     status = FdoCreate(DeviceObject);
     if (!NT_SUCCESS(status))
         goto fail1;
 
+    __DriverReleaseMutex();
+
     Trace("<====\n");
 
     return STATUS_SUCCESS;
 
 fail1:
-    Error("fail1 (%08x)\n", status);
+    __DriverReleaseMutex();
 
     return status;
 }
@@ -352,6 +433,10 @@ DriverEntry(
        DriverObject->MajorFunction[Index] = DriverDispatch;
     }
 
+    InitializeMutex(&Driver.Mutex);
+    InitializeListHead(&Driver.List);
+    Driver.References = 1;
+
 done:
     Trace("<====\n");
 
diff --git a/src/xenbus/driver.h b/src/xenbus/driver.h
index 0208f9c..78b1b25 100644
--- a/src/xenbus/driver.h
+++ b/src/xenbus/driver.h
@@ -48,14 +48,14 @@ DriverRequestReboot(
     );
 
 extern VOID
-DriverAddFilters(
+DriverAcquireMutex(
     VOID
-    );
+     );
 
 extern VOID
-DriverRemoveFilters(
+DriverReleaseMutex(
     VOID
-    );
+     );
 
 typedef struct _XENBUS_FDO      XENBUS_FDO, *PXENBUS_FDO;
 typedef struct _XENBUS_PDO      XENBUS_PDO, *PXENBUS_PDO;
@@ -65,6 +65,16 @@ typedef struct _XENBUS_PDO      XENBUS_PDO, *PXENBUS_PDO;
 
 #define MAX_DEVICE_ID_LEN   200
 
+extern VOID
+DriverAddFunctionDeviceObject(
+    IN  PXENBUS_FDO Fdo
+    );
+
+extern VOID
+DriverRemoveFunctionDeviceObject(
+    IN  PXENBUS_FDO Fdo
+    );
+
 #pragma warning(push)
 #pragma warning(disable:4201) // nonstandard extension used : nameless struct/union
 
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 28ccb36..5d03f8c 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -250,6 +250,24 @@ __FdoGetSystemPowerState(
 }
 
 static FORCEINLINE PDEVICE_OBJECT
+__FdoGetDeviceObject(
+    IN  PXENBUS_FDO Fdo
+    )
+{
+    PXENBUS_DX      Dx = Fdo->Dx;
+
+    return Dx->DeviceObject;
+}
+
+PDEVICE_OBJECT
+FdoGetDeviceObject(
+    IN  PXENBUS_FDO Fdo
+    )
+{
+    return __FdoGetDeviceObject(Fdo);
+}
+
+static FORCEINLINE PDEVICE_OBJECT
 __FdoGetPhysicalDeviceObject(
     IN  PXENBUS_FDO Fdo
     )
@@ -1015,8 +1033,11 @@ FdoReleaseMutex(
 {
     __FdoReleaseMutex(Fdo);
 
-    if (Fdo->References == 0)
+    if (Fdo->References == 0) {
+        DriverAcquireMutex();
         FdoDestroy(Fdo);
+        DriverReleaseMutex();
+    }
 }
 
 static BOOLEAN
@@ -3513,8 +3534,11 @@ done:
     --Fdo->References;
     __FdoReleaseMutex(Fdo);
 
-    if (Fdo->References == 0)
+    if (Fdo->References == 0) {
+        DriverAcquireMutex();
         FdoDestroy(Fdo);
+        DriverReleaseMutex();
+    }
 
     return status;
 }
@@ -4923,6 +4947,8 @@ done:
     Dx->Fdo = Fdo;
     FunctionDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
 
+    DriverAddFunctionDeviceObject(Fdo);
+
     return STATUS_SUCCESS;
 
 fail19:
@@ -5053,6 +5079,8 @@ FdoDestroy(
     ASSERT3U(Fdo->References, ==, 0);
     ASSERT3U(__FdoGetDevicePnpState(Fdo), ==, Deleted);
 
+    DriverRemoveFunctionDeviceObject(Fdo);
+
     Fdo->NotDisableable = FALSE;
 
     Info("%p (%s)\n",
diff --git a/src/xenbus/fdo.h b/src/xenbus/fdo.h
index 96a2250..9e9b599 100644
--- a/src/xenbus/fdo.h
+++ b/src/xenbus/fdo.h
@@ -78,6 +78,11 @@ FdoReleaseMutex(
     );
 
 extern PDEVICE_OBJECT
+FdoGetDeviceObject(
+    IN  PXENBUS_FDO Fdo
+    );
+
+extern PDEVICE_OBJECT
 FdoGetPhysicalDeviceObject(
     IN  PXENBUS_FDO Fdo
     );
diff --git a/src/xenfilt/driver.c b/src/xenfilt/driver.c
index 77f719a..84766dd 100644
--- a/src/xenfilt/driver.c
+++ b/src/xenfilt/driver.c
@@ -572,6 +572,8 @@ DriverAddDevice(
                                   DeviceID,
                                   &Type);
     if (NT_SUCCESS(status)) {
+        __DriverAcquireMutex();
+
         status = FdoCreate(PhysicalDeviceObject,
                            DeviceID,
                            InstanceID,
@@ -580,12 +582,16 @@ DriverAddDevice(
         if (!NT_SUCCESS(status))
             goto fail3;
 
+        __DriverReleaseMutex();
+
         RegistryFreeSzValue(Type);
     }
 
     return STATUS_SUCCESS;
 
 fail3:
+        __DriverReleaseMutex();
+
 fail2:
 fail1:
     return status;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 14:13:14 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 14:13:14 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIHFK-0003cY-Oe; Thu, 23 Jul 2015 14:13:14 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIHFJ-0003ba-Fd
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 14:13:13 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	B1/BA-31258-576F0B55; Thu, 23 Jul 2015 14:13:09 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1437660788!34639964!1
X-Originating-IP: [209.85.212.174]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18093 invoked from network); 23 Jul 2015 14:13:08 -0000
Received: from mail-wi0-f174.google.com (HELO mail-wi0-f174.google.com)
	(209.85.212.174)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 14:13:08 -0000
Received: by wibxm9 with SMTP id xm9so151429186wib.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 07:13:08 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=vyMSHH9X/t2nA9XVasxpmwnnpSDuy50+CvB9AOz3pLg=;
	b=pWSDji6wNSIl4UndQoYnDmIoP5t8ynA5xd84Zo5BD00BVlt8k17ZAYHqZfaQfc9QKk
	gKi/jxPTH8c/NhV9jwhI5HIFQPP2hS4hEikND1Pqb5Reo3GB8qsToS/xida8lDMSytjc
	x5HUUbuTh+yG657yeGZkSpcPPATezlHBdWi2Fna2OEnfzIfgbNncr9fQHmcsfONlSU8n
	EpSbj6KLSJNBlgrz0pouDIFOSWQXKxqnj5p6+tz5jfSj/ifmVtga83CgQgDo2ffTIq/Y
	wvkkf45OkwypniX7zh/UZ0Hf1lRMHSezauAkxryvOhWYiIWgIl34vl4iaZX1fCJjm1U9
	zp8g==
X-Received: by 10.181.25.234 with SMTP id it10mr17777898wid.0.1437660788369;
	Thu, 23 Jul 2015 07:13:08 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id h9sm7744794wjx.20.2015.07.23.07.13.07
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 07:13:07 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 15:12:50 +0100
Message-Id: <1437660773-6412-4-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
References: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 4/7] Maintain a global list of FDOs in XENBUS
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...similar to that in XENFILT.

Also add a missing mutex acquisition around FdoCreate() in XENFILT.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/driver.c  | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/xenbus/driver.h  | 18 ++++++++---
 src/xenbus/fdo.c     | 32 +++++++++++++++++--
 src/xenbus/fdo.h     |  5 +++
 src/xenfilt/driver.c |  6 ++++
 5 files changed, 141 insertions(+), 7 deletions(-)

diff --git a/src/xenbus/driver.c b/src/xenbus/driver.c
index 6135400..3409270 100644
--- a/src/xenbus/driver.c
+++ b/src/xenbus/driver.c
@@ -38,6 +38,7 @@
 #include "pdo.h"
 #include "driver.h"
 #include "names.h"
+#include "mutex.h"
 #include "dbg_print.h"
 #include "assert.h"
 #include "util.h"
@@ -49,6 +50,10 @@ typedef struct _XENBUS_DRIVER {
     PDRIVER_OBJECT      DriverObject;
     HANDLE              ParametersKey;
     HANDLE              StatusKey;
+
+    MUTEX               Mutex;
+    LIST_ENTRY          List;
+    ULONG               References;
 } XENBUS_DRIVER, *PXENBUS_DRIVER;
 
 static XENBUS_DRIVER    Driver;
@@ -149,6 +154,71 @@ DriverRequestReboot(
                                     1);
 }
 
+static FORCEINLINE VOID
+__DriverAcquireMutex(
+    VOID
+    )
+{
+    AcquireMutex(&Driver.Mutex);
+}
+
+VOID
+DriverAcquireMutex(
+    VOID
+    )
+{
+    __DriverAcquireMutex();
+}
+
+static FORCEINLINE VOID
+__DriverReleaseMutex(
+    VOID
+    )
+{
+    ReleaseMutex(&Driver.Mutex);
+}
+
+VOID
+DriverReleaseMutex(
+    VOID
+    )
+{
+    __DriverReleaseMutex();
+}
+
+VOID
+DriverAddFunctionDeviceObject(
+    IN  PXENBUS_FDO Fdo
+    )
+{
+    PDEVICE_OBJECT  DeviceObject;
+    PXENBUS_DX      Dx;
+
+    DeviceObject = FdoGetDeviceObject(Fdo);
+    Dx = (PXENBUS_DX)DeviceObject->DeviceExtension;
+    ASSERT3U(Dx->Type, ==, FUNCTION_DEVICE_OBJECT);
+
+    InsertTailList(&Driver.List, &Dx->ListEntry);
+    Driver.References++;
+}
+
+VOID
+DriverRemoveFunctionDeviceObject(
+    IN  PXENBUS_FDO Fdo
+    )
+{
+    PDEVICE_OBJECT  DeviceObject;
+    PXENBUS_DX      Dx;
+
+    DeviceObject = FdoGetDeviceObject(Fdo);
+    Dx = (PXENBUS_DX)DeviceObject->DeviceExtension;
+    ASSERT3U(Dx->Type, ==, FUNCTION_DEVICE_OBJECT);
+
+    RemoveEntryList(&Dx->ListEntry);
+    ASSERT3U(Driver.References, !=, 0);
+    --Driver.References;
+}
+
 DRIVER_UNLOAD       DriverUnload;
 
 VOID
@@ -166,6 +236,13 @@ DriverUnload(
     if (*InitSafeBootMode > 0)
         goto done;
 
+    ASSERT(IsListEmpty(&Driver.List));
+    ASSERT3U(Driver.References, ==, 1);
+    --Driver.References;
+
+    RtlZeroMemory(&Driver.List, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&Driver.Mutex, sizeof (MUTEX));
+
     StatusKey = __DriverGetStatusKey();
     __DriverSetStatusKey(NULL);
 
@@ -210,16 +287,20 @@ DriverAddDevice(
 
     Trace("====>\n");
 
+    __DriverAcquireMutex();
+
     status = FdoCreate(DeviceObject);
     if (!NT_SUCCESS(status))
         goto fail1;
 
+    __DriverReleaseMutex();
+
     Trace("<====\n");
 
     return STATUS_SUCCESS;
 
 fail1:
-    Error("fail1 (%08x)\n", status);
+    __DriverReleaseMutex();
 
     return status;
 }
@@ -352,6 +433,10 @@ DriverEntry(
        DriverObject->MajorFunction[Index] = DriverDispatch;
     }
 
+    InitializeMutex(&Driver.Mutex);
+    InitializeListHead(&Driver.List);
+    Driver.References = 1;
+
 done:
     Trace("<====\n");
 
diff --git a/src/xenbus/driver.h b/src/xenbus/driver.h
index 0208f9c..78b1b25 100644
--- a/src/xenbus/driver.h
+++ b/src/xenbus/driver.h
@@ -48,14 +48,14 @@ DriverRequestReboot(
     );
 
 extern VOID
-DriverAddFilters(
+DriverAcquireMutex(
     VOID
-    );
+     );
 
 extern VOID
-DriverRemoveFilters(
+DriverReleaseMutex(
     VOID
-    );
+     );
 
 typedef struct _XENBUS_FDO      XENBUS_FDO, *PXENBUS_FDO;
 typedef struct _XENBUS_PDO      XENBUS_PDO, *PXENBUS_PDO;
@@ -65,6 +65,16 @@ typedef struct _XENBUS_PDO      XENBUS_PDO, *PXENBUS_PDO;
 
 #define MAX_DEVICE_ID_LEN   200
 
+extern VOID
+DriverAddFunctionDeviceObject(
+    IN  PXENBUS_FDO Fdo
+    );
+
+extern VOID
+DriverRemoveFunctionDeviceObject(
+    IN  PXENBUS_FDO Fdo
+    );
+
 #pragma warning(push)
 #pragma warning(disable:4201) // nonstandard extension used : nameless struct/union
 
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 28ccb36..5d03f8c 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -250,6 +250,24 @@ __FdoGetSystemPowerState(
 }
 
 static FORCEINLINE PDEVICE_OBJECT
+__FdoGetDeviceObject(
+    IN  PXENBUS_FDO Fdo
+    )
+{
+    PXENBUS_DX      Dx = Fdo->Dx;
+
+    return Dx->DeviceObject;
+}
+
+PDEVICE_OBJECT
+FdoGetDeviceObject(
+    IN  PXENBUS_FDO Fdo
+    )
+{
+    return __FdoGetDeviceObject(Fdo);
+}
+
+static FORCEINLINE PDEVICE_OBJECT
 __FdoGetPhysicalDeviceObject(
     IN  PXENBUS_FDO Fdo
     )
@@ -1015,8 +1033,11 @@ FdoReleaseMutex(
 {
     __FdoReleaseMutex(Fdo);
 
-    if (Fdo->References == 0)
+    if (Fdo->References == 0) {
+        DriverAcquireMutex();
         FdoDestroy(Fdo);
+        DriverReleaseMutex();
+    }
 }
 
 static BOOLEAN
@@ -3513,8 +3534,11 @@ done:
     --Fdo->References;
     __FdoReleaseMutex(Fdo);
 
-    if (Fdo->References == 0)
+    if (Fdo->References == 0) {
+        DriverAcquireMutex();
         FdoDestroy(Fdo);
+        DriverReleaseMutex();
+    }
 
     return status;
 }
@@ -4923,6 +4947,8 @@ done:
     Dx->Fdo = Fdo;
     FunctionDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
 
+    DriverAddFunctionDeviceObject(Fdo);
+
     return STATUS_SUCCESS;
 
 fail19:
@@ -5053,6 +5079,8 @@ FdoDestroy(
     ASSERT3U(Fdo->References, ==, 0);
     ASSERT3U(__FdoGetDevicePnpState(Fdo), ==, Deleted);
 
+    DriverRemoveFunctionDeviceObject(Fdo);
+
     Fdo->NotDisableable = FALSE;
 
     Info("%p (%s)\n",
diff --git a/src/xenbus/fdo.h b/src/xenbus/fdo.h
index 96a2250..9e9b599 100644
--- a/src/xenbus/fdo.h
+++ b/src/xenbus/fdo.h
@@ -78,6 +78,11 @@ FdoReleaseMutex(
     );
 
 extern PDEVICE_OBJECT
+FdoGetDeviceObject(
+    IN  PXENBUS_FDO Fdo
+    );
+
+extern PDEVICE_OBJECT
 FdoGetPhysicalDeviceObject(
     IN  PXENBUS_FDO Fdo
     );
diff --git a/src/xenfilt/driver.c b/src/xenfilt/driver.c
index 77f719a..84766dd 100644
--- a/src/xenfilt/driver.c
+++ b/src/xenfilt/driver.c
@@ -572,6 +572,8 @@ DriverAddDevice(
                                   DeviceID,
                                   &Type);
     if (NT_SUCCESS(status)) {
+        __DriverAcquireMutex();
+
         status = FdoCreate(PhysicalDeviceObject,
                            DeviceID,
                            InstanceID,
@@ -580,12 +582,16 @@ DriverAddDevice(
         if (!NT_SUCCESS(status))
             goto fail3;
 
+        __DriverReleaseMutex();
+
         RegistryFreeSzValue(Type);
     }
 
     return STATUS_SUCCESS;
 
 fail3:
+        __DriverReleaseMutex();
+
 fail2:
 fail1:
     return status;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 14:13:14 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 14:13:14 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIHFK-0003cf-Pp; Thu, 23 Jul 2015 14:13:14 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIHFJ-0003cN-UM
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 14:13:14 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	8F/03-21557-976F0B55; Thu, 23 Jul 2015 14:13:13 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-3.tower-206.messagelabs.com!1437660792!15628421!1
X-Originating-IP: [209.85.212.173]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 930 invoked from network); 23 Jul 2015 14:13:12 -0000
Received: from mail-wi0-f173.google.com (HELO mail-wi0-f173.google.com)
	(209.85.212.173)
	by server-3.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 14:13:12 -0000
Received: by wicmv11 with SMTP id mv11so26015636wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 07:13:12 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=3XRlGZdLl6gJ1JdXMCWPBV7YHn9L/aizQv0Fh2MR4kg=;
	b=yMjQpQjpMN88fuXpw4OudpMuV9af2tH0MdJIIGNOSTa5We/fxjGlfRJqGjjE+XWgmC
	NO5V7fZdwN3RPdbftzQlBgnRIEj6KgZbHXVAJrBp1dzr1LYGl0vDB6DV3tsCcXLhjk8k
	kq/BtWz83vdDZqkHuHfu9pL55Pl7JJORfmX7MUhN8T1Lu43g4AORLUsmN078MsT+DHIu
	f4VGgqnvb3Llq5kpR+xmtP326x9R1ePCfs/bHRLYrxI0djnqmygJLqfYhqZFJ504zGvp
	DQpn9Wx154UCi2304KY0RuOOOSNp/nAOU8iA5ghiq2w5KFBJERAO/ApGqbO98+xqn0Bs
	nyLw==
X-Received: by 10.194.87.4 with SMTP id t4mr18008093wjz.84.1437660792251;
	Thu, 23 Jul 2015 07:13:12 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id h9sm7744794wjx.20.2015.07.23.07.13.08
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 07:13:08 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 15:12:51 +0100
Message-Id: <1437660773-6412-5-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
References: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 5/7] Install filters on first FDO creation
	and remove on last deletion
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

When XENBUS binds to two devices (as it may when the vendor PCI device
is present) then installing/removing filters on a per-FDO basis does not
work properly.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/driver.c | 13 +++++++++++--
 src/xenbus/fdo.c    |  4 ----
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/src/xenbus/driver.c b/src/xenbus/driver.c
index 3409270..46712e3 100644
--- a/src/xenbus/driver.c
+++ b/src/xenbus/driver.c
@@ -39,6 +39,7 @@
 #include "driver.h"
 #include "names.h"
 #include "mutex.h"
+#include "filters.h"
 #include "dbg_print.h"
 #include "assert.h"
 #include "util.h"
@@ -193,13 +194,17 @@ DriverAddFunctionDeviceObject(
 {
     PDEVICE_OBJECT  DeviceObject;
     PXENBUS_DX      Dx;
+    ULONG           References;
 
     DeviceObject = FdoGetDeviceObject(Fdo);
     Dx = (PXENBUS_DX)DeviceObject->DeviceExtension;
     ASSERT3U(Dx->Type, ==, FUNCTION_DEVICE_OBJECT);
 
     InsertTailList(&Driver.List, &Dx->ListEntry);
-    Driver.References++;
+    References = Driver.References++;
+
+    if (References == 1)
+        FiltersInstall();
 }
 
 VOID
@@ -209,6 +214,7 @@ DriverRemoveFunctionDeviceObject(
 {
     PDEVICE_OBJECT  DeviceObject;
     PXENBUS_DX      Dx;
+    ULONG           References;
 
     DeviceObject = FdoGetDeviceObject(Fdo);
     Dx = (PXENBUS_DX)DeviceObject->DeviceExtension;
@@ -216,7 +222,10 @@ DriverRemoveFunctionDeviceObject(
 
     RemoveEntryList(&Dx->ListEntry);
     ASSERT3U(Driver.References, !=, 0);
-    --Driver.References;
+    References = --Driver.References;
+
+    if (References == 1)
+        FiltersUninstall();
 }
 
 DRIVER_UNLOAD       DriverUnload;
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 5d03f8c..1e55381 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -59,7 +59,6 @@
 #include "driver.h"
 #include "range_set.h"
 #include "unplug.h"
-#include "filters.h"
 #include "dbg_print.h"
 #include "assert.h"
 #include "util.h"
@@ -4837,7 +4836,6 @@ FdoCreate(
         goto fail8;
 
     if (Fdo->PvdeviceInterface.Interface.Context == NULL) {
-        (VOID) FiltersInstall();
         DriverRequestReboot();
         goto done;
     }
@@ -5148,8 +5146,6 @@ FdoDestroy(
         FdoClearActive(Fdo);
     }
 
-    (VOID) FiltersUninstall();
-
     RtlZeroMemory(&Fdo->PvdeviceInterface,
                   sizeof (XENFILT_PVDEVICE_INTERFACE));
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 14:13:14 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 14:13:14 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIHFK-0003cf-Pp; Thu, 23 Jul 2015 14:13:14 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIHFJ-0003cN-UM
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 14:13:14 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	8F/03-21557-976F0B55; Thu, 23 Jul 2015 14:13:13 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-3.tower-206.messagelabs.com!1437660792!15628421!1
X-Originating-IP: [209.85.212.173]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 930 invoked from network); 23 Jul 2015 14:13:12 -0000
Received: from mail-wi0-f173.google.com (HELO mail-wi0-f173.google.com)
	(209.85.212.173)
	by server-3.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 14:13:12 -0000
Received: by wicmv11 with SMTP id mv11so26015636wic.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 07:13:12 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=3XRlGZdLl6gJ1JdXMCWPBV7YHn9L/aizQv0Fh2MR4kg=;
	b=yMjQpQjpMN88fuXpw4OudpMuV9af2tH0MdJIIGNOSTa5We/fxjGlfRJqGjjE+XWgmC
	NO5V7fZdwN3RPdbftzQlBgnRIEj6KgZbHXVAJrBp1dzr1LYGl0vDB6DV3tsCcXLhjk8k
	kq/BtWz83vdDZqkHuHfu9pL55Pl7JJORfmX7MUhN8T1Lu43g4AORLUsmN078MsT+DHIu
	f4VGgqnvb3Llq5kpR+xmtP326x9R1ePCfs/bHRLYrxI0djnqmygJLqfYhqZFJ504zGvp
	DQpn9Wx154UCi2304KY0RuOOOSNp/nAOU8iA5ghiq2w5KFBJERAO/ApGqbO98+xqn0Bs
	nyLw==
X-Received: by 10.194.87.4 with SMTP id t4mr18008093wjz.84.1437660792251;
	Thu, 23 Jul 2015 07:13:12 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id h9sm7744794wjx.20.2015.07.23.07.13.08
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 07:13:08 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 15:12:51 +0100
Message-Id: <1437660773-6412-5-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
References: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 5/7] Install filters on first FDO creation
	and remove on last deletion
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

When XENBUS binds to two devices (as it may when the vendor PCI device
is present) then installing/removing filters on a per-FDO basis does not
work properly.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/driver.c | 13 +++++++++++--
 src/xenbus/fdo.c    |  4 ----
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/src/xenbus/driver.c b/src/xenbus/driver.c
index 3409270..46712e3 100644
--- a/src/xenbus/driver.c
+++ b/src/xenbus/driver.c
@@ -39,6 +39,7 @@
 #include "driver.h"
 #include "names.h"
 #include "mutex.h"
+#include "filters.h"
 #include "dbg_print.h"
 #include "assert.h"
 #include "util.h"
@@ -193,13 +194,17 @@ DriverAddFunctionDeviceObject(
 {
     PDEVICE_OBJECT  DeviceObject;
     PXENBUS_DX      Dx;
+    ULONG           References;
 
     DeviceObject = FdoGetDeviceObject(Fdo);
     Dx = (PXENBUS_DX)DeviceObject->DeviceExtension;
     ASSERT3U(Dx->Type, ==, FUNCTION_DEVICE_OBJECT);
 
     InsertTailList(&Driver.List, &Dx->ListEntry);
-    Driver.References++;
+    References = Driver.References++;
+
+    if (References == 1)
+        FiltersInstall();
 }
 
 VOID
@@ -209,6 +214,7 @@ DriverRemoveFunctionDeviceObject(
 {
     PDEVICE_OBJECT  DeviceObject;
     PXENBUS_DX      Dx;
+    ULONG           References;
 
     DeviceObject = FdoGetDeviceObject(Fdo);
     Dx = (PXENBUS_DX)DeviceObject->DeviceExtension;
@@ -216,7 +222,10 @@ DriverRemoveFunctionDeviceObject(
 
     RemoveEntryList(&Dx->ListEntry);
     ASSERT3U(Driver.References, !=, 0);
-    --Driver.References;
+    References = --Driver.References;
+
+    if (References == 1)
+        FiltersUninstall();
 }
 
 DRIVER_UNLOAD       DriverUnload;
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 5d03f8c..1e55381 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -59,7 +59,6 @@
 #include "driver.h"
 #include "range_set.h"
 #include "unplug.h"
-#include "filters.h"
 #include "dbg_print.h"
 #include "assert.h"
 #include "util.h"
@@ -4837,7 +4836,6 @@ FdoCreate(
         goto fail8;
 
     if (Fdo->PvdeviceInterface.Interface.Context == NULL) {
-        (VOID) FiltersInstall();
         DriverRequestReboot();
         goto done;
     }
@@ -5148,8 +5146,6 @@ FdoDestroy(
         FdoClearActive(Fdo);
     }
 
-    (VOID) FiltersUninstall();
-
     RtlZeroMemory(&Fdo->PvdeviceInterface,
                   sizeof (XENFILT_PVDEVICE_INTERFACE));
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 14:13:15 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 14:13:15 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIHFL-0003dZ-SL; Thu, 23 Jul 2015 14:13:15 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIHFK-0003cN-VS
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 14:13:15 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	F2/23-21557-A76F0B55; Thu, 23 Jul 2015 14:13:14 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-8.tower-206.messagelabs.com!1437660794!23182534!1
X-Originating-IP: [209.85.212.173]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28283 invoked from network); 23 Jul 2015 14:13:14 -0000
Received: from mail-wi0-f173.google.com (HELO mail-wi0-f173.google.com)
	(209.85.212.173)
	by server-8.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 14:13:14 -0000
Received: by wibxm9 with SMTP id xm9so210459969wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 07:13:14 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=6kSy/b0f359btY9oRxn/5mY1wRJFfuf4tKRuPjPeqlE=;
	b=UHvQ/VCE/o11IV2E8ARKZkFd4BGsaHMcIhIjzcNAIXWYuvAYmJPfHheXunlVHFpcZV
	O9ROO+xIlyAFoMnMEuPYZKuXrHAqent6NMuV6whFeZYUQ0F+LMVEhCUZoouSpHvh0rKV
	B2UbXb5dDhMGYGjnO808mexrUfydckbpggfGccg9n9qdOejfcz8bXd0BTK5uGE/X08t1
	8hYaN3jCp4MxDC0QRw4ueCMoWdE4aZP6lC9gIR4eoGqKnSE0hgd/3Pk9aghNvSK5n/Ng
	Abr7N/2AqplMHLN6iwCpjmCOsIVk76UadwusylQzDHmZxt8Eoy7THjVWOcMSgB3Gg+PN
	1uxg==
X-Received: by 10.180.96.170 with SMTP id dt10mr53320279wib.42.1437660794056; 
	Thu, 23 Jul 2015 07:13:14 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id h9sm7744794wjx.20.2015.07.23.07.13.13
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 07:13:13 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 15:12:53 +0100
Message-Id: <1437660773-6412-7-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
References: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 7/7] Make sure XENFILT PDOs get moved from
	Present to Enumerated
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The code to adjust the state was mistakenly removed in a previous patch.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenfilt/fdo.c | 23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/src/xenfilt/fdo.c b/src/xenfilt/fdo.c
index 7121eb2..0c48090 100644
--- a/src/xenfilt/fdo.c
+++ b/src/xenfilt/fdo.c
@@ -535,8 +535,6 @@ FdoEnumerate(
                   Relations->Objects,
                   sizeof (PDEVICE_OBJECT) * Count);
 
-    __FdoAcquireMutex(Fdo);
-
     // Remove any PDOs that do not appear in the device list
     ListEntry = Fdo->List.Flink;
     while (ListEntry != &Fdo->List) {
@@ -561,8 +559,6 @@ FdoEnumerate(
             (VOID) FdoAddDevice(Fdo, PhysicalDeviceObject[Index]);
     }
     
-    __FdoReleaseMutex(Fdo);
-
     __FdoSetEnumerated(Fdo);
 
     __FdoFree(PhysicalDeviceObject);
@@ -1128,6 +1124,8 @@ FdoQueryDeviceRelations(
 
     LowerRelations = (PDEVICE_RELATIONS)Irp->IoStatus.Information;
 
+    __FdoAcquireMutex(Fdo);
+
     if (LowerRelations->Count != 0)
         FdoEnumerate(Fdo, LowerRelations);
 
@@ -1145,7 +1143,20 @@ FdoQueryDeviceRelations(
         goto fail3;
 
     if (State == XENFILT_FILTER_DISABLED) {
-        ASSERT3U(Count, ==, LowerRelations->Count);
+        PLIST_ENTRY ListEntry;
+
+        for (ListEntry = Fdo->List.Flink;
+             ListEntry != &Fdo->List;
+             ListEntry = ListEntry->Flink) {
+            PXENFILT_DX     Dx = CONTAINING_RECORD(ListEntry, XENFILT_DX, ListEntry);
+            PXENFILT_PDO    Pdo = Dx->Pdo;
+
+            ASSERT3U(Dx->Type, ==, PHYSICAL_DEVICE_OBJECT);
+
+            if (PdoGetDevicePnpState(Pdo) == Present)
+                PdoSetDevicePnpState(Pdo, Enumerated);
+        }
+
         RtlCopyMemory(Relations, LowerRelations, Size);
 
         Trace("%s: %d PDO(s)\n",
@@ -1164,6 +1175,8 @@ FdoQueryDeviceRelations(
                                     BusRelations);
     }
 
+    __FdoReleaseMutex(Fdo);
+
     ExFreePool(LowerRelations);
 
     Irp->IoStatus.Information = (ULONG_PTR)Relations;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 14:13:15 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 14:13:15 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIHFL-0003dZ-SL; Thu, 23 Jul 2015 14:13:15 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIHFK-0003cN-VS
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 14:13:15 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	F2/23-21557-A76F0B55; Thu, 23 Jul 2015 14:13:14 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-8.tower-206.messagelabs.com!1437660794!23182534!1
X-Originating-IP: [209.85.212.173]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28283 invoked from network); 23 Jul 2015 14:13:14 -0000
Received: from mail-wi0-f173.google.com (HELO mail-wi0-f173.google.com)
	(209.85.212.173)
	by server-8.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 14:13:14 -0000
Received: by wibxm9 with SMTP id xm9so210459969wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 07:13:14 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=6kSy/b0f359btY9oRxn/5mY1wRJFfuf4tKRuPjPeqlE=;
	b=UHvQ/VCE/o11IV2E8ARKZkFd4BGsaHMcIhIjzcNAIXWYuvAYmJPfHheXunlVHFpcZV
	O9ROO+xIlyAFoMnMEuPYZKuXrHAqent6NMuV6whFeZYUQ0F+LMVEhCUZoouSpHvh0rKV
	B2UbXb5dDhMGYGjnO808mexrUfydckbpggfGccg9n9qdOejfcz8bXd0BTK5uGE/X08t1
	8hYaN3jCp4MxDC0QRw4ueCMoWdE4aZP6lC9gIR4eoGqKnSE0hgd/3Pk9aghNvSK5n/Ng
	Abr7N/2AqplMHLN6iwCpjmCOsIVk76UadwusylQzDHmZxt8Eoy7THjVWOcMSgB3Gg+PN
	1uxg==
X-Received: by 10.180.96.170 with SMTP id dt10mr53320279wib.42.1437660794056; 
	Thu, 23 Jul 2015 07:13:14 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id h9sm7744794wjx.20.2015.07.23.07.13.13
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 07:13:13 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 15:12:53 +0100
Message-Id: <1437660773-6412-7-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
References: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 7/7] Make sure XENFILT PDOs get moved from
	Present to Enumerated
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The code to adjust the state was mistakenly removed in a previous patch.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenfilt/fdo.c | 23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/src/xenfilt/fdo.c b/src/xenfilt/fdo.c
index 7121eb2..0c48090 100644
--- a/src/xenfilt/fdo.c
+++ b/src/xenfilt/fdo.c
@@ -535,8 +535,6 @@ FdoEnumerate(
                   Relations->Objects,
                   sizeof (PDEVICE_OBJECT) * Count);
 
-    __FdoAcquireMutex(Fdo);
-
     // Remove any PDOs that do not appear in the device list
     ListEntry = Fdo->List.Flink;
     while (ListEntry != &Fdo->List) {
@@ -561,8 +559,6 @@ FdoEnumerate(
             (VOID) FdoAddDevice(Fdo, PhysicalDeviceObject[Index]);
     }
     
-    __FdoReleaseMutex(Fdo);
-
     __FdoSetEnumerated(Fdo);
 
     __FdoFree(PhysicalDeviceObject);
@@ -1128,6 +1124,8 @@ FdoQueryDeviceRelations(
 
     LowerRelations = (PDEVICE_RELATIONS)Irp->IoStatus.Information;
 
+    __FdoAcquireMutex(Fdo);
+
     if (LowerRelations->Count != 0)
         FdoEnumerate(Fdo, LowerRelations);
 
@@ -1145,7 +1143,20 @@ FdoQueryDeviceRelations(
         goto fail3;
 
     if (State == XENFILT_FILTER_DISABLED) {
-        ASSERT3U(Count, ==, LowerRelations->Count);
+        PLIST_ENTRY ListEntry;
+
+        for (ListEntry = Fdo->List.Flink;
+             ListEntry != &Fdo->List;
+             ListEntry = ListEntry->Flink) {
+            PXENFILT_DX     Dx = CONTAINING_RECORD(ListEntry, XENFILT_DX, ListEntry);
+            PXENFILT_PDO    Pdo = Dx->Pdo;
+
+            ASSERT3U(Dx->Type, ==, PHYSICAL_DEVICE_OBJECT);
+
+            if (PdoGetDevicePnpState(Pdo) == Present)
+                PdoSetDevicePnpState(Pdo, Enumerated);
+        }
+
         RtlCopyMemory(Relations, LowerRelations, Size);
 
         Trace("%s: %d PDO(s)\n",
@@ -1164,6 +1175,8 @@ FdoQueryDeviceRelations(
                                     BusRelations);
     }
 
+    __FdoReleaseMutex(Fdo);
+
     ExFreePool(LowerRelations);
 
     Irp->IoStatus.Information = (ULONG_PTR)Relations;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 14:13:18 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 14:13:18 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIHFO-0003eX-9X; Thu, 23 Jul 2015 14:13:18 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIHFM-0003cN-EC
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 14:13:16 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	72/33-21557-C76F0B55; Thu, 23 Jul 2015 14:13:16 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-206.messagelabs.com!1437660793!23176948!1
X-Originating-IP: [209.85.212.170]
X-SpamReason: No, hits=0.2 required=7.0 tests=UPPERCASE_50_75
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10761 invoked from network); 23 Jul 2015 14:13:13 -0000
Received: from mail-wi0-f170.google.com (HELO mail-wi0-f170.google.com)
	(209.85.212.170)
	by server-12.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 14:13:13 -0000
Received: by wibxm9 with SMTP id xm9so210459476wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 07:13:13 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=eJkhInd+LSx10UV/CJTfqG1zgY7Mlm5CoGlW7cLzNr4=;
	b=JkIXhwOynq2wo6dhOTPnLVyrjD7L9/VzqhcjZriDECzAJJKOyPCgXm28nlSSEJIdj/
	e/AgufFekGPM/r+r6glxQykNWZjGF3lWO32onGKeuIQAO6KK0fBqhurRE1/VrA6YvYvD
	OGodCJUwxxL6CFQ1rEvqwhrAMmlOSh//LHpsqU4GWkDlo5T3zmvFZCEjatc2ujAa6UsY
	GsCt03hz2DfiFG1qG0KdGD3mxk1uYX2SXgWfUe5Ww2wVTxqlk6481vTyXHEzq/HQjmuW
	GfLkQ9d8nTYdx9gRA4+G6NZxrDL+PTUJ7RcucvngbXvYyQhQobKAcZpLuHoslMKc8ifW
	ri+Q==
X-Received: by 10.194.58.7 with SMTP id m7mr15774299wjq.109.1437660793275;
	Thu, 23 Jul 2015 07:13:13 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id h9sm7744794wjx.20.2015.07.23.07.13.12
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 07:13:12 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 15:12:52 +0100
Message-Id: <1437660773-6412-6-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
References: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 6/7] Don't mess with default DbgPrint filters
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/common/dbg_print.h | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/src/common/dbg_print.h b/src/common/dbg_print.h
index 58fa8ba..0c21785 100644
--- a/src/common/dbg_print.h
+++ b/src/common/dbg_print.h
@@ -151,13 +151,6 @@ __DbgPrintEnable(
     DBG_PRINT_ENABLE_FILTER(DPFLTR_IHVDRIVER_ID, DPFLTR_WARNING_LEVEL);
     DBG_PRINT_ENABLE_FILTER(DPFLTR_IHVDRIVER_ID, DPFLTR_TRACE_LEVEL);
     DBG_PRINT_ENABLE_FILTER(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL);
-
-#if DBG
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_DEFAULT_ID, DPFLTR_ERROR_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_DEFAULT_ID, DPFLTR_WARNING_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_DEFAULT_ID, DPFLTR_TRACE_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_DEFAULT_ID, DPFLTR_INFO_LEVEL);
-#endif // DBG
 }
 
 #endif  // _COMMON_DBG_PRINT_H
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 14:13:18 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 14:13:18 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIHFO-0003eX-9X; Thu, 23 Jul 2015 14:13:18 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIHFM-0003cN-EC
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 14:13:16 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	72/33-21557-C76F0B55; Thu, 23 Jul 2015 14:13:16 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-12.tower-206.messagelabs.com!1437660793!23176948!1
X-Originating-IP: [209.85.212.170]
X-SpamReason: No, hits=0.2 required=7.0 tests=UPPERCASE_50_75
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10761 invoked from network); 23 Jul 2015 14:13:13 -0000
Received: from mail-wi0-f170.google.com (HELO mail-wi0-f170.google.com)
	(209.85.212.170)
	by server-12.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 14:13:13 -0000
Received: by wibxm9 with SMTP id xm9so210459476wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 07:13:13 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=eJkhInd+LSx10UV/CJTfqG1zgY7Mlm5CoGlW7cLzNr4=;
	b=JkIXhwOynq2wo6dhOTPnLVyrjD7L9/VzqhcjZriDECzAJJKOyPCgXm28nlSSEJIdj/
	e/AgufFekGPM/r+r6glxQykNWZjGF3lWO32onGKeuIQAO6KK0fBqhurRE1/VrA6YvYvD
	OGodCJUwxxL6CFQ1rEvqwhrAMmlOSh//LHpsqU4GWkDlo5T3zmvFZCEjatc2ujAa6UsY
	GsCt03hz2DfiFG1qG0KdGD3mxk1uYX2SXgWfUe5Ww2wVTxqlk6481vTyXHEzq/HQjmuW
	GfLkQ9d8nTYdx9gRA4+G6NZxrDL+PTUJ7RcucvngbXvYyQhQobKAcZpLuHoslMKc8ifW
	ri+Q==
X-Received: by 10.194.58.7 with SMTP id m7mr15774299wjq.109.1437660793275;
	Thu, 23 Jul 2015 07:13:13 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id h9sm7744794wjx.20.2015.07.23.07.13.12
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 07:13:12 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 15:12:52 +0100
Message-Id: <1437660773-6412-6-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
References: <1437660773-6412-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 6/7] Don't mess with default DbgPrint filters
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/common/dbg_print.h | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/src/common/dbg_print.h b/src/common/dbg_print.h
index 58fa8ba..0c21785 100644
--- a/src/common/dbg_print.h
+++ b/src/common/dbg_print.h
@@ -151,13 +151,6 @@ __DbgPrintEnable(
     DBG_PRINT_ENABLE_FILTER(DPFLTR_IHVDRIVER_ID, DPFLTR_WARNING_LEVEL);
     DBG_PRINT_ENABLE_FILTER(DPFLTR_IHVDRIVER_ID, DPFLTR_TRACE_LEVEL);
     DBG_PRINT_ENABLE_FILTER(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL);
-
-#if DBG
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_DEFAULT_ID, DPFLTR_ERROR_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_DEFAULT_ID, DPFLTR_WARNING_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_DEFAULT_ID, DPFLTR_TRACE_LEVEL);
-    DBG_PRINT_ENABLE_FILTER(DPFLTR_DEFAULT_ID, DPFLTR_INFO_LEVEL);
-#endif // DBG
 }
 
 #endif  // _COMMON_DBG_PRINT_H
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 15:39:55 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 15:39:55 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIIbC-0007uX-Qq; Thu, 23 Jul 2015 15:39:54 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIIbC-0007uB-C6
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 15:39:54 +0000
Received: from [193.109.254.147] by server-5.bemta-14.messagelabs.com id
	85/6F-29123-9CA01B55; Thu, 23 Jul 2015 15:39:53 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1437665993!34701024!1
X-Originating-IP: [209.85.212.169]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17956 invoked from network); 23 Jul 2015 15:39:53 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 15:39:53 -0000
Received: by wibud3 with SMTP id ud3so225156817wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 08:39:52 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=6f9T+elE/Xs1yQIHJOI8oegq8tlbmXsYiCVuFytifx0=;
	b=Wf9V37wtFPBb8O2tRWbqecQd4Uav30kBKWeVrFZD0JRwVXhwIQNwWXPQDPjJN1Gcmn
	gODi+6Wk1djRJEc0RrsBXabkHQai3jSezzyr9WILN7xTidnJPSuQue8cdi5kSIFopojB
	seAISbOUD+5D3U00ccikeZMdrEE+ETtNwxPnFQBDGp6dCDfRtMf6zVTvemWzFIaZeltf
	OkatydRcmkV8QfokfBlKZtzpeusdaGMhNaWHO2gSmXUpayPgRpxzpNm+O0CVXi2gSFFd
	e9+hus+BExZRFpzsKWfOxARCUvTacw27O5G3e+ltO7ytZWoTe7n49Gg6KDHryfFxmdRl
	y/uA==
X-Received: by 10.194.62.211 with SMTP id a19mr16383424wjs.126.1437665992765; 
	Thu, 23 Jul 2015 08:39:52 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	gw7sm27776817wib.15.2015.07.23.08.39.50
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 08:39:52 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 16:39:46 +0100
Message-Id: <1437665986-10196-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Only the active device should unplug
	emulated devices
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...and populate the hypercall table.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/fdo.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 1e55381..9eb20e7 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -2985,10 +2985,14 @@ FdoS4ToS3(
 
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
+    if (!__FdoIsActive(Fdo))
+        goto not_active;
+
     HypercallPopulate();
 
     UnplugDevices();
 
+not_active:
     KeLowerIrql(Irql);
 
     __FdoSetSystemPowerState(Fdo, PowerSystemSleeping3);
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 15:39:55 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 15:39:55 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIIbC-0007uX-Qq; Thu, 23 Jul 2015 15:39:54 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIIbC-0007uB-C6
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 15:39:54 +0000
Received: from [193.109.254.147] by server-5.bemta-14.messagelabs.com id
	85/6F-29123-9CA01B55; Thu, 23 Jul 2015 15:39:53 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1437665993!34701024!1
X-Originating-IP: [209.85.212.169]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17956 invoked from network); 23 Jul 2015 15:39:53 -0000
Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com)
	(209.85.212.169)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 15:39:53 -0000
Received: by wibud3 with SMTP id ud3so225156817wib.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 08:39:52 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=6f9T+elE/Xs1yQIHJOI8oegq8tlbmXsYiCVuFytifx0=;
	b=Wf9V37wtFPBb8O2tRWbqecQd4Uav30kBKWeVrFZD0JRwVXhwIQNwWXPQDPjJN1Gcmn
	gODi+6Wk1djRJEc0RrsBXabkHQai3jSezzyr9WILN7xTidnJPSuQue8cdi5kSIFopojB
	seAISbOUD+5D3U00ccikeZMdrEE+ETtNwxPnFQBDGp6dCDfRtMf6zVTvemWzFIaZeltf
	OkatydRcmkV8QfokfBlKZtzpeusdaGMhNaWHO2gSmXUpayPgRpxzpNm+O0CVXi2gSFFd
	e9+hus+BExZRFpzsKWfOxARCUvTacw27O5G3e+ltO7ytZWoTe7n49Gg6KDHryfFxmdRl
	y/uA==
X-Received: by 10.194.62.211 with SMTP id a19mr16383424wjs.126.1437665992765; 
	Thu, 23 Jul 2015 08:39:52 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	gw7sm27776817wib.15.2015.07.23.08.39.50
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 08:39:52 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 16:39:46 +0100
Message-Id: <1437665986-10196-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Only the active device should unplug
	emulated devices
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...and populate the hypercall table.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/fdo.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 1e55381..9eb20e7 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -2985,10 +2985,14 @@ FdoS4ToS3(
 
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
+    if (!__FdoIsActive(Fdo))
+        goto not_active;
+
     HypercallPopulate();
 
     UnplugDevices();
 
+not_active:
     KeLowerIrql(Irql);
 
     __FdoSetSystemPowerState(Fdo, PowerSystemSleeping3);
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 16:21:43 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 16:21:43 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIJFe-0006ND-PS; Thu, 23 Jul 2015 16:21:42 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIJFd-0006MO-Bs
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 16:21:41 +0000
Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id
	78/06-21947-49411B55; Thu, 23 Jul 2015 16:21:40 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-5.tower-206.messagelabs.com!1437668500!23214578!1
X-Originating-IP: [209.85.212.182]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21461 invoked from network); 23 Jul 2015 16:21:40 -0000
Received: from mail-wi0-f182.google.com (HELO mail-wi0-f182.google.com)
	(209.85.212.182)
	by server-5.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 16:21:40 -0000
Received: by wicgb10 with SMTP id gb10so150498034wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 09:21:40 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=v1ms75H5pMgwrSxaKz0W/tywFvyUyC9JlEj+yxXNzlk=;
	b=SOUZEOmOugD91Apv0n/rA7pQ2bZtzL3nv138ZvLU94+roImRtYvTHhjres98gWXSsS
	QKVNRSPrgSwLlpJy+ALF3bb6whVAT5uD5ki0KQn6lxe8kZkrN6ihEQOFDRmgj1UCDfhA
	/8C2z4zQ6rthlKzuWoV8YY9SPqKHSBbwRh9gHdePTGQnqDWTa7FAZ1zga8yRYxXOJVLx
	0Yv+V4xXNq4FHx8LyDPmby9E7dEYVCKXOkt7xTrzEMG8JzjNfdp0G7u6InY9vEvmj2Hi
	eFQIgEvLfOgbMneDl69IVrdvCdaboyuxA/Y9cko11BvCz5Svx75gzSLvo2aNyDjtQl0k
	UhhA==
X-Received: by 10.180.77.107 with SMTP id r11mr18515999wiw.74.1437668499933;
	Thu, 23 Jul 2015 09:21:39 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id i6sm7685527wjf.29.2015.07.23.09.21.38
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 09:21:39 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 17:21:32 +0100
Message-Id: <1437668492-9552-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Don't trust the integrity of the shared
	rings after migration
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/transmitter.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index b833ab6..a915d73 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -1949,7 +1949,9 @@ __TransmitterRingFakeResponses(
 
     KeMemoryBarrier();
 
-    rsp_prod = Ring->Shared->rsp_prod;
+    // We can't trust anything in the shared ring
+    SHARED_RING_INIT(Ring->Shared);
+    rsp_prod = Ring->Front.rsp_cons;
 
     KeMemoryBarrier();
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Jul 23 16:21:43 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 23 Jul 2015 16:21:43 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIJFe-0006ND-PS; Thu, 23 Jul 2015 16:21:42 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1ZIJFd-0006MO-Bs
	for win-pv-devel@lists.xenproject.org; Thu, 23 Jul 2015 16:21:41 +0000
Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id
	78/06-21947-49411B55; Thu, 23 Jul 2015 16:21:40 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-5.tower-206.messagelabs.com!1437668500!23214578!1
X-Originating-IP: [209.85.212.182]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21461 invoked from network); 23 Jul 2015 16:21:40 -0000
Received: from mail-wi0-f182.google.com (HELO mail-wi0-f182.google.com)
	(209.85.212.182)
	by server-5.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Jul 2015 16:21:40 -0000
Received: by wicgb10 with SMTP id gb10so150498034wic.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 23 Jul 2015 09:21:40 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=v1ms75H5pMgwrSxaKz0W/tywFvyUyC9JlEj+yxXNzlk=;
	b=SOUZEOmOugD91Apv0n/rA7pQ2bZtzL3nv138ZvLU94+roImRtYvTHhjres98gWXSsS
	QKVNRSPrgSwLlpJy+ALF3bb6whVAT5uD5ki0KQn6lxe8kZkrN6ihEQOFDRmgj1UCDfhA
	/8C2z4zQ6rthlKzuWoV8YY9SPqKHSBbwRh9gHdePTGQnqDWTa7FAZ1zga8yRYxXOJVLx
	0Yv+V4xXNq4FHx8LyDPmby9E7dEYVCKXOkt7xTrzEMG8JzjNfdp0G7u6InY9vEvmj2Hi
	eFQIgEvLfOgbMneDl69IVrdvCdaboyuxA/Y9cko11BvCz5Svx75gzSLvo2aNyDjtQl0k
	UhhA==
X-Received: by 10.180.77.107 with SMTP id r11mr18515999wiw.74.1437668499933;
	Thu, 23 Jul 2015 09:21:39 -0700 (PDT)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id i6sm7685527wjf.29.2015.07.23.09.21.38
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 23 Jul 2015 09:21:39 -0700 (PDT)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 23 Jul 2015 17:21:32 +0100
Message-Id: <1437668492-9552-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Don't trust the integrity of the shared
	rings after migration
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/transmitter.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index b833ab6..a915d73 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -1949,7 +1949,9 @@ __TransmitterRingFakeResponses(
 
     KeMemoryBarrier();
 
-    rsp_prod = Ring->Shared->rsp_prod;
+    // We can't trust anything in the shared ring
+    SHARED_RING_INIT(Ring->Shared);
+    rsp_prod = Ring->Front.rsp_cons;
 
     KeMemoryBarrier();
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Jul 24 11:23:47 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 24 Jul 2015 11:23:47 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIb4s-0004L2-DD; Fri, 24 Jul 2015 11:23:46 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=640518913=Paul.Durrant@citrix.com>)
	id 1ZIb4r-0004Kx-5m
	for win-pv-devel@lists.xenproject.org; Fri, 24 Jul 2015 11:23:45 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	86/40-27535-04022B55; Fri, 24 Jul 2015 11:23:44 +0000
X-Env-Sender: prvs=640518913=Paul.Durrant@citrix.com
X-Msg-Ref: server-11.tower-206.messagelabs.com!1437737023!19287738!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12979 invoked from network); 24 Jul 2015 11:23:44 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-11.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Jul 2015 11:23:44 -0000
X-IronPort-AV: E=Sophos;i="5.15,538,1432598400"; 
   d="scan'208";a="1545843"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: Proposal to change driver versions to 8.1.0
Thread-Index: AdDGAodpe1rUyZ1FTYymcJK/jL3H4Q==
Date: Fri, 24 Jul 2015 11:23:38 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4D3C9B@AMSPEX01CL02.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: [win-pv-devel] Proposal to change driver versions to 8.1.0
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

All,

  Introducing the new(er) PDO revisioning scheme and trying to reduce the reliance on co-installers has meant several incompatible changes have been made to the drivers in the last few weeks. To reflect this I think the minor version number should be bumped, so I proposed aligning all drivers at version 8.1.0.
  At Citrix we've been running the latest code through the HCK and HLK and feel that we are pretty close to having a set that passes all logo tests. I'll therefore be thinking about cutting the first release of Xen Project drivers (and what that means logistically) in the next few weeks - which should also hopefully align fairly well with the release of Xen 4.6.

  Paul

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Jul 24 11:23:47 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 24 Jul 2015 11:23:47 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZIb4s-0004L2-DD; Fri, 24 Jul 2015 11:23:46 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=640518913=Paul.Durrant@citrix.com>)
	id 1ZIb4r-0004Kx-5m
	for win-pv-devel@lists.xenproject.org; Fri, 24 Jul 2015 11:23:45 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	86/40-27535-04022B55; Fri, 24 Jul 2015 11:23:44 +0000
X-Env-Sender: prvs=640518913=Paul.Durrant@citrix.com
X-Msg-Ref: server-11.tower-206.messagelabs.com!1437737023!19287738!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12979 invoked from network); 24 Jul 2015 11:23:44 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-11.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Jul 2015 11:23:44 -0000
X-IronPort-AV: E=Sophos;i="5.15,538,1432598400"; 
   d="scan'208";a="1545843"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: Proposal to change driver versions to 8.1.0
Thread-Index: AdDGAodpe1rUyZ1FTYymcJK/jL3H4Q==
Date: Fri, 24 Jul 2015 11:23:38 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F4D3C9B@AMSPEX01CL02.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: [win-pv-devel] Proposal to change driver versions to 8.1.0
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

All,

  Introducing the new(er) PDO revisioning scheme and trying to reduce the reliance on co-installers has meant several incompatible changes have been made to the drivers in the last few weeks. To reflect this I think the minor version number should be bumped, so I proposed aligning all drivers at version 8.1.0.
  At Citrix we've been running the latest code through the HCK and HLK and feel that we are pretty close to having a set that passes all logo tests. I'll therefore be thinking about cutting the first release of Xen Project drivers (and what that means logistically) in the next few weeks - which should also hopefully align fairly well with the release of Xen 4.6.

  Paul

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 27 08:59:35 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 27 Jul 2015 08:59:35 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZJeFy-0003Ht-Vt; Mon, 27 Jul 2015 08:59:34 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=643bd907e=owen.smith@citrix.com>)
	id 1ZJeFy-0003Ho-0L
	for win-pv-devel@lists.xenproject.org; Mon, 27 Jul 2015 08:59:34 +0000
Received: from [85.158.137.68] by server-7.bemta-3.messagelabs.com id
	E0/11-06457-5F2F5B55; Mon, 27 Jul 2015 08:59:33 +0000
X-Env-Sender: prvs=643bd907e=owen.smith@citrix.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1437987571!29569086!1
X-Originating-IP: [66.165.176.63]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16651 invoked from network); 27 Jul 2015 08:59:32 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-3.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Jul 2015 08:59:32 -0000
X-IronPort-AV: E=Sophos;i="5.15,552,1432598400"; d="scan'208";a="287831118"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Mon, 27 Jul 2015 09:59:23 +0100
Message-ID: <1437987563-1440-1-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH] Force SectorSize to 512
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Bad things happen when the backend tries to indicate 4k sectors.
4k sectors will not fit into the block protocol, and some backends
pass sector-size as 4k, but the sector count in 512b. Force sector
size to 512, and warn when the backend is attempring to use 4k
sectors.

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xendisk/pdo.c     | 4 ++++
 src/xenvbd/frontend.c | 5 +++--
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/xendisk/pdo.c b/src/xendisk/pdo.c
index 07f4cfd..d927834 100644
--- a/src/xendisk/pdo.c
+++ b/src/xendisk/pdo.c
@@ -348,6 +348,10 @@ __PdoQueryProperty(
 
     Descriptor = Irp->AssociatedIrp.SystemBuffer;
     Pdo->SectorSize = Descriptor->BytesPerLogicalSector;
+    if (Pdo->SectorSize != 512) {
+        Error("%p : %u bytes per sector is invalid\n", Pdo->Dx->DeviceObject, Pdo->SectorSize);
+        Pdo->SectorSize = 512;
+    }
     Verbose("%p : %u bytes per sector\n", Pdo->Dx->DeviceObject, Pdo->SectorSize);
 
 done:
diff --git a/src/xenvbd/frontend.c b/src/xenvbd/frontend.c
index 94e7f5b..85a03f8 100644
--- a/src/xenvbd/frontend.c
+++ b/src/xenvbd/frontend.c
@@ -749,8 +749,9 @@ __ReadDiskInfo(
     if (Frontend->DiskInfo.DiskInfo & VDISK_CDROM) {
         Warning("Target[%d] : DiskInfo contains VDISK_CDROM flag!\n", Frontend->TargetId);
     }
-    if (Frontend->DiskInfo.SectorSize == 0) {
-        Error("Target[%d] : Invalid SectorSize!\n", Frontend->TargetId);
+    if (Frontend->DiskInfo.SectorSize != 512) {
+        Error("Target[%d] : Invalid SectorSize (%u)!\n", Frontend->TargetId, Frontend->DiskInfo.SectorSize);
+        Frontend->DiskInfo.SectorSize = 512;
     }
     if (Frontend->DiskInfo.SectorCount == 0) {
         Error("Target[%d] : Invalid SectorCount!\n", Frontend->TargetId);
-- 
1.9.4.msysgit.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Jul 27 08:59:35 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 27 Jul 2015 08:59:35 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1ZJeFy-0003Ht-Vt; Mon, 27 Jul 2015 08:59:34 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=643bd907e=owen.smith@citrix.com>)
	id 1ZJeFy-0003Ho-0L
	for win-pv-devel@lists.xenproject.org; Mon, 27 Jul 2015 08:59:34 +0000
Received: from [85.158.137.68] by server-7.bemta-3.messagelabs.com id
	E0/11-06457-5F2F5B55; Mon, 27 Jul 2015 08:59:33 +0000
X-Env-Sender: prvs=643bd907e=owen.smith@citrix.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1437987571!29569086!1
X-Originating-IP: [66.165.176.63]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 6.13.16; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16651 invoked from network); 27 Jul 2015 08:59:32 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-3.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Jul 2015 08:59:32 -0000
X-IronPort-AV: E=Sophos;i="5.15,552,1432598400"; d="scan'208";a="287831118"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Mon, 27 Jul 2015 09:59:23 +0100
Message-ID: <1437987563-1440-1-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH] Force SectorSize to 512
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Bad things happen when the backend tries to indicate 4k sectors.
4k sectors will not fit into the block protocol, and some backends
pass sector-size as 4k, but the sector count in 512b. Force sector
size to 512, and warn when the backend is attempring to use 4k
sectors.

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xendisk/pdo.c     | 4 ++++
 src/xenvbd/frontend.c | 5 +++--
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/xendisk/pdo.c b/src/xendisk/pdo.c
index 07f4cfd..d927834 100644
--- a/src/xendisk/pdo.c
+++ b/src/xendisk/pdo.c
@@ -348,6 +348,10 @@ __PdoQueryProperty(
 
     Descriptor = Irp->AssociatedIrp.SystemBuffer;
     Pdo->SectorSize = Descriptor->BytesPerLogicalSector;
+    if (Pdo->SectorSize != 512) {
+        Error("%p : %u bytes per sector is invalid\n", Pdo->Dx->DeviceObject, Pdo->SectorSize);
+        Pdo->SectorSize = 512;
+    }
     Verbose("%p : %u bytes per sector\n", Pdo->Dx->DeviceObject, Pdo->SectorSize);
 
 done:
diff --git a/src/xenvbd/frontend.c b/src/xenvbd/frontend.c
index 94e7f5b..85a03f8 100644
--- a/src/xenvbd/frontend.c
+++ b/src/xenvbd/frontend.c
@@ -749,8 +749,9 @@ __ReadDiskInfo(
     if (Frontend->DiskInfo.DiskInfo & VDISK_CDROM) {
         Warning("Target[%d] : DiskInfo contains VDISK_CDROM flag!\n", Frontend->TargetId);
     }
-    if (Frontend->DiskInfo.SectorSize == 0) {
-        Error("Target[%d] : Invalid SectorSize!\n", Frontend->TargetId);
+    if (Frontend->DiskInfo.SectorSize != 512) {
+        Error("Target[%d] : Invalid SectorSize (%u)!\n", Frontend->TargetId, Frontend->DiskInfo.SectorSize);
+        Frontend->DiskInfo.SectorSize = 512;
     }
     if (Frontend->DiskInfo.SectorCount == 0) {
         Error("Target[%d] : Invalid SectorCount!\n", Frontend->TargetId);
-- 
1.9.4.msysgit.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

